1. 程式人生 > >聚類分析(一):K均值聚類與層次聚類

聚類分析(一):K均值聚類與層次聚類

介紹三類聚類分析演算法,本篇介紹K均值聚類、層次聚類,下篇介紹圖團體(graph community)聚類。

聚類分析又稱群分析,它是研究樣本分類問題的一種統計分析方法,同時也是資料探勘的一個重要演算法。聚類分析以相似性為基礎,在一個聚類(cluster)中的樣本模式之間比不在同一聚類中的樣本模式之間具有更多的相似性

K均值聚類

演算法描述:演算法隨機將每個樣本分配到K聚類中的一類,然後計算每個聚類的平均值。接下來,它重新將每個樣本分配到與其最接近的均值的聚類,然後再重新計算每個聚類的均值。然後不斷重複這一步,直到不再需要新的分配為止。

我們通過下面的例子來學習這個演算法。

例子中我們有統計了9位博主以及他們的文章數量,我們按文章的數量的相似度對這些博主進行聚類分析:

姓名 部落格文章數量
a 20
b 19
c 1
d 10
e 15
f 3
g 21
h 2
i 13

K均值聚類演算法的一個缺點是我們需要事先預測會有多少個聚類,也就是確定K的的取值,實際問題中,我們可以嘗試K取不同的值,然後在具體問題的上下文中評價這幾個聚類的效果,最後取效果最好的K值。這裡,我們暫時先設定K=3.

演算法過程如下:

1,隨機把這些博主分成K=3三類,計算每類的平均文章數量:

類號 類成員 類平均文章數量
1 a,b,c (20+19+1)/3 = 13.3
2 d,e,f (10+15+3)/3 = 9.3
3 g,h,i (21+2+13)/3 = 12

2,遍歷每一位博主,重新分配博主所在的類,使得博主的文章數與該類當前平均文章數距離最小,數值最接近。然後重新計算每類的平均文章數。

類號 類成員 類平均文章數量
1 a,b,e,g,i (20+19+15+21+13)/5 = 17.6
2 c,d,f,h (1+10+3+2)/4 = 4
3 0

3,不斷重複第2步,直到不需要重新分類。

類號 類成員 類平均文章數量
1 a,b,e,g,i (20+19+15+21+13)/5=17.6
2 d,f (10+3)/2=6.5
3 c,h (1+2)/2=1.5
類號 類成員 類平均文章數量
1 a,b,e,g,i (20+19+15+21+13)/5=17.6
2 d 10
3 c,f,h (1+3+2)/3=2
類號 類成員 類平均文章數量
1 a,b,e,g (20+19+15+21)/4 = 18.8
2 d 10
3 c,f,h,i (1+3+2+13)/4 = 4.8
類號 類成員 類平均文章數量
1 a,b,e,g (20+19+15+21)/4 = 18.8
2 d,i (10+13)/2 = 11.5
3 c,f,h (1+3+2)/3=2
類號 類成員 類平均文章數量
1 a,b,g (20+19+21)/3=20
2 d,e,i (10+15+13)/3 = 12.7
3 c,f,h (1+3+2)/3=2

4,聚類過程完成:可以發現,達到上面最後聚類狀態後,每位博主的類就不再變化,每類的平均文章數量也不在出現變化。而且同一類中的博主,文章數量比較接近,不同類的博主文章數量相差較大。從聚類結果可以看出哪些博主屬於比較活躍的博主,哪些是相對不活躍的博主。

補充說明:

1,讀者可以按照這種方式,自己推導看看K=2的時候,演算法過程是怎樣的。

2,上面所描述的演算法還有一些變體。最初的「種子」聚類可以通過多種方式完成。這裡,我們是把所有博主隨機分成K類,然後計算每類的均值。這會導致最初的均值可能會彼此接近,這會增加後面迭代的次數。(隨機選初始點會增加計算量)

另一種選擇種子聚類的方法是每類僅分配一個數據,然後開始將其他資料分配到與其最接近的類。這樣返回的聚類是更敏感的初始種子,從而減少了高度變化的資料集中的重複性。這種方法有可能減少完成該演算法所需的迭代次數,因而這些分類實現收斂的時間會變得更少。

3,K-均值聚類的一個明顯限制是你必須事先設定K的取值,也就是事先預測類別數量。如何選擇K值呢?目前存在一些用於評估聚類效果的方法。比如說,聚類內平方和(Within-Cluster Sum-of-Squares)可以測量每個聚類內的方差。聚類越好,整體WCSS就越低。但要知道評估的標準不止這一個。

層次聚類

我們依然使用上面的博主資料來分析層次聚類:

姓名 部落格文章數量
a 20
b 19
c 1
d 10
e 15
f 3
g 21
h 2
i 13

演算法過程

1,計算博主之間文章數量距離矩陣,在本案例中使用的是歐氏空間距離(Euclidean distance)

- a(20) b(19) c(1) d(10) e(15) f(3) g(21) h(2) i(13)
a(20)
b(19) 1
c(1) 19 18
d(10) 10 9 9
e(15) 5 4 14 5
f(3) 17 16 2 7 12
g(21) 1 2 20 11 6 18
h(2) 18 17 1 8 13 1 19
i(13) 7 6 12 3 2 10 8 11

2,將矩陣中距離最小的兩個博主合併,計算兩位博主的平均文章數量。兩位博主合併後一起參與計算;首先我們合併a,b兩位博主,他們的平均文章數量是19.5:

- ab(19.5) c(1) d(10) e(15) f(3) g(21) h(2) i(13)
ab(19.5)
c(1) 18.5
d(10) 9.5 9
e(15) 4.5 14 5
f(3) 16.5 2 7 12
g(21) 1.5 20 11 6 18
h(2) 17.5 1 8 13 1 19
i(13) 6.5 12 3 2 10 8 11

3,重複第2步:

合併c,h:

- ab(19.5) ch(1.5) d(10) e(15) f(3) g(21) i(13)
ab(19.5)
ch(1.5) 18
d(10) 9.5 8.5
e(15) 4.5 13.5 5
f(3) 16.5 1.5 7 12
g(21) 1.5 19.5 11 6 18
i(13) 6.5 11.5 3 2 10 8

合併ch,和f:

- ab(19.5) cfh(2) d(10) e(15) g(21) i(13)
ab(19.5)
cfh(2) 17.5
d(10) 9.5 8
e(15) 4.5 13 5
g(21) 1.5 19 11 6
i(13) 6.5 11 3 2 8

合併ab,和g:

- abg(20) cfh(2) d(10) e(15) i(13)
abg(20)
cfh(2) 18
d(10) 10 8
e(15) 5 13 5
i(13) 7 11 3 2

合併e,i:

- abg(20) cfh(2) d(10) ei(14)
abg(20)
cfh(2) 18
d(10) 10 8
ei(14) 6 12 4

合併ei,d:

- abg(20) cfh(2) dei(12.7)
abg(20)
cfh(2) 18
dei(12.7) 7.3 10.7

合併abg,edi:

- abdegi(16.3) cfh(2)
abdegi(16.3)
cfh(2) 14.3

最後,全部合併:

- abcdefghi(11.5)
abcdefghi(11.5)

我們得到一個樹狀的結構:

abcdefghi(14.3){abdegi(7.3){abg(1.5){ab(1){abgdei(4){ei(2){eidcfh(1.5){ch(1){chf

補充說明:

1,最後的樹狀圖中每個節點由兩個子節點聚合而形成,小括號內的數字表示兩個子節點聚合時的距離。

2,每個節點表示一種聚合而成的型別。

3,可以通過控制聚合距離的閾值,來控制聚合的程度。閾值越小,聚合的型別越多,每個型別的內聚度越高,閾值越大,聚合的型別越少,每個型別的內聚度越低。例如我們設定閾值為1,那麼最後聚合的型別為ab,ch,d,e,i;距離閾值為2時,最後聚合的型別為abg, cfh, d, ei;聚合閾值為4時候,最後聚合的型別為abg, cfh, dei,可以看到,這個結果與k-means的結果一樣了。