k 均值聚類算法的工作流程是這樣的:首先選取 k 個(gè)點(diǎn),作為初始 k 個(gè)簇的中心(這個(gè) k 是人為設(shè)定的超參數(shù)),然后將其余的數(shù)據(jù)對象分配到距離自己最近的簇中心所在的簇中。假設(shè)樣本集中有 l 個(gè)樣本,每個(gè)樣本都是一個(gè)具備 n 個(gè)特征,用向量 xi 表示第 i 個(gè)樣本。現(xiàn)在我們假設(shè)要把所有樣本劃分為 k 個(gè)簇,即:
S={S1, S2, ......, SK}
這里 Sl(1≤l≤k) 表示第 l 個(gè)簇,S 是由若干簇構(gòu)成的簇集合。
那么,最優(yōu)的分配方案就是優(yōu)化如下目標(biāo)函數(shù)的解:
其中,μi 簇中的均值向量,有的文獻(xiàn)也稱之為質(zhì)心(centroid),共有 k 個(gè),因此這個(gè)算法叫作 k 均值聚類算法。由于以上公式所示的組合優(yōu)化問題是一個(gè) NP 難題,通常難以求得最優(yōu)解,只能求得近似解。因此在實(shí)現(xiàn)過程中,通常采用循環(huán)迭代的方式,逐步收斂到局部最優(yōu)解處。
當(dāng)所有的點(diǎn)均被劃分到某一個(gè)簇后,要再對各個(gè)簇中心(μi)進(jìn)行更新。更新的依據(jù)是,根據(jù)每個(gè)聚類對象的均值,計(jì)算每個(gè)對象到簇中心的距離最小值,直到滿足一定的條件才停止計(jì)算。這個(gè)條件一般為函數(shù)收斂(比如前后兩次迭代的簇中心足夠接近)或計(jì)算達(dá)到一定的迭代次數(shù)。
k 均值聚類算法的過程如圖 1 所示。
圖 1:k 均值聚類算法的過程
在 k 均值聚類算法中,我們主要需要考慮兩個(gè)關(guān)鍵問題:初始簇中心(也稱質(zhì)心)的選取及距離的度量。常見的選取初始簇中心的方法是隨機(jī)挑選 k 個(gè)點(diǎn),但這樣形成的簇質(zhì)量往往很差。
因此,我們采用其他常用方法挑選初始簇中心,具體如下:
- 多次運(yùn)行調(diào)優(yōu)。每次使用一組不同的隨機(jī)初始簇中心,最后從中選取具有最小平方誤差的簇集。這種方法簡單,但效果難料,主要取決于數(shù)據(jù)集的大小和簇的個(gè)數(shù)k;
- 根據(jù)先驗(yàn)知識(即歷史經(jīng)驗(yàn))來決定 k 值。
對于另一個(gè)因素—如何確定對象之間的距離,根據(jù)問題場景不同,度量方式也是不同的。在歐式空間中,我們可以通過歐氏距離來度量兩個(gè)樣本之間的距離,而對于非歐式空間,可以選擇 Jaccard 距離、Cosine 距離或 Edit 距離等度量方式。