1. 程式人生 > >K-Means演算法(思想)

K-Means演算法(思想)


K-Means演算法的思想:

第一步:尋找最近的中心點

在給定的資料集上隨機選取K(K已知)個點(向量)作為資料集上的K箇中心(也就代表K個類別),然後依次遍歷每一條資料,分別計算其與K箇中心的距離,選擇與之距離最近的點作為該資料所屬的類別。這樣一次遍歷完之後,資料集中的所有點都被劃入了其應該所屬的類別裡面(儘管有劃錯的)。

注意:初始中心點的選擇,會影響到最終的分類結果,即可能不會收斂

第二步:重新計算中心

對於每一個類別來說,裡面都有若干個點。由於之前的中心點事隨機選取的,所以可定有不合理的中心點,於是我們就要重新計算中心點。然後再重複進行第一步的操作。

經過多次迭代前面兩個步驟之後,最終的總代價將會收斂到一個最小值。此時的得到的聚類結果通常也就是最好的。


詳細步驟:

現有如下資料集,欲將其分為3類,即K=3:

這裡寫圖片描述

1.尋找最近的中心點

先隨機取3個點μ1,μ2,μ3作為中心點,然後分別計算每個點到μ1,μ2,μ3的距離的平方(平方在計算的時候好處理,不含根號),選擇最小的。其中,μ為一個K×n矩陣,用來記錄K箇中心點座標。

比如現在有一個點xi,其到μ1,μ2,μ3的距離分別為s1,s2,s3s2最小,那麼我們就將xi這個點劃入到第二個類別,即c(i)=2。其中,c為一個m維的列向量,用來記錄每一個數據xi所屬對應的類別。

這樣依次遍歷完所有的點,將其劃入對應的類別中。

2.重新計算中心點

上面也說到,初始化的中心點(如下圖中的3個叉)肯定不會是最佳的點,所以要對其重新多次計算,直到代價值收斂。

這裡寫圖片描述

如上圖所示,資料集對應的被聚類成了三個部分(三種顏色標註的),但顯然很不好。所以就要在這基礎上重新計算中心點。

比如現在μ1這個類中有x1,x3,x6,x8,x12,5個點那麼重新計算後的中心點:

μ1=x1+x3+x6+x8+x125(分子為向量的加法)

3.迭代

反覆迭代以上兩步,使代價函式收斂。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

從上圖可以看出,大概迭代到底6次後,中心點也就沒有再發生變化了。也就是說此時代價函式已經收斂了。代價值為所有點,到其對應中心點的距離之和。

J(c,μ)=1mi=1m||x(i)μc(i)||2

其中:

xi表示資料集中的每一點;
μc(i)

表示xi所屬的中心點;

這裡寫圖片描述

例項,戳此處