2012-05-08 41 views
1

我正在使用Matlab的常規kmeans算法與'距離','餘弦','EmptyAction','下降'在L2規範化的功能矩陣,我有一個問題。 Matlab生成的輸出只需將EVERY數據點分配到集羣1.00000即使k = 20,並且C中的所有質心都是NaN。有沒有人有什麼建議可能會導致這種情況?Matlab的k-均值餘弦分配一切到一個羣集

矩陣的佈局是([0,1,...,1,0,1],[...],[0,1,...,1,0,1])。在將文件傳遞給Matlab之前,我已經使用Python的numpy.linalg.norm完成了L2規範化。這是我運行k均值的確切方式:

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 

任何幫助或建議,將不勝感激。如果您需要更多信息,請告訴我!

+0

根據我對他們在doc中顯示的示例的理解,kmeans使用x-y座標集合,而每行僅提供一個特性,您是否與應包含的數據有關聯的值? – Smash

+0

我假設在這種情況下,他只有一個功能 – Matt

+0

也許增加1秒的第二列? – Smash

回答

1

這是使它失敗的餘弦距離,它適用於sqEuclidean。我認爲餘弦距離需要更多信息,否則對您的數據集沒有意義。

編輯:我同意你的看法,這裏的文檔有些模糊......但Matlab中pdist函數中餘弦距離的定義是:「減去點之間夾角的餘弦(視爲矢量)。」

我認爲,必須包括角度(我假設在下一列)。但是,這種看起來好像打敗了目的。 cosine similarity 再次編輯:我想這更可能是包含意味着「兩個向量之間的夾角」。在這種情況下,我認爲餘弦期望有2列或更多列可以工作。另外,如果你已經進入python,那裏也有一些很好的機器學習工具。這裏是one I have used。還有MILK,但我從來沒有用過它。

+0

據我所知,帶餘弦的kmeans需要一個單位向量作爲輸入,不是嗎?例如,見「球形k-均值」的描述,因爲它也是已知的:http://www.shi-zhong.com/papers/oskm_ijcnn05.pdf 還有什麼想法? – Doa

+0

另外,雖然sklearn有kmeans,但它不允許我設置不同的距離度量值,還是它?這只是歐洲的AFAICT。 – Doa

+1

通過運行pdist(數據'餘弦')可以看出它正在計算所有數據的零距離。很清楚,Matlab的定義並不是你所期待的。如果你在你的數據旁邊放一列數據,你確實得到了一些東西,但我對餘弦距離不是很熟悉,所以我不知道該期待什麼。 – Matt