我有1000个列表如下:
[[6, 7, 7, 5, 5, 5, 7, 6, 7, 5, 6, 5],
[7, 7, 7, 5, 5, 6, 6, 7, 7, 7, 7, 6, 5],
[7, 7, 5, 6, 6, 5, 5, 7, 6, 6, 6, 5, 7, 5],
[6, 5, 7, 7, 6, 5, 7, 5, 7, 6, 7, 7],
[6, 5, 5, 6, 6, 5, 7, 7, 5, 7, 7, 6, 7],
[7, 7, 7, 6, 5, 7, 7, 7, 7, 7, 7, 5, 5, 6],
[6, 5, 6, 6, 7, 6, 7, 6, 6, 5, 5, 5],
[6, 5, 7, 5, 5, 7, 7, 5, 6, 6, 6, 5, 6],
[6, 7, 6, 6, 7, 5, 7, 6, 6, 6, 5, 7, 7],
[6, 5, 7, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7],
[6, 6, 5, 7, 5, 6, 5, 7, 6, 7, 5, 5, 7],
[7, 7, 6, 6, 6, 5, 7, 7, 6, 7, 6, 6, 7],
[5, 6, 6, 5, 5, 7, 6, 6, 6, 7, 6, 7, 6, 7],
[7, 6, 6, 6, 5, 5, 6, 5, 7, 7, 7, 6, 6],...]
列表的长度范围为 12、13 和 14。我想对所有列表进行一些分析,以找到它们之间的共同模式。
对这些列表可以进行什么样的分析?
每个列表中的数字确实是一个数字序列(其中数字的顺序很重要),例如,下面两个列表中的前三个元素是相同的,但序列中的其他元素不同,并且序列的长度列表也不同。
[7, 7, 7, 5, 5, 6, 6, 7, 7, 7, 7, 6, 5],
[7, 7, 7, 6, 5, 7, 7, 7, 7, 7, 7, 5, 5, 6],
我需要的是找到相似行为/序列的集群。你知道我是否可以继续使用 KMeans,如果可以,如何创建矩阵?
是的,您可以利用 KMeans 等聚类方法在列表列表中查找相似序列的聚类。然而,您必须首先准备列表列表,以便在使用 KMeans 之前将其用于聚类。利用相似性矩阵就是这样的策略之一。
您必须对齐序列,因为它们的长度可能不同。动态时间扭曲 (DTW) 是一种衡量不同长度的两个时间序列之间相似性的方法,是对齐它们的一种方法。 从比对序列中提取特征。这些特征可以是统计度量,例如平均值、标准差,也可以直接使用序列。 根据提取的特征计算相似度矩阵。矩阵的每个元素 (i, j) 代表序列 i 和 j 之间的相似度。
from sklearn.metrics import pairwise_distances
# Sample list of lists
data = [[6, 7, 7, 5, 5, 5, 7, 6, 7, 5, 6, 5],
[7, 7, 7, 5, 5, 6, 6, 7, 7, 7, 7, 6, 5],
[7, 7, 5, 6, 6, 5, 5, 7, 6, 6, 6, 5, 7, 5],
# ... more lists
]
# Calculate pairwise distances (similarity) between sequences
similarity_matrix = pairwise_distances(data, metric='euclidean')
print(similarity_matrix)
这将为您提供一个矩阵,其中每个元素代表两个序列之间的相似性。一旦有了这个矩阵,您就可以应用 KMeans 或任何其他聚类算法来查找聚类。
网上有几种方法,但我更熟悉的是DTW:动态时间扭曲。
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
from dtaidistance import dtw
import matplotlib.pyplot as plt
sequences = [
[6, 7, 7, 5, 5, 5, 7, 6, 7, 5, 6, 5],
[7, 7, 7, 5, 5, 6, 6, 7, 7, 7, 7, 6, 5],
[7, 7, 5, 6, 6, 5, 5, 7, 6, 6, 6, 5, 7, 5],
[6, 5, 7, 7, 6, 5, 7, 5, 7, 6, 7, 7],
[6, 5, 5, 6, 6, 5, 7, 7, 5, 7, 7, 6, 7],
[7, 7, 7, 6, 5, 7, 7, 7, 7, 7, 7, 5, 5, 6],
[6, 5, 6, 6, 7, 6, 7, 6, 6, 5, 5, 5],
[6, 5, 7, 5, 5, 7, 7, 5, 6, 6, 6, 5, 6],
[6, 7, 6, 6, 7, 5, 7, 6, 6, 6, 5, 7, 7],
[6, 5, 7, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7],
[6, 6, 5, 7, 5, 6, 5, 7, 6, 7, 5, 5, 7],
[7, 7, 6, 6, 6, 5, 7, 7, 6, 7, 6, 6, 7],
[5, 6, 6, 5, 5, 7, 6, 6, 6, 7, 6, 7, 6, 7],
[7, 6, 6, 6, 5, 5, 6, 5, 7, 7, 7, 6, 6]
]
ds = dtw.distance_matrix_fast(sequences, use_pruning = True)
Z = linkage(ds, method='ward')
plt.figure(figsize=(10, 7))
dendrogram(Z, labels=[f"Sequence {i+1}" for i in range(len(sequences))])
plt.title('Hierarchical clustering dendrogram')
plt.xlabel('Sequence')
plt.ylabel('Distance')
plt.show()