K-Means 聚類是最常用的一種聚類算法,它的思想很簡單,對於給定的樣本集和用戶事先給定的 K 的個數,將數據集里所有的樣本划分成 K 個簇,使得簇內的點盡量緊密地連在一起,簇間的距離盡量遠。由於每個簇的中心點是該簇中所有點的均值計算而得,因此叫作 K-Means 聚類。
算法過程
(1)從所有樣本中隨機選擇 K 個樣本作為初始的聚類中心。
(2)計算每個樣本到各個初始聚類中心的距離,將樣本分配到距離最近的類中(通常使用歐氏距離)。
(3)將所有樣本都分配完畢后,重新計算 K 個聚類的中心,新的聚類中心即是該簇所有點的平均值。
(4)重復步驟(2)~(3)。
(5)當聚類中心不再發生變化或滿足一定條件后,結束聚類。
算法的優缺點
優點:
(1)需要調節的參數只有聚類數目 K。
(2)對於大數據集,算法相對可伸縮和高效,計算的復雜度較低。
缺點:
(1)K-Means 聚類的結果很大程度上依賴於一開始隨機選擇的聚類中心,可能會導致最終的結果只是局部最優。為了獲得最理想的結果,通常需要多次運行 K-Means 算法,選擇不同的隨機初始聚類中心,觀察結果。
(2)K 值需要事先指定,但一般很難選擇,需要多次嘗試。
(3)對噪聲點和異常值十分敏感。
(4)只適用於數值類型的樣本數據,不適用於名義類型的樣本數據。
使用python進行kmeans聚類
假設我們要解決一個這樣的問題。
以下是一些同學,大萌是一個學霸,而我們想要找到這些人中的潛在學霸,所以我們要把這些人分為兩類——學霸與非學霸。
高數 | 英語 | Python | 音樂 | |
---|---|---|---|---|
小明 | 88 | 64 | 96 | 85 |
大明 | 92 | 99 | 95 | 94 |
小朋 | 91 | 87 | 99 | 95 |
大朋 | 78 | 99 | 97 | 81 |
小萌 | 88 | 78 | 98 | 84 |
大萌 | 100 | 95 | 100 | 92 |
1 方法一:使用scipy
那么使用scipy的Python實現的代碼如下:
import numpy as np
from scipy.cluster.vq import vq,kmeans,whiten
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
data=np.array([list1, list2, list3, list4, list5, list6])
whiten=whiten(data) # 算出各列元素的標准差,形成一個新的數組
centroids,_=kmeans(whiten,2)
result,_=vq(whiten,centroids)
print(result)
其中,kmeans()
函數的功能是對數據進行聚類,返回結果是一個元組,其中我們只需要它的第一個值,這是一個聚類中心數組。vq()
函數的功能是矢量量化數據,它可以對每一個數據,也就是對我們這邊的每一個人進行歸類。
結果如下:
[1 0 0 1 1 0]
說明大明、小朋和大萌都是學霸組的。
需要說明的是,kmeans找到的只是一個局部最優解,而不是全局。
2 方法二:使用sklearn
那么使用sklearn的Python實現的代碼如下:
import numpy as np
from sklearn.cluster import KMeans
list1=[88.0,74.0,96.0,85.0]
list2=[92.0,99.0,95.0,94.0]
list3=[91.0,87.0,99.0,95.0]
list4=[78.0,99.0,97.0,81.0]
list5=[88.0,78.0,98.0,84.0]
list6=[100.0,95.0,100.0,92.0]
X=np.array([list1, list2, list3, list4, list5, list6])
kmeans=KMeans(n_clusters=2).fit(X)
pred=kmeans.predict(X)
print(pred)
其中,fit()
方法是對Kmeans確定類別以后的數據集進行聚類,而predict()
是根據聚類結果,確定所屬類別。
結果如下:
[0 1 1 1 0 1]
說明這次大明、小朋、大朋和大萌都是學霸組的。
再次說明,kmeans找到的只是局部最優解。
【參考】
[1] Coursera課程《用Python玩轉數據》
[2] 裔雋,張懌檬,張目清等.Python機器學習實戰[M].北京:科學技術文獻出版社,2018