在聚類問題中,我們試圖將給定的樣本集{x(1),…,x(m)} 分割成幾個各自匯聚的聚類。這類問題中輸入特徵同之前一樣是一個n維向量x(i)∈Rn ,但輸出標籤y(i) 是不存在的,因此這是一個非監督式學習問題。
k-means 聚類算法的執行步驟如下:
- 隨機初始化k個聚類質心的座標值μ1,μ2,…,μk∈Rn ;
循環直至收斂:{
循環每個i ,有:
c(i):=arg minj∥x(i)−μj∥2.
循環每個j ,有:
μj:=∑mi=11{c(i)=j}x(i)∑mi=11{c(i)=j}.
}
上面的算法中,k代表我們猜測的聚類數量,聚類質心μj 代表我們當前假設的聚類質心座標。初始化質心座標時,我們可隨機選取k個樣本點,讓k個質心的座標等於這k個樣本點(當然還有其他初始化質心的方法)。
算法的內循環重複執行兩個步驟:(1) 將樣本點x(i) 分配給距離它歐式距離最近的質心;(2) 將每個聚類質心座標向其所轄樣本點的均值點移動。
下圖是一個k-means 算法運行的圖示。
上圖:點表示訓練樣本,叉叉表示聚類質心。(a) 原始數據集。 (b)隨機初始化聚類質心(在此例中,沒有讓初始質心等於某一樣本值)(c-f) k-means算法迭代的圖解。
k均值算法可以保證一定會收斂嗎?答案是yes。爲了便於理解,我們定義失真函數(distortion function):
J(c,μ)=∑i=1m∥x(i)−μc(i)∥2
失真函數描述了每個樣本點x(i) 到其所屬質心μc(i) 距離的平方和。k-means算法實際就是最小化失真函數J 的座標下降法。
究其本質,算法的內層循環,先固定質心座標μ ,求J 關於質心分配c 的最小化;然後固定質心分配c ,求J 關於質心座標μ 的最小化。算法運行中J 一定的單調下降的,它的值也必將收斂(單調有界必收斂)。
失真函數J 是一個非凸函數,所以我們不能保證J 會收斂到全局最優解。換而言之,儘管多數情況下k-means算法都表現很好,但它有可能會陷入局部最優。爲了避免這個問題,普遍的做法是多次運行這個算法,選取J(c,μ) 值最小的那一組聚類。