不同长度序列列表的分析

问题描述 投票:0回答:2

我有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,如果可以,如何创建矩阵?

python scikit-learn data-science cluster-analysis
2个回答
0
投票

是的,您可以利用 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 或任何其他聚类算法来查找聚类。


0
投票

网上有几种方法,但我更熟悉的是DTW:动态时间扭曲。

  1. 计算序列的每对之间的DTW距离,以创建一个距离矩阵
  2. 分层聚类算法中使用距离矩阵识别相似序列的聚类
这是代码:

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()
    
© www.soinside.com 2019 - 2024. All rights reserved.