1. 程式人生 > >K-Means聚類演算法的原理及實現

K-Means聚類演算法的原理及實現

問題導讀:
1、如何理解K-Means演算法?
2、如何尋找K值及初始質心?
3、如何應用K-Means演算法處理資料?




K-Means是聚類演算法中的一種,其中K表示類別數,Means表示均值。顧名思義K-Means是一種通過均值對資料點進行聚類的演算法。K-Means演算法通過預先設定的K值及每個類別的初始質心對相似的資料點進行劃分。並通過劃分後的均值迭代優化獲得最優的聚類結果。

K值及初始質心

K值是聚類結果中類別的數量。簡單的說就是我們希望將資料劃分的類別數。K值決定了初始質心的數量。K值為幾,就要有幾個質心。選擇最優K值沒有固定的公式或方法,需要人工來指定,建議根據實際的業務需求,或通過層次聚類(Hierarchical Clustering)的方法獲得資料的類別數量作為選擇K值的參考。這裡需要注意的是選擇較大的K值可以降低資料的誤差,但會增加過擬合的風險。


以下是一組使用者的年齡資料,我們將K值定義為2對使用者進行聚類。並隨機選擇16和22作為兩個類別的初始質心。

<ignore_js_op>
<ignore_js_op>

計算距離並劃分資料

我們以圖的形式展示聚類的過程。在這組年齡資料中,我們選擇了16和22作為兩個類別的初始質心,並通過計算所有使用者的年齡值與初始質心的距離對使用者進行第一次分類。
<ignore_js_op>

計算距離的方法是使用歐式距離。以下是歐式距離的計算公式。距離值越小表示兩個使用者間年齡的相似度越高。

<ignore_js_op>

通過計算,我們獲得了每個年齡資料點與兩個初始質心的距離。這裡我們以黑色實心圓點標記較大的距離值,空心圓點標記較小的距離值。例如第一個資料點15,到第一個初始質心16的距離為1,到第二個初始質心22的距離為7。相比之下15與16的距離更近,距離值為1,並以空心圓點標記。因此15這個年齡資料點被劃分在第一個組(16)中。如果年齡資料點到兩個初始質心的距離相等,可以劃分到任意組中,例如年齡資料點19,到16和22的距離都為3。在這個示例中我們將資料點19劃分到第二個組(22)中。

<ignore_js_op>

按相似程度(距離)對資料分完組後,分別計算兩個分組中資料的均值15.33和36.25,並以這兩個均值作為新的質心。在下圖中可以看到,藍色的數字為初始質心,紅色的數字為新的質心。目前的質心和新的質心並不是同一個資料點,我們將以新的質心替代初始質心,迭代計算每個資料點到新質心的距離。直到新的質心和原質心相等,演算法結束。
<ignore_js_op>

使用均值作為新質心

將兩個分組中資料的均值作為新的質心,並重復之前的方法計算每個年齡資料點到新質心的距離。下面是年齡資料點到兩個新質心的距離。以年齡資料點19為例,到新質心15.33的距離為3.67,到另一個新質心36.25的距離為17.25。相比之下資料點19到15.33的距離更近,為3.67。因此被分到第一組(15.33)中。

<ignore_js_op>

以年齡資料點到新質心的距離值完成分組後,再次計算兩組的均值18.56和45.90,並以均值作為新質心替代原質心。下圖中藍色數字為原質心,紅色數字為新質心。在新質心下,年齡資料的分組情況發生了變化,但新質心與原質心沒有重合。

<ignore_js_op>

重複之前的方法和步驟,計算年齡資料點到新質心的距離。並對比資料點到兩個新質心的距離,選擇較小的距離值對年齡資料點進行分組。年齡資料點28到18.56的距離為9.44,到45.90的距離為17.90。因此年齡資料點28被分配到第一個18.56的分組中。
<ignore_js_op>

再次以年齡資料點到新質心的距離完成分組後,新質心(紅色)與原質心(藍色)仍然沒有重合,但與之前相比分組的調整已經很小。我們繼續計算新分組的均值19.50和47.89,並將均值作為新質心替代原質心。
<ignore_js_op>

演算法停止條件

開始計算的第一步我們說迭代計算每個資料到新質心的距離,直到新的質心和原質心相等,演算法結束。使用上一步分組的均值19.50和47.89作為新質心。並計算年齡資料點到新質心的距離。以下為計算結果。
<ignore_js_op>

按照年齡資料點到新質心的距離對資料進行分組,並計算每組的均值作為新質心。這裡兩組的均值與原質心相等。也就是說新質心與原質心相等,都是19.50和47.89.。演算法停止計算。年齡資料點被劃分為兩類,如下圖所示分別為15-28和35-65。
<ignore_js_op>