我正在将Matlab的常规kmeans算法与L2归一化特征矩阵上的'Distance','cosine','EmptyAction','drop'配合使用,但遇到了问题。 Matlab生成的输出只是将每个数据点分配给簇1.00000
,即使k = 20,并且C中的所有质心都是NaN
。是否有人对造成此问题有任何建议?
矩阵的布局为([0,1,...,1,0,1],[...],[0,1,...,1,0,1])。在将文件传递给Matlab之前,我已经使用Python的numpy.linalg.norm
完成了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
任何帮助或建议,将不胜感激。如果您需要更多信息,请告诉我!
最佳答案
是余弦距离使它失效,它与sqEuclidean一起使用。我认为余弦距离需要更多信息,否则对您的数据集没有意义。
编辑:我会同意你的观点,这里的文档有点模糊...但是在Matlab的pdist函数中余弦距离的定义是:“减去点之间夹角的余弦(作为矢量)。”
我认为,必须包括该角度(我在下一节中假设)。但这似乎违背了目的。cosine similarity
再次编辑:我猜include表示“ 2个向量之间的夹角”的可能性更大。在这种情况下,我认为余弦期望2列或更多列可以工作。
另外,如果您已经熟悉python,那么那里也有一些不错的机器学习工具。这是one I have used。也有MILK,但我自己从未使用过。
关于python - Matlab k-均值余弦将所有内容分配给一个群集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10503193/