kmeans 聚類


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


免責聲明!

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



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