1

我在 L2 归一化特征矩阵上使用带有 'Distance'、'cosine'、'EmptyAction'、'drop' 的 Matlab 常规 kmeans 算法,但我遇到了问题。Matlab 生成的输出只是将每个数据点分配给 cluster 1.00000,即使 k=20,并且 C 中的所有质心都是NaN。有没有人对可能导致这种情况的原因有任何建议?

矩阵的布局为 ([0,1,...,1,0,1],[...],[0,1,...,1,0,1])。numpy.linalg.norm在将文件传递给 Matlab 之前,我已经使用 Python 完成了 L2 标准化。这是我运行kmeans的确切方式:

m=importdata('matrix.txt');
data=m'; % transpose, because kmeans treats columns as features instead of rows
[L, C]=kmeans(data, 20, 'Distance', 'cosine', 'EmptyAction', 'drop')

这是我的标准化数据集的示例:

10.3440804328
12.6885775404
15.5884572681
15.9059737206
17.4355957742
17.0
17.3493515729
17.3205080757
18.6279360102
19.7230829233
21.400934559
22.0
22.5831795813
23.0
24.0416305603
25.2388589282
26.8141753556
22.5388553392
9.2736184955
13.5277492585
15.2970585408

任何帮助或建议将不胜感激。如果您需要更多信息,请告诉我!

4

1 回答 1

1

导致它失败的是余弦距离,它适用于 sqEuclidean。我认为余弦距离需要更多信息,否则对您的数据集没有意义。

编辑:我同意你的观点,这里的文档有点含糊……但 Matlab 的 pdist 函数中余弦距离的定义是:“一个减去点之间夹角的余弦(视为向量)。”

我认为,必须包括角度(我假设在下一列中)。但这似乎违背了目的。余弦相似度 再次编辑:我猜它更可能是包含的意思是“2个向量之间的夹角”。在这种情况下,我认为余弦需要 2 列或更多列来处理。

Also, if your already into python there are some good machine learning tools there as well. Here is one I have used. There is also MILK, but I have never used it myself.

于 2012-05-08T17:30:33.330 回答