2012-01-04 95 views
1

我已經在Java中實現了K-Means,並且有一些頭部劃痕。我通過在數據點的值範圍內的每個維度中選擇一個隨機值來選擇我的初始質心。我遇到過這種情況,其結果是這些質心中的一個或多個質心不會成爲任何數據點的最接近質心。那麼我爲下一次迭代做什麼?把它留在原來的隨機值?選擇一個新的隨機值?計算其他質心的平均值?似乎這不算在原始算法中,但可能我錯過了一些東西。當KMeans返回少於K個羣集時該怎麼辦?

回答

1

k-means的大多數實現使用實際數據點來定義初始質心,而不是由變量繪製的邊界框中的隨機點。但是,下面是解決您的實際問題的一些建議。

您可以隨機取另一個數據點並將其設置爲新的羣集質心。這非常簡單且快速實施,不應該對算法產生不利影響。

您也可以嘗試使用kmeans++更聰明地初步選擇集羣質心。該算法隨機選擇第一個質心,並挑選剩餘的K-1質心來嘗試並最大化質心間距離。通過選擇更智能的質心,您不太可能遇到質心被分配零數據點的問題。

如果您希望稍微聰明一些,可以使用kmeans ++算法在質心獲取零數據點時創建一個新的質心。

1

我用它的方式,初始值是從數據集中的隨機點,而不是跨越空間的隨機點。這意味着每個集羣最初至少有一個點。你仍然可能會因爲離羣值而感到不幸,但是如果運氣好的話,你將能夠檢測到這一點並以不同的點重新開始。 (提供「K個點的集羣」是對您的數據的充分描述)

1

而不是挑選隨機值(如果可能值的空間與羣集相比可能很大,那麼這些值可能非常沒有意義),但許多實現選擇random 作爲初始質心。

相關問題