K近鄰聚類算法

概述

隨機選擇K個聚類中心,在每一次迭代中,先爲每個點確定其最近的聚類中心,這一步稱爲集羣分配(cluster assignment),然後計算每個類中所有點的中心點,將該類的聚類中心移動到中心點,這一步稱爲中心移動(move centroid),得到這k個聚類中心的新位置,進行下一次迭代,直到每個聚類中心點正確分佈在每個類的中心。

算法的輸入有兩個參數:聚類中心的數量K和一系列訓練集X={x1,x2,,xm}X=\{x^1,x^2,\dots,x^m\},聚類過程如圖所示:

僞代碼如下:

  • 隨機初始化K個聚類中心μ1,μ2,,μK\mu _1,\mu_2,\dots ,\mu_K
  • 重複此過程直到μ1,μ2,,μK\mu _1,\mu_2,\dots ,\mu_K不再改變 或者 到達最大迭代次數:
    • for i=1:m //對訓練集中的每個數據
      • cic^i=K個聚類中心中離i最近的一箇中心μ\mu
    • for k=1:K
      • μk\mu_k=所有劃分到μk\mu_k的點的均值(對μk\mu_k進行更新)

K近鄰聚類與K近鄰分類

  • KNN聚類是非監督學習,KNN分類是監督學習
  • KNN聚類是迭代的過程,KNN分類不需要迭代

關於隨機初始化

一個推薦的隨機初始化的方法:

隨機選擇K個訓練集中的點x1,x2,,xKx_1,x_2,\dots,x_K,令他們爲初始聚類中心x1=μ1,x2=μ2,,xK=μKx_1=\mu_1,x_2=\mu_2,\dots,x_K=\mu_K.

隨機初始化的點會很大程度上影響到最終聚類的結果,如果初始化的不好,最終可能會陷入局部最優結果(local optima),避免這種的方式是進行多次隨機初始化和聚類(一般取50到1000次),分別計算distortion,取distortion最小的一次
distortion=1mi=1mxici2 distortion=\frac{1}{m}\sum_{i=1}^m ||x_i - c_i||^2
對於K比較小(2到10),進行多次隨機初始化可能會很有用,但是對於K很大(如100),也許一次K聚類就能達到較好的效果。

關於選擇聚類個數K

  • 根據肘部法則(elbow method),將K/distortion函數畫出來,圖像會看上去像人的胳膊肘,選擇肘部的地方所表示的K值會是很好的選擇。

  • 根據業務需要,這是很多情況下的方法,在運行KNN聚類之前心裏就有了想要分成多少類的需求。

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