K-均值算法
K-均值是最普及的聚類算法,算法接受一個未標記的數據集,然後將數據聚類成不同的組
迭代思想
假設我們想要將數據聚類成個組,其方法爲:
- 首先選擇個隨機的點,稱爲聚類中心(cluster centroids);
- 對於數據集中的每一個數據,按照距離箇中心點的距離,將其與距離最近的中心點關聯起來,與同一個中心點關聯的所有點聚成一類。
- 計算每一個組的平均值,將該組所關聯的中心點移動到平均值的位置。
- 重複步驟2-4直至中心點不再變化
僞代碼如下
Repeat {
for i = 1 to m
c(i) := index (form 1 to K) of cluster centroid closest to x(i)
for k = 1 to K
μk := average (mean) of points assigned to cluster k
}
第一個for循環 對於每一個樣例,計算其應該屬於的類;
第二個for循環是聚類中心的移動,即:對於每一個類,重新計算該類的質心。
eg:
, 代表樣本屬於;對於所有 , 能使得最小
例子
下圖所示的數據集包含身高和體重兩項特徵構成的,利用K-均值算法將數據分爲三類,用於幫助確定將要生產的T-恤衫的三種尺寸。
優化目標
參數介紹
: 距離最近的cluster的index值
:
: 與最近的聚類中心點優化目標是最小化函數
結合僞代碼中的兩個for循環,第一個for循環是爲減少引起的損失,第二個for循環是減少引起的cost
隨機初始化
運行K-均值算法的之前,我們首先要隨機初始化所有的聚類中心點:
- 我們應該選擇,即聚類中心點的個數要小於所有訓練集實例的數量
- 隨機選擇K個訓練實例,然後令K個聚類中心分別與這K個訓練實例相等
K-均值的一個問題在於,它有可能會停留在一個局部最小值處,而這取決於初始化的情況。
如下圖,比較理想的聚類情況是最上面的;但是也會有下面不理想的兩個圖
爲了解決這個問題,我們通常需要多次運行K-均值算法,每一次都重新進行隨機初始化,最後再比較多次運行K-均值的結果,選擇代價函數最小的結果。這種方法在較小的時候(2--10)還是可行的,但是如果較大,這麼做也可能不會有明顯地改善。
選擇聚類數
選擇聚類數目的方法時,有一個可能會談及的方法叫作“肘部法則”。關於“肘部法則”,我們所需要做的是改變值,也就是聚類類別數目的總數。我們用一個聚類來運行K均值聚類方法。這就意味着,所有的數據都會分到一個聚類裏,然後計算成本函數或者計算畸變函數。
我們可能會得到一條類似於上圖的曲線。像一個人的肘部。這就是“肘部法則”所做的,讓我們來看這樣一個圖,看起來就好像有一個很清楚的肘。你會發現這種模式,它的畸變值會迅速下降,從1到2,從2到3之後,你會在3的時候達到一個肘點。在此之後,畸變值就下降的非常慢,看起來就像使用3個聚類來進行聚類是正確的,這是因爲那個點是曲線的肘點,畸變值下降得很快,之後就下降得很慢,那麼我們就選