1. 程式人生 > >機器學習 - K-Means、K-Means++ 以及 ISOData

機器學習 - K-Means、K-Means++ 以及 ISOData

機器學習 - K-Means、K-Means++ 以及 ISOData

K-Means、K-Means++ 以及 ISOData 都是聚類演算法,它們通過計算樣本點到聚類中心的距離來進行類別劃分。下面分別介紹這三種方法。

  • K-Means

    “物以類聚,人以群分”,K-Means 演算法就是降相似的樣本劃定為同一類別,而其中的 K 是指將資料聚成 K 類。

    演算法步驟:

    1. 從資料集構成的樣本空間中隨機選取 K 個聚類中心 C
      = { c 1 , c 2
      , . . . , c k
      } C=\{c_1,c_2,...,c_k\}
    2. 對每一個樣本 x i x_i 計算其到 K 個聚類中心的距離,即每個樣本 x i x_i 計算 K 個距離 D k , x i = { D c 1 , D c 2 , . . . , D c k x i } D_{k,x_i}=\{D_{c_1},D_{c_2},...,D_{c_k}|x_i\} ,並將距離最近的中心所代表的類別設為 x i x_i 類別。
    3. 針對每個中心 c 1 , c 2 , . . . , c k c_1,c_2,...,c_k ,分別計算各自從屬它們的所有樣本的中心: c j = 1 N c j x c j x i j = 1 , 2 , . . . , k c_j=\frac{1}{N_{c_j}}\sum_{x∈c_j}x_i,j=1,2,...,k
    4. 重複 2,3 步直到聚類中心不在變化,或變化小於某一閾值

    對於 K-Means 演算法,類別個數 K 的選取十分重要:

    1. K 值越小,模型越欠擬合,偏差越大,對資料不能充分學習(一個簇類包含了一半的資料,效果應該不會太好)。

    2. K 值越大,模型越容易過擬合,方差越大,對噪聲敏感。(有可能將幾個噪聲點也劃分出一個類別,這也是不好的)

      (對偏差與方差的講解可參照此文 機器學習 - KNN、偏差與方差

    對於 K 值,要與 KNN 中的 K 有所區分

    1. KNN 中的 K 是指被分類樣本類別的決策,受周圍 K 個樣本影響;
    2. K-Means 中的 K 是指最終樣本要被劃分成 K 個類別。

    在 K-Means 演算法中,第一步:初始聚類中心的選取也非常重要,K-Means 對初始聚類中心是敏感的,會影響到最終的聚類結果。

    針對 K-Means 演算法對於 K 值地選取以及初始聚類中心的選取兩個薄弱點,可以適用 K-Means++ 與 ISOData 方法進行改進。

  • K-Means++

    K-Means++ 的改進思想為:對於初始聚類中心,我們儘可能地讓各聚類中心之間距離儘可能地遠,也就是讓聚類劃分的類別之間區別儘量明顯。

    假設 K = 4 K=4

    1. 從資料集中隨機選取 1 個樣本最為第一個初始聚類中心 : c 1 = x r a n d o m c_1=x_{random}

    2. 而後對每一個樣本點計算其到所有 已有中心 的距離,並選取最小值設為此樣本的 D ( x ) D(x)

    3. 計算每個樣本被選為下一個聚類中心的概率 P ( x ) = D 2 ( x ) x X D 2 ( x ) P(x)=\frac{D^2(x)}{\sum_{x∈X} D^2(x)} ,並計算所有樣本按序號順序排列後的累積概率 P s u m ( x i ) P_{sum}(x_i) ,並以此生成累計概率分佈。

      例如, P ( x 1 ) = 0.3 , P ( x 2 ) = 0.4 , P ( x 3 ) = 0.3 P(x_1)=0.3,P(x_2)=0.4,P(x_3)=0.3 ,則 P s u m ( x 2 ) = 0.3 + 0.4 = 0.7 , P s u m ( x 3 ) = 0.7 + 0.3 = 0.8 P_{sum}(x_2)=0.3+0.4=0.7,P_{sum}(x_3)=0.7+0.3=0.8

      樣本序號 x 1 x_1 x 2 x_2 x 3 x_3
      P ( x i ) P(x_i) 0.3 0.4 0.3
      P s u m ( x i ) P_{sum}(x_i) 0.3 0.7 1
    4. P s u m ( x i ) P_{sum}(x_i)