Kmeans聚類算法的Sklearn實現


一、KMeans算法原理

1.1 KMeans算法關鍵概念:簇與質心

簇:KMeans算法將一組N個樣本的特征矩陣X划分為K個無交集的簇,直觀上看是一組一組聚集在一起的數據,在一個簇中的數據就認為是同一類。簇就是聚類的結果表現。

質心:簇中所有數據的均值U通常被認為這個簇的“質心”。

1.2 KMeans算法的實現原理

KMeans聚類算法實現的原理就是簇內數據相似性最高,不同簇類的數據的相似性最低。進而可以理解為在簇內的所有數據與質心之間的距離和最小,簇間的質心的距離越大學好,通常使用距離公式來衡量。在sklearn中KMeans通常使用簇內平方(Inertia)和來衡量簇內的距離。

實現步驟如下:

1、隨機抽取K個樣本作為最初的質心

2、開始循環:

  2.1、將每個樣本點分配到離他們最近的質心,生成K個簇

  2.2、對於每個簇,計算所有被分到該簇的樣本點的平均值作為新的質心

3、當質心的位置不再發生變化,迭代停止,聚類完成。

實現過程可參考下圖理解

二、sklearn中的KMeans使用學習

2.1、KMeans實現算法API

sklearn.cluster.KMeans( n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto', )

n_cluster:是聚類的個數,是個超參數,默認值是8;

init:是初始化質心的方法,默認“K-means++”,可選參數“random";

n_init:用不同的質心初始化值運行的次數,默認是10,每一次算法運行時開始的centroid seeds是隨機生成的, 這樣得到的結果也可能有好有壞. 所以要運行算法n_init次, 取其中最好的。

random_state:控制每次質心隨機初始化的隨機種子

max_iter:單次運行KMeans算法的最大迭代次數,默認值是300

tol:浮點型,兩次迭代之間inertia下降的量,如果兩次迭代之間Inertia下降的值小於tol所設定的值,迭代就會停下

precompute_distances:預計算距離,計算速度更快但占用更多內存 ====>類型:(auto,True,False)三個值可選,,默認值=“auto”

verbose:是否輸出詳細信息====>類型:整型,默認值=0

copy_x:是否對輸入數據繼續copy 操作====> 布爾型,默認值=True

n_jobs:使用進程的數量,與電腦的CPU有關====>類型:整型,默認值=1。

algorithm:k-means算法的種類====>(“auto”, “full” or “elkan”)三個值可選,默認值=‘auto’

“full”采用的是經典EM-style算法的。

“elkan”則在使用三角不等式時顯得更為高效,但目前不支持稀疏數據。

“auto”則在密集數據時選擇“elkan”,在稀疏數據是選擇“full”。

2.2、KMeans算法聚類評估的重要屬性 

輪廓系數:在使用KMeans進行聚類時,一般數據是沒有標簽的,這樣的聚類。是完全依賴於評價簇內的稠密成都(簇內差異小)和簇間離散程度(簇外差異大)來評估聚類的效果,其中輪廓系數是最常用的聚類算法的評價指標。它是對每個樣本來定義的,它能夠同時行兩:1)樣本與其自身所在的簇中的其他樣本的相似度a,等於樣本於同一簇中所有其他點之間的平均距離,2)樣本於其他簇中的樣本的相似度b,等於樣本與下一個最近的簇中的所有點之間的平均距離。根據聚類的要求”簇內差異小,簇外差異大”,我們希望b永遠大於a,並且大的越多越好。單個樣本的輪廓系數為:s = b-a/max(a,b).很容易理解輪廓系數范圍是(-1,1),其中值越接近1表示樣本與自己所在的簇中的樣本很相似,並且與其他簇中的樣本不相似,當樣本點與簇外的樣本更相似的時候,輪廓系數就為負。當輪廓系數為0時,則代表兩個簇中的樣本相似度一致,兩個簇本應該是一個簇。可以總結為輪廓系數越接近於1越好,負數則表示聚類效果非常差。如果一個簇中的大多數樣本具有比較高的輪廓系數,則簇會有較高的總輪廓系數,則整個數據集的平均輪廓系數越高,則聚類是合適的。如果許多樣本點具有低輪廓系數甚至負值,則聚類是不合適的,聚類的超參數K可能設定得太大或者太小。在sklearn中,我們使用模塊metrics中的類silhouette_score來計算輪廓系數,它返回的是一個數據集中,所有樣本的輪廓系數的均值。但我們還有同在metrics模塊中的silhouette_sample,它的參數與輪廓系數一致,但返回的是數據集中每個樣本自己的輪廓系數。

2.3、重要屬性與重要接口

1、cluster_centers_:收斂到的質心坐標,

2、labels_:每個樣本點對應的標簽

3、inertia_:每個樣本點到距離他們最近的簇心的均方距離,又叫做“簇內平方和”

4、n_iter_:實際的迭代次數

5、fit:擬合模型,計算K均值的聚類結果

6、fit_predict:返回每個樣本所對應的簇的索引,計算質心並且為每個樣本預測所在的簇內的索引,功能相當於fit再predict

7、get_params:獲取該類的參數

8、score:返回聚類后的inertia,即簇內平方和的負數

 3、示例代碼

3.1、構建的數據集 

 
         

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#自己創建數據集
X,Y = make_blobs(n_samples=1000,n_features=2,centers=4)
#make_blobs創建數據集,參數n_samples代表創建的數據集的個數,
#n_features代表創建數據集的特征個數,
#n_center代表創建數據的中心的個數
#X返回的使數據的個數*特征,Y返回的是屬於的類別即標簽
fig = plt.figure(figsize=(20,12))
plt.rcParams['font.family'] = 'KaiTi' # 設置字體樣式
plt.rcParams['axes.unicode_minus'] =False
plt.subplot(2,3,1)
colors = ['red','pink','orange','gray','blue','green']
for i in range(4):
plt.scatter(X[Y==i,0],X[Y==i,1],marker="o",s=8,color=colors[i])
plt.title("生成的數據集圖")
#實例化一個KMeans對象,檢測不同n_cluster下的參數
for i in range(2,7):
cluster = KMeans(n_clusters= i )
#對對象進行訓練擬合
cluster = cluster.fit(X)
y_pred = cluster.labels_#獲取訓練后對象的每個樣本的標簽
centtrod = cluster.cluster_centers_
plt.subplot(2,3,i)
for j in range(i):
plt.scatter(X[y_pred==j,0],X[y_pred==j,1],marker="o",s=8,color=colors[j])
plt.scatter(centtrod[:,0],centtrod[:,1],s=28,marker="H",color = "",edgecolors="purple")
plt.title("分了%d類的數據圖"%i)

 
         

plt.show()

 

 

 


免責聲明!

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



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