2011-09-23 202 views
13

我做中的R k均值聚類有兩個要求:如何指定R中kmeans的距離度量?

  1. 我需要用戶自己指定距離的功能,現在它的Pearson相關係數。

  2. 我想要使用羣組成員的平均值作爲質心的羣集,而不是一些實際的成員。 這個要求的原因是我認爲使用平均值作爲質心比使用實際成員更有意義,因爲成員總是不在真實質心附近。如果我對此有錯,請糾正我。

首先我試過kmeans功能stat包,但此功能不會允許自定義距離法。

然後我發現pam函數在cluster包中。 pam函數允許通過以dist對象爲參數來允許自定義距離度量,但在我看來,通過這樣做,它將實際成員作爲質心,這不是我所期望的。因爲我不認爲它可以用距離矩陣完成所有的距離計算。

那麼在R中做一些簡單的方法來完成滿足我的要求的kmeans聚類?

+1

你可以用'素食主義者:: designdist'創建自己的指數(見'素食主義者:: vegdist'如果它已經存在)。獲得'dist'對象後,可以在stats包中使用'hclust'來使用適當的聚合方法。 –

+1

@RomanLuštrik,感謝評論。我知道如何用hclust指定距離度量,但現在我需要知道如何用kmeans來完成。 –

回答

17

檢查flexclust包:

主要功能kcca實現用於 K-質心聚類分析支持任意距離措施 和形心計算的一般框架。

該軟件包還包括一個功能distCor

R> flexclust::distCor 
function (x, centers) 
{ 
    z <- matrix(0, nrow(x), ncol = nrow(centers)) 
    for (k in 1:nrow(centers)) { 
     z[, k] <- 1 - .Internal(cor(t(x), centers[k, ], 1, 0)) 
    } 
    z 
} 
<environment: namespace:flexclust> 
+0

謝謝rcs!當我將dist指定爲:family = kccaFamily(dist = function(x,y){1-cor(x,y)})時,爲什麼我會得到「不兼容的維度」 –

+0

您需要一個帶'x'和'center'參數的函數。例如,請參閱「flexclust :: distCor」的源代碼。 – rcs

+1

如果有人對如何使用distCor感到困惑,請嘗試:'res = kcca(data,10,family = kccaFamily(dist = distCor))' –