哲哲的ML筆記(二十八:聚類——K-均值算法)

K-均值算法

  1. K-均值是最普及的聚類算法,算法接受一個未標記的數據集,然後將數據聚類成不同的組

  2. 迭代思想
    假設我們想要將數據聚類成K個組,其方法爲:

  • 首先選擇K個隨機的點,稱爲聚類中心(cluster centroids);
  • 對於數據集中的每一個數據,按照距離K箇中心點的距離,將其與距離最近的中心點關聯起來,與同一個中心點關聯的所有點聚成一類。
  • 計算每一個組的平均值,將該組所關聯的中心點移動到平均值的位置。
  • 重複步驟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循環 對於每一個樣例i,計算其應該屬於的類;
第二個for循環是聚類中心的移動,即:對於每一個類,重新計算該類的質心。

eg:
c(3)=5, 代表樣本x^{(3)}屬於cluster\; 5;對於所有1,2,…,K , k=5能使得\|x^{(2)}-\mu_k\|^2最小

例子

下圖所示的數據集包含身高和體重兩項特徵構成的,利用K-均值算法將數據分爲三類,用於幫助確定將要生產的T-恤衫的三種尺寸。


優化目標

  1. 參數介紹
    c^{(i)}: x^{(i)} 距離最近的cluster的index值
    \mu_k: cluster \;k
    \mu_{c^{(i)}}: 與x^{(i)}最近的聚類中心點

  2. 優化目標是最小化函數J
    J(c^{(1)},c^{(2)},…,c^{(m)},\mu_1,…,\mu_K)=\frac{1}{m}\sum_{i=1}^{m}\|x^{(i)}-\mu_{c^{(i)}}\|^2
    結合僞代碼中的兩個for循環,第一個for循環是爲減少c^i引起的損失,第二個for循環是減少u_k引起的cost

隨機初始化

運行K-均值算法的之前,我們首先要隨機初始化所有的聚類中心點:

  1. 我們應該選擇K<m,即聚類中心點的個數要小於所有訓練集實例的數量
  2. 隨機選擇K個訓練實例,然後令K個聚類中心分別與這K個訓練實例相等

K-均值的一個問題在於,它有可能會停留在一個局部最小值處,而這取決於初始化的情況。
如下圖,比較理想的聚類情況是最上面的;但是也會有下面不理想的兩個圖


爲了解決這個問題,我們通常需要多次運行K-均值算法,每一次都重新進行隨機初始化,最後再比較多次運行K-均值的結果,選擇代價函數最小的結果。這種方法在K較小的時候(2--10)還是可行的,但是如果較大,這麼做也可能不會有明顯地改善。

選擇聚類數

選擇聚類數目的方法時,有一個可能會談及的方法叫作“肘部法則”。關於“肘部法則”,我們所需要做的是改變K值,也就是聚類類別數目的總數。我們用一個聚類來運行K均值聚類方法。這就意味着,所有的數據都會分到一個聚類裏,然後計算成本函數或者計算畸變函數J


我們可能會得到一條類似於上圖的曲線。像一個人的肘部。這就是“肘部法則”所做的,讓我們來看這樣一個圖,看起來就好像有一個很清楚的肘。你會發現這種模式,它的畸變值會迅速下降,從1到2,從2到3之後,你會在3的時候達到一個肘點。在此之後,畸變值就下降的非常慢,看起來就像使用3個聚類來進行聚類是正確的,這是因爲那個點是曲線的肘點,畸變值下降得很快,K=3之後就下降得很慢,那麼我們就選K=3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章