不同长度数据的聚类序列

机器算法验证 聚类 matlab k-均值 顺序模式挖掘
2022-04-08 16:38:14

我需要对具有不同长度的数据序列进行聚类。

我正在使用 Matlab,我的第一个问题与方法有关。

KMeans 是否足以实现这一目标?

IN KMeans 我必须使用以下命令对存储在矩阵 A 中的一组数据进行聚类

 [IDX1,E] = kmeans(A,5);

所以,我的第二个问题与我不知道如何为我的案例创建矩阵这一事实有关。

我的数据具有以下格式:

1 15 1 1 13 14;
1 1 1 1 12 1 7 11 9 11 7 11 7 11 7 4 7 7 14 15 9 2;
13 1 13 15 13 2 9 2 9 2 2 2 2 2 2 2;
1 2 9 1 6 10 6 1 6 10 14 3 10;

假设每一行属于不同的用户。我需要的是找到类似行为/序列的集群。你知道我是否可以继续使用 KMeans,如果可以,如何创建矩阵?

3个回答

一种方法(在许多其他方法中)是将序列的元素视为一个单词。换句话说,如果您假设您的列表是一个句子,那么您可以提取 ngram。

import nltk
from nltk import ngrams
a = [1, 15, 1, 1, 13, 14]
b = [1, 1, 1, 1, 12, 1, 7, 11, 9, 11, 7, 11, 7, 11, 7, 4, 7, 7, 14, 15, 9, 2]
c = [13, 1, 13, 15, 13, 2, 9, 2, 9, 2, 2, 2, 2, 2, 2, 2]
d = [1, 2, 9, 1, 6, 10, 6, 1, 6, 10, 14, 3, 10]

bb = list()
bb.append(str(','.join(str(e) for e in ['x' + str(e) for e in a])))
bb.append(str(','.join(str(e) for e in ['x' + str(e) for e in b])))
bb.append(str(','.join(str(e) for e in ['x' + str(e) for e in c])))
bb.append(str(','.join(str(e) for e in ['x' + str(e) for e in d])))

我添加了x, 因为似乎CountVectorizer忽略了单个数字/字母。让我们进行字数统计 - 或者您也可以继续使用ngrams (在此处阅读 sklearn 文档

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(bb)
X.toarray()

输出看起来像这样

array([[3, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [5, 0, 4, 1, 0, 1, 1, 1, 0, 1, 0, 6, 2],
       [1, 0, 0, 0, 3, 0, 1, 9, 0, 0, 0, 0, 2],
       [3, 3, 0, 0, 0, 1, 0, 1, 1, 0, 3, 0, 1]])

基本上列对应的词是

print(vectorizer.get_feature_names())

['x1', 'x10', 'x11', 'x12', 'x13', 'x14', 'x15', 'x2', 'x3', 'x4', 'x6', 'x7', 'x9']

和行是你的样本。

现在您有了一个特征矩阵,您可以继续进行聚类,例如kmeans

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_

结果

array([0, 1, 0, 0], dtype=int32)

K-means 不适用于这种类型的数据。对我来说,您作为示例提供的字符串适用于基于 MDL(最小描述长度https://en.wikipedia.org/wiki/Minimum_description_length)或数据压缩的聚类信息论方法。通过将这些字符串压缩到它们唯一的序列(去除冗余),可以出现更大的模式。有许多数据压缩算法。

可以在 Emmerg-Streib 和 Dehmer 的Information Theory and Statistical Learning中找到一个很好的概述。

http://www.amazon.com/Information-Theory-Statistical-Learning-Emmert-Streib/dp/0387848150/ref=sr_1_1?ie=UTF8&qid=1448032965&sr=8-1&keywords=Information+Theory+and+Statistical+Learning

一个有用的聚类算法可能是排列分布聚类

https://cran.r-project.org/web/packages/pdc/pdc.pdf

k-means必须能够计算均值,因此它对您不起作用。

考虑使用具有 Levenshtein 或类似相似性度量的层次聚类。LCSS也是一个不错的选择;为序列设计的任何相似性。