運用三角不等式加速Kmeans聚類算法


運用三角不等式加速Kmeans聚類算法


引言:最近在刷《數據挖掘導論》,第九章, 9.5.1小節有提到,可以用三角不等式,減少不必要的距離計算,從而達到加速聚類算法的目的。這在超大數據量的情況下,尤為重要。但是書中並沒有給出解釋和證明。本文以k-means聚類算法為代表,講解下怎么利用三角不等式減少計算過程。


1. 三角不等式

任一三角形,兩邊之和大於第三邊,兩邊之差小於第三邊。可以從歐式距離擴展到多維歐幾里得空間:設任意三個向量a,b,c。d(x,y)代表x,y在空間上的距離,則三角不等式滿足:

\[d(a,b)+d(b,c)\ge d(a,c) , d(a,b) - d(b,c) \le d(a,c) \]

2.K-means算法

K-mean算法

  1. 隨機選擇K個數據點作為初始質心
  2. repeat
  3.   計算每一個數據點計算到現有K個質心的距離,將它歸屬到距離最近質心的所在簇中
  4.   重新計算質心。
  5. until 所有質心不再變動

3. 定義

\[假設存在數據點集 X=\{x_1, x_2,..,x_n\} , 質心的集合C=\{ C_1,C_2,...,C_m\}, 對應的簇集合為S=\{ S_1,S_2,...,S_m\}。 \]

4.三角不等式推出的引理

引理1:

\[設 C_i ,C_j(i\neq j )\in C, x \in X。如果2 d(x,C_i) \le d(C_i,C_j) ,那么d(C_i,x) \le d(C_j,x) 。 \]

=

引理2:

\[ 設C_i \in C, \exists C_j \in C,使得d(C_i,C_j) = min \ d(C_i,C)。對於數據點x \in X,若有2 d(x,C_i) \le d(C_i,C_j),\ 那么min \ d(x,C) = d(C_i,x)。(記d(x,C)是x到所有質心的距離)\]

證明引理1:

因為有 $$2 d(C_i,x) \le d(C_i,C_j) \ (1)$$
且由三角不等式:$$ d(C_i,C_j) \le d(x,C_i) + d(x,C_j) \ (2)$$
所以 $$2 d(C_i,x) \le d(x,C_i) + d(x,C_j),即d(C_i,x) \le d(C_j,x)$$

證明引理2:

運用反證法:
假設 $$ \exists C_k \in C,使得d(C_k,x) < d(C_i,x), $$
由題干有:

\[d(C_k,C_i) \ge d(C_i,C_j) (1) , d(x,C_i) \le d(C_i,C_j) (2) \]

又因為 $$ d(C_k,x) +d (C_i,x) \ge d(C_k,C_i) (3)$$
所以結合(1)(3):

\[d(C_k,x) +d (C_i,x) \ge d(C_i,C_j) (4) \]

又由假設:

\[2d(C_i,x) > d(C_i,C_j) (5) \]

這與條件中$$2 d(x,C_i) \le d(C_i,C_j)$$相矛盾,所以可知假設不成立。
即 $$min \ d(x,C) = d(C_i,x)$$

5.運用引理1,引理2減少不必要的距離計算

首先$$對於每一個C_i,用一個hash表存放與它最近的距離 d(C_i,C_j)。$$

1.如果數據點x已經被分配:

\[則x與它目前所在簇的質心的距離為d(C_i,x),與d(C_i,C_j)比較。 \]

\[如果 2 d(C_i,x) \le d(C_i,C_j),則說明不需要更換x的歸屬。\\(注意反之: 2 d(C_i,x) \gt d(C_i,C_j)),並不能說明x應該數據 C_j所在的簇,所以還需要繼續計算x與每個質心的距離。) \]

2.如果數據點x還未被分配

\[則需要遍歷計算, \forall C_i \in C, 比較 2 d(C_i ,x) \le d(C_i,C_j)是否成立,若成立,說明x應當歸屬 C_i ,無需再計算其他距離。 \]

6. 改進的K-means算法

前文介紹了如何運用引理1,2 將它運用在K-means算法上,改寫的k-means算法如下:

K-mean算法

  1. 隨機選擇K個數據點作為初始質心
  2. repeat
  3.  計算k個質心間的距離,並且用hash表保存每個質心的到其他質心的最短距離。(用d(Ci,Cj)表示質心Ci和它最近質心是Cj的距離)。
    4.  repeat
        對於每個數據點x
        if(數據點x已分配在質心Ci所在簇)
         if 2d(Ci,x) <=d(Ci,Cj)
          x分配無需變動;
         else
          繼續計算x到現有K個質心的距離,將它歸屬到距離最近質心的所在簇中
          end if
        else(數據點x未分配到任何簇)
         for i from 0 to K do
          if 2d(Ci,x) <=d(Ci,Cj)
           將x歸屬到Ci所在簇中
           退出for循環
          end if
          end for
        end if
  4.   重新計算質心。
  5. until 所有質心不再變動

引申

本文中只舉例了使用歐幾里得距離的K-means算法。其實本文中的d(x,y)不僅可以指代distance,更廣義的可以指代dissimilarity。任何通過度量相異性的聚類算法都可以使用三角不等式,避免多余的計算,例如計算最近鄰的DBSCAN。感興趣的讀者可以自己推導改進。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM