說明:
KMeans 聚類中的超參數是 K,需要我們指定。K 值一方面可以結合具體業務來確定,另一方面可以通過肘方法來估計。K 參數的最優解是以成本函數最小化為目標,成本函數為各個類畸變程度之和,每個類的畸變程度等於該類重心與其內部成員位置距離的平方和但是平均畸變程度會隨着K的增大先減小后增大,所以可以求出最小的平均畸變程度。
1、示例
# 導入相關模塊
from sklearn.datasets import make_blobs from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 創建仿真聚類數據集
X, y = make_blobs(n_samples=150, n_features=2, centers=3, cluster_std=0.5, shuffle=True, random_state=0) distortions = [] Ks = range(1, 11) # 為不同的超參數擬合模型
for k in Ks: km = KMeans(n_clusters=k, init='k-means++', n_init=10, max_iter=300, n_jobs=-1, random_state=0) km.fit(X) distortions.append(km.inertia_) # 保存不同超參數對應模型的聚類偏差
plt.rcParams['font.sans-serif'] = 'SimHei' plt.figure('百里希文', figfacecolor='lightyellow') # 繪制不同超參 K 對應的離差平方和折線圖
plt.plot(Ks, distortions,'bo-', mfc='r') plt.xlabel('簇中心的個數 k') plt.ylabel('離差平方和') plt.title('用肘方法確定 kmeans 聚類中簇的最佳數量') plt.show()
按語:
由上圖可知,K 從 1 到 2, 從 2 到 3 的過程中,離差平方和減少的都相當明顯,而 K 從 3 到 4,乃至 4 以后,離差平方和減少的都很有限,所以最佳的 K 值應該為 3(與仿真數據集的參數對對應)。由於上圖看上去很像一只手肘,理論上最佳的 K 值在肘處取得,故而得名。
2、用平均離差效果似乎更明顯
# 導入相關模塊
import numpy as np from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from scipy.spatial.distance import cdist import matplotlib.pyplot as plt # 創建仿真聚類數據集
X, y = make_blobs(n_samples=150, n_features=2, centers=3, cluster_std=0.5, shuffle=True, random_state=0) meanDispersions = [] Ks = range(1, 11) # 為不同的超參數擬合模型
for k in Ks: km = KMeans(n_clusters=k, init='k-means++', n_init=10, max_iter=300, n_jobs=-1, random_state=0) km.fit(X) meanDispersions.append(sum( np.min(cdist(X, km.cluster_centers_, 'euclidean'), axis=1))/X.shape[0]) # 保存不同超參數對應模型的聚類偏差
plt.rcParams['font.sans-serif'] = 'SimHei' plt.figure('百里希文', facecolor='lightyellow') # 繪制不同超參 K 對應的離差平方和折線圖
plt.plot(Ks, meanDispersions,'bo-', mfc='r') plt.xlabel('簇中心的個數 k') plt.ylabel('平均離差') plt.title('用肘方法確定 kmeans 聚類中簇的最佳數量') plt.show()
圖形: