当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K
一、概述
K-Means(K均值)是機器學習中一種常見的無監督算法,它能夠將未知標簽的數據,根據它們的特征分成不同組,每一組數據又稱為“簇”,每一簇的中心點稱為“質心”。其基本原理過程如下:
① 任意選擇K個初始質心(可以不是樣本點),為每個樣本點找到與其距離最近的質心,并將樣本點與質心歸為同一簇,從而生成K個簇;
② 當所有樣本點都被分完,對于每一個簇,重新計算新的質心(同一簇中所有點的平均坐標值);
③ 不斷迭代,直到不會質心的位置不發生改變。
可見,整個算法中,最核心的參數是K。那么K該如何確定呢?
這里我們引入輪廓系數S:
其計算公式如圖所示,其中,a表示樣本點與同一簇中所有其他點的平均距離,即樣本點與同一簇中其他點的相似度;b表示樣本點與下一個最近簇中所有點的平均距離,即樣本點與下一個最近簇中其他點的相似度。
K-Means追求的是對于每個簇而言,其簇內差異小,而簇外差異大,輪廓系數S正是描述簇內外差異的關鍵指標。由公式可知,S取值范圍為(-1, 1),當S越接近于1,則聚類效果越好,月接近-1,聚類效果越差。
接下里我們通過代碼來實現如何基于輪廓系數確定K值。
二、實踐
1、導入相關包
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score2、創建數據集并可視化
在創建數據的過程中,為了可視化效果良好,所以預先給出了centers=4,但不影響我們后面確定K值。
x, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)# 繪圖,查看數據樣本的分布 fig, ax = plt.subplots(1) fig.set_size_inches(8,6) ax.scatter(x[:, 0], x[:, 1], marker='o', s=8) plt.show()數據集一共由兩列特征組成,即橫軸和縱軸。實際應用中,數據往往會有許多列特征,一般需要先通過降維算法(如PCA)將多維特征壓縮至二維或者三維,才能可視化。觀察上圖,乍一看,數據應該能被分成4簇,但有的人覺得分成2簇(左下1簇,右上1簇),或者分成3簇(最下面1簇,中間1簇,右上1簇)也是合理的。
那么到底能分成幾類呢?這時就需要通過輪廓系數來幫我們確定。
# 給定K值(n_clusters)的范圍 n_clusters = range(2, 5)# 循環繪圖 for n in n_clusters:# 創建繪圖區域fig, ax = plt.subplots(1)fig.set_size_inches(8, 6)# 實例化cluster = KMeans(n_clusters=n,random_state=10).fit(x)# 訪問labels_屬性,獲得聚類結果y_pred = cluster.labels_# 訪問cluster_centers_屬性,獲得質心坐標centroid = cluster.cluster_centers_# 計算平均輪廓系數silhouette_avg = silhouette_score(x, y_pred)# 繪制聚類結果# y_pred==i會返回布爾數組,從而獲得那些被分為同一類的點for i in range(n):ax.scatter(x[y_pred==i, 0],x[y_pred==i, 1],marker='o',s=8,alpha=0.7) # 繪制質心ax.scatter(centroid[:, 0],centroid[:, 1],marker='x',s=30,c='k') # 設置圖表標題ax.set_title('result of KMeans(n_clusters={})'.format(n)) # 設置x軸標題ax.set_xlabel('feature_1') # 設置y軸標題ax.set_ylabel('feature_2') # 設置總標題,用來描述輪廓系數的值plt.suptitle('The average silhouette value is {:.4f}.'.format(silhouette_avg),fontsize=14, fontweight='bold')plt.show()執行代碼后,系統幫我們自動生成了3張圖,并告訴我們每張圖中,K的取值和平均輪廓系數值。可以看到K=2時,S=0.7050;K=3,S=0.5882;K=4,S=0.6505。當數據集被分為4簇時,輪廓系數比為3簇的高,因此我們舍棄K=3。然而當K=2時,得分竟然是最高的,這與我們最初創建數據集時給的真實分類centers=4是不一致的!
這恰恰說明了:
① 輪廓系數確實能幫助我們確定K的取值,并且分數越接近1,越能代表更好的聚類效果;
② 分數最高的K值,并不一定是正確的聚類結果(雖然我們可能并不知道真實的分類);
③ 實際應用中,需要緊密結合輪廓系數與業務需求,才能得到恰當的結果;
總結
以上是生活随笔為你收集整理的当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python中的seth函数_Pytho
- 下一篇: python3 爬虫 requests安
