# 手肘法調研了一下基本是畫出圖片以后,采取目測的方式選擇合適的K,# 這里我自己寫了一個獲取K的方法,好像有點不準import matplotlib.pyplot as plt
from sklearn.cluster import KMeansdef get_k_value(distortions, start_class_num =1):"""通過手肘法計算最優的k值Args:border_entity_info: Returns:k: 最優的k值"""k =0foriin range(len(distortions) - 1):if distortions[i] - distortions[i+1]<1:k = i + start_class_numbreakreturn kdef elbow_method_K(data, range_K, pro_num):K = range(1, range_K + 1)meandistortions =[]forkin K:kmeans = KMeans(n_clusters=k)kmeans.fit(data)meandistortions.append(kmeans.inertia_)best_k = get_k_value(meandistortions)plt.plot(K, meandistortions, 'bx-')plt.xlabel('k')plt.ylabel('Average Dispersion')plt.title('Selecting k with the Elbow Method')plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_elbow_K.jpg')plt.cla()return best_k
# 這個函數是我自己使用的時候封裝的# data是需要進行聚類的數據,可以是多維矩陣# range_K是類別的可選擇范圍# pro_num是名稱,沒有實際意義是為了將圖片保存下來,不想保存圖片可以直接使用plt.show()
(2)Gap Statistic
是斯坦福大學的三位教授在2001年的一篇論文中(R. Tibshirani, G. Walther, and T. Hastie, 2001)提出來的,可用于任何的聚類方法。Gap Statistic的主要思想是比較不同k時原始數據的簇內偏差總和與數據在均勻分布推斷下的簇內偏差總和。使Gap Statistic這個統計量達到最大值意味著此時的聚類結果結構與隨機均勻分布產生的數據的聚類結果差別最大,此時的k就是最優的k。算法如下: