在進行聚類分析時,機器學習庫中提供了kmeans++算法幫助訓練,然而,根據不同的問題,需要尋找不同的超參數,即尋找最佳的K值
最近使用機器學習包里兩個內部評價聚類效果的方法:clf=KMeans(n_clusters=k,n_jobs=20)
其中方法一:clf.inertia_是一種聚類評估指標,我常見有人用這個。說一下他的缺點:這個評價參數表示的是簇中某一點到簇中距離的和,這種方法雖然在評估參數最小時表現了聚類的精細性,但是這種情況會出現划分過於精細的狀況,並且未考慮和簇外點的距離最大化,因此,我推薦使用方法二:
方法二:使用輪廓系數法進行K值的選擇,在此,我需要解釋一下輪廓系數,以及為何選用輪廓系數作為內部評價的標准,輪廓系數的公式為:S=(b-a)/max(a,b),其中a是單個樣本離同類簇所有樣本的距離的平均數,b是單個樣本到不同簇所有樣本的平均。
輪廓系數表示了同類樣本間距離最小化,不同類樣本間距離最大的度量
關於通過輪廓系數選擇K值得問題:
通過建立循環來選取K值
# 構造自定義函數,用於繪制不同k值和對應輪廓系數的折線圖
def k_silhouette(X, clusters):
K = range(2,clusters+1)
# 構建空列表,用於存儲個中簇數下的輪廓系數
S = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
labels = kmeans.labels_
# 調用字模塊metrics中的silhouette_score函數,計算輪廓系數
S.append(metrics.silhouette_score(X, labels, metric='euclidean'))
# 中文和負號的正常顯示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 設置繪圖風格
plt.style.use('ggplot')
# 繪制K的個數與輪廓系數的關系
plt.plot(K, S, 'b*-')
plt.xlabel('簇的個數')
plt.ylabel('輪廓系數')
# 顯示圖形
plt.show()
# 自定義函數的調用(指定原始數據和選取范圍)
k_silhouette(X, 15)
