1. 程式人生 > >聚類演算法-K-means

聚類演算法-K-means

K-means演算法******

步驟:

1.從訓練資料中隨機選取k個初始點,作為k個初始簇的中心點

2.計算每個點到中心點的歐式距離,將其歸併到距離最近的簇中,直至所有點劃分完成

3.計算每個簇新的中心點

4.如果相對於原來中心點沒有變化或者變化數值小於給定閾值,則演算法結束,獲得k個簇,否則以計算出的新的中心點為新的簇的中心,繼續進行2,3操作,直至滿足終止條件

關於k值的選擇**************

方法一:使用輪廓係數

輪廓係數(Silhouette Coefficient)結合了聚類的凝聚度(Cohesion)和分離度(Separation),用於評估聚類的效果。該值處於-1~1之間,值越大,表示聚類效果越好。

具體計算方法如下:

對於其中的一個點 i 來說:

計算 a(i) = average(i向量到所有它屬於的簇中其它點的距離)

計算 b(i) min (i向量到所有非本身所在簇的點的平均距離)

那麼 i 向量輪廓係數就為:

可見輪廓係數的值是介於 [-1,1] ,越趨近於1代表內聚度和分離度都相對較優。

將所有點的輪廓係數求平均,就是該聚類結果總的輪廓係數。

在實際應用中,由於Kmean一般作為資料預處理,或者用於輔助分聚類貼標籤。所以k一般不會設定很大。可以通過列舉,令k從2到一個固定值如10,在每個k值上重複執行數次kmeans(避免區域性最優解),並計算當前k的平均輪廓係數,最後選取輪廓係數最大的值對應的k作為最終的叢集數目。

方法二:VRC (本質其實就是方差分析,將類間方差與類內方差比較,兩者之比近似1,說明來自同一個正態總體,而遠遠大於1,說明類間方差遠大於類內方差,兩者不來自同一個整體,可以認為兩者是不同類,這是我們可以認為聚類效果較好)

其中SSB是類間方差, ,m為所有點的中心點,mi為某類的中心點;

SSW是類內方差,;

(N-k)/(k-1)是複雜度;

比率越大,資料分離度越大.1

選取VRC最大的K作為我們的選擇

關於初始點的選擇*

方法一:隨機選擇

①選取一個隨機點作為第一個初始點

②選取一個距離第一個初始點最遠的點作為第二個初始點

③選取距離第一個和第二個初始點距離之和最大的點作為第三個初始點

④依次類推,直至選夠K個初始點

方法二:使用Canopy演算法

(1)設樣本集合為S,確定兩個閾值t1和t2,且t1>t2。
(2)任取一個樣本點p,作為一個Canopy,記為C,從S中移除p。
(3)計算S中所有點到p的距離dist
(4)若dist<t1,則將相應點歸到C,我們認為這個點和C有關聯,作為弱關聯。
(5)若dist<t2,則將相應點移出S,歸到C,我們認為這個點已經和C相當接近了,作為強關聯。
(6)重複(2)~(5),直至S為空
我們可以選擇距離每個Canopy的中心點最近的那個資料點,或者直接選擇每個Canopy的中心點作為KMeans的初始K個類簇中心點。