運用三角不等式加速Kmeans聚類算法
引言:最近在刷《數據挖掘導論》,第九章, 9.5.1小節有提到,可以用三角不等式,減少不必要的距離計算,從而達到加速聚類算法的目的。這在超大數據量的情況下,尤為重要。但是書中並沒有給出解釋和證明。本文以k-means聚類算法為代表,講解下怎么利用三角不等式減少計算過程。
1. 三角不等式
任一三角形,兩邊之和大於第三邊,兩邊之差小於第三邊。可以從歐式距離擴展到多維歐幾里得空間:設任意三個向量a,b,c。d(x,y)代表x,y在空間上的距離,則三角不等式滿足:
2.K-means算法
K-mean算法
- 隨機選擇K個數據點作為初始質心
- repeat:
- 計算每一個數據點計算到現有K個質心的距離,將它歸屬到距離最近質心的所在簇中
- 重新計算質心。
- until 所有質心不再變動
3. 定義
4.三角不等式推出的引理
引理1:
=
引理2:
證明引理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,x) +d (C_i,x) \ge d(C_k,C_i) (3)$$
所以結合(1)(3):
又由假設:
這與條件中$$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已經被分配:
2.如果數據點x還未被分配
6. 改進的K-means算法
前文介紹了如何運用引理1,2 將它運用在K-means算法上,改寫的k-means算法如下:
K-mean算法
- 隨機選擇K個數據點作為初始質心
- repeat
- 計算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 - 重新計算質心。
- until 所有質心不再變動
引申
本文中只舉例了使用歐幾里得距離的K-means算法。其實本文中的d(x,y)不僅可以指代distance,更廣義的可以指代dissimilarity。任何通過度量相異性的聚類算法都可以使用三角不等式,避免多余的計算,例如計算最近鄰的DBSCAN。感興趣的讀者可以自己推導改進。