【轉】http://www.aboutyun.com/thread-18178-1-1.html
問題導讀:
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>
來源:藍鯨碎碎念