簡單易懂的人工智能系列:K-means算法

K-Means

算法概念

k-Mens即K均值聚類,屬於劃分聚類。其工作原理爲根據初始化的聚類中心信息,計算每個樣本到這些中心的距離,可以判斷每個樣本 均歸屬於某個類簇,更新聚類中心信息,重新計算每個樣本到新的聚類中心的距離,重新劃分樣本到新的聚類中心對應的類中,重複進行,知道滿足終止條件

如果用數據表達式表示,假設簇劃分爲,則我們的目標是最小化平方誤差E:

                                               

其中 μi 是簇 Ci 的均值向量,有時也稱爲質心,表達式爲:

                                                         

如果我們想直接求上式的最小值並不容易,這是一個NP難的問題,因此只能採用啓發式的迭代方法。

K-Means採用的啓發式方式很簡單,用下面一組圖就可以形象的描述:

有N個樣本點,使用K-Means將其聚類的步驟:

其中 Step3 中的重新計算k個類粗的中心點可採用平均距離中心——質心的計算公式。上圖以 K 爲2,樣本數爲 N 來描述KMean算法。

當然在實際K-Mean算法中,我們一般會多次運行圖c和圖d,才能達到最終的比較優的類別

具體實現步驟

第一步,確定聚類個數,確定聚類中心,確定距離計算公式

1. 對於K-Means算法,首先要注意的是k值的選擇,一般來說,我們會根據對數據的先驗經驗選擇一個合適的k值,如果沒有什麼先驗知識,則可以通過交叉驗證選擇一個合適的k值。

2. 在確定了k的個數後,我們需要選擇k個初始化的質心,就像上圖b中的隨機質心。由於我們是啓發式方法,k個初始化的質心的位置選擇對最後的聚類結果和運行時間都有很大的影響,因此需要選擇合適的k個質心,最好這些質心不能太近。

常用的幾種距離計算方法

通常情況下,在聚類算法中,樣本的屬性主要由其在特徵空間中的相對距離來表示。這就使得距離這個概念,對於聚類非常重要。以下是幾種最常見的距離計算方法:

歐式距離(又稱 2-norm 距離或平方距離)

在歐幾里德空間中,點 x=(x1,…,xn) 和 y=(y1,…,yn) 之間的歐氏距離爲:

在歐幾里德度量下,兩點之間線段最短。

餘弦距離(又稱餘弦相似性)

兩個向量間的餘弦值可以通過使用歐幾里德點積公式求出:

                                                a⋅b=∥a∥∥b∥cosθ

所以:

                                          

也就是說,給定兩個屬性向量 A 和 B,其餘弦距離(也可以理解爲兩向量夾角的餘弦)由點積和向量長度給出,如下所示:

                     

這裏的 Ai 和 Bi 分別代表向量 A 和 B 的各分量。

曼哈頓距離(Manhattan Distance, 又稱 1-norm 距離或絕對值距離)

曼哈頓距離的定義,來自於計算在規劃爲方型建築區塊的城市(如曼哈頓)中行車的最短路徑。

假設一個城市是完備的塊狀劃分,從一點到達另一點必須要按照之間所隔着的區塊的邊緣走,沒有其他捷徑(如下圖):

                                          

因此,曼哈頓距離就是:在直角座標系中,兩點所形成的線段對 x 和 y 軸投影的長度總和。

從點 (x1,y1) 到點 (x2,y2),曼哈頓距離爲:

                                                    |x1−x2|+|y1−y2|

第二步,計算每個點和聚類中心的距離,進行歸類

第三步,計算當前類簇的中心,更新聚類中心 Ck 的位置(質心法)

重複第二、三步,將各樣本Si點根據新聚類中心Ck進行重新劃分,根據最新聚類結果計算最新聚類中心,更新Ck取值

重複第二、三步,知道聚類中心不再變化,或者循環次數達到預先 設定的閾值,結束,得到聚類結果

 

實現僞碼

選擇k個點作爲初始類簇中心

repeat

     將每個樣本點指派到最近的類簇中心,形成K個類簇

     重新計算每個類簇的中心

until 類簇不發生變化 or 達到最大迭代ci

實現源碼

定義一個計算歐式距離的函數distEucDistance

定義初始化K個聚類中心的函數

定義k-均值算法函數kMeans:

 

K-means優缺點

優點:

缺點:

非球狀聚類效果圖示(很差):

K-means算法思考

  • 異常點的存在:K-means算法在迭代的過程中使用所有點的均值作爲新的質點(中心點),如果簇中存在異常點,將導致均值偏差比較嚴重。 比如一個簇中有2、4、6、8、100五個數據,那麼新的質點爲24,顯然這個質點離絕大多數點都比較遠;在當前情況下,使用中位數6可能比使用均值的想法更好,使用中位數的聚類方式叫做K-Mediods聚類(K中值聚類)。
  • 初值敏感:K-means算法是初值敏感的,選擇不同的初始值可能導致不同的簇劃分規則。爲了避免這種敏感性導致的最終結果異常性,可以採用初始化多套初始節點構造不同的分類規則,然後選擇最優的構造規則。針對這點後面因此衍生了:二分K-Means算法、K-Means++算法、K-Means||算法、Canopy算法等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章