2012-02-27 85 views
-1

我正在使用Trickl-Cluster項目對我的數據集 和Colt進行聚類,以便將數據對象記憶在矩陣中。具有意外輸出的Java K-means實現

執行此代碼

import cern.colt.matrix.DoubleMatrix2D; 
import cern.colt.matrix.impl.DenseDoubleMatrix2D; 
import com.trickl.cluster.KMeans; 

DoubleMatrix2D dm1 = new DenseDoubleMatrix2D(3, 3); 
dm1.setQuick(0, 0, 5.9); 
dm1.setQuick(0, 1, 1.6); 
dm1.setQuick(0, 2, 18.0); 
dm1.setQuick(1, 0, 2.0); 
dm1.setQuick(1, 1, 3.5); 
dm1.setQuick(1, 2, 20.3); 
dm1.setQuick(2, 0, 11.5); 
dm1.setQuick(2, 1, 100.5); 
dm1.setQuick(2, 2,6.5); 
System.out.println (dm1); 

KMeans km = new KMeans(); 
km.cluster(dm1 ,1); 
DoubleMatrix2D dm11 = km.getPartition(); 
System.out.println (dm11); 
DoubleMatrix2D dm111 = km.getMeans(); 
System.out.println (dm111); 

後,我有以下輸出

3 x 3 matrix 
5.9 1.6 18 
2  3.5 20.3 
11.5 100.5 6.5 

3 x 1 matrix 
1 
1 
1 

3 x 1 matrix 
6.466667 
35.2  
14.933333 

繼算法步驟,這是奇怪,當一個預計1組,有3種手段 文檔不是那麼清楚關於那個具體點。

這是根據該項目

void cluster(cern.colt.matrix.DoubleMatrix2D data, int clusters) 

所以邏輯上說的int clusters的Java文檔的方法集羣定義表示預期的簇的數目的K-means終止後。

您對項目中K-means類的輸出與K-means算法預期結果之間的關係有任何想法嗎?

+0

只是在黑暗中刺,但不應該使用多於1作爲羣集方法的輸入值?否則,你會不會得到一個與所有數據點(即中心)距離最小的羣集? K-means的意義不在於在幾個聚類點之間劃分數據集? – 2012-02-27 14:33:13

+0

是的,我有意將1作爲輸入值。 因爲只有一個羣集,只有一個平均值應該作爲輸出,而你清楚地看到有3個平均值。 – 2012-02-27 14:50:13

回答

3

這是一個3維的意思。如果你輸入三維數據,你可以得到三維的手段。

注意運行k均值,其中k = 1是絕對荒謬的,因爲它會簡單地計算數據集的平均值:

(5.9+2+11.5)/3 = 6.466667 
(1.6+3.5+100.5)/3 = 35.2 
(18+20.3+6.5)/3 = 14.933333 

結果顯然是正確的。

+0

我知道1個集羣沒有意義,在之前的評論中,我說我是故意這樣做的。 你的回答非常有幫助。謝謝 – 2012-02-27 20:34:24