一、k-means算法
通常,人們根據樣本間的某種距離或者相似性來定義聚類,即把相似的(或距離近的)樣本聚爲同一類,而把不相似的(或距離遠的)樣本歸在其他類。
我們以一個二維的例子來說明下聚類的目的。如下圖左所示,假設我們的n個樣本點分佈在圖中所示的二維空間。從數據點的大致形狀可以看出它們大致聚爲三個cluster,其中兩個緊湊一些,剩下那個鬆散一些。我們的目的是爲這些數據分組,以便能區分出屬於不同的簇的數據,如果按照分組給它們標上不同的顏色,就是像下圖右邊的圖那樣:
如果人可以看到像上圖那樣的數據分佈,就可以輕鬆進行聚類。但我們怎麼教會計算機按照我們的思維去做同樣的事情呢?這裏就介紹個集簡單和經典於一身的k-means算法。
k-means算法是一種很常見的聚類算法,它的基本思想是:通過迭代尋找k個聚類的一種劃分方案,使得用這k個聚類的均值來代表相應各類樣本時所得的總體誤差最小。
k-means算法的基礎是最小誤差平方和準則。其代價函數是:
式中,μc(i)表示第i個聚類的均值。我們希望代價函數最小,直觀的來說,各類內的樣本越相似,其與該類均值間的誤差平方越小,對所有類所得到的誤差平方求和,即可驗證分爲k類時,各聚類是否是最優的。
上式的代價函數無法用解析的方法最小化,只能有迭代的方法。k-means算法是將樣本聚類成 k個簇(cluster),其中k是用戶給定的,其求解過程非常直觀簡單,具體算法描述如下:
1、隨機選取 k個聚類質心點
2、重複下面過程直到收斂 {
對於每一個樣例 i,計算其應該屬於的類:
對於每一個類 j,重新計算該類的質心:
}
下圖展示了對n個樣本點進行K-means聚類的效果,這裏k取2。
其僞代碼如下:
********************************************************************
創建k個點作爲初始的質心點(隨機選擇)
當任意一個點的簇分配結果發生改變時
對數據集中的每一個數據點
對每一個質心
計算質心與數據點的距離
將數據點分配到距離最近的簇
對每一個簇,計算簇中所有點的均值,並將均值作爲質心