k-means++

K-Means主要有兩個最重大的缺陷——都和初始值有關:

  •  K 是事先給定的,這個 K 值的選定是非常難以估計的。很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適。( ISODATA 算法通過類的自動合併和分裂,得到較爲合理的類型數目 K)
  • K-Means算法需要用初始隨機種子點來搞,這個隨機種子點太重要,不同的隨機種子點會有得到完全不同的結果。(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)

我在這裏重點說一下 K-Means++算法步驟:

  1. 先從我們的數據庫隨機挑個隨機點當“種子點”。
  2. 對於每個點,我們都計算其和最近的一個“種子點”的距離D(x)並保存在一個數組裏,然後把這些距離加起來得到Sum(D(x))。
  3. 然後,再取一個隨機值,用權重的方式來取計算下一個“種子點”。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,然後用Random -= D(x),直到其<=0,此時的點就是下一個“種子點”。
  4. 重複第(2)和第(3)步直到所有的K個種子點都被選出來。
  5. 進行K-Means算法。

相關的代碼你可以在這裏找到“implement the K-means++ algorithm”(牆) 另,Apache 的通用數據學庫也實現了這一算法

參考資料:http://coolshell.cn/articles/7779.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章