日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kmeans聚类时K值选择的方法

發(fā)布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kmeans聚类时K值选择的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.K-means算法

(1)簡單介紹

聚類屬于非監(jiān)督學(xué)習(xí),K均值聚類是最基礎(chǔ)常用的聚類算法。它的基本思想是,通過迭代尋找K個簇(Cluster)的一種劃分方案,使得聚類結(jié)果對應(yīng)的損失函數(shù)最小。其中,損失函數(shù)可以定義為各個樣本距離所屬簇中心點(diǎn)的誤差平方和:

其中 代表第 個樣本, 是 所屬的簇,代表簇對應(yīng)的中心點(diǎn), 是樣本總數(shù)。

(2)具體步驟

KMeans的核心目標(biāo)是將給定的數(shù)據(jù)集劃分成K個簇(K是超參),并給出每個樣本數(shù)據(jù)對應(yīng)的中心點(diǎn)。具體步驟非常簡單,可以分為4步:

(1)數(shù)據(jù)預(yù)處理。主要是標(biāo)準(zhǔn)化、異常點(diǎn)過濾。

(2)隨機(jī)選取K個中心,記為

(3)定義損失函數(shù):

(4)令t=0,1,2,… 為迭代步數(shù),重復(fù)如下過程直到收斂:

(4.1)對于每一個樣本 ,將其分配到距離最近的中心

(4.2)對于每一個類中心k,重新計算該類的中心


KMeans最核心的部分就是先固定中心點(diǎn),調(diào)整每個樣本所屬的類別來減少 J;再固定每個樣本的類別,調(diào)整中心點(diǎn)繼續(xù)減小J 。兩個過程交替循環(huán), J單調(diào)遞減直到最(極)小值,中心點(diǎn)和樣本劃分的類別同時收斂。

2.K值的選取方法

(1)手肘法

手肘法將簇間誤差平方和看成是類簇數(shù)量k的函數(shù)。隨著k的增加,每個類簇內(nèi)的離散程度越小,總距離平方和也就在不斷減小,并且減小的程度越來越不明顯。極限情況是當(dāng)k=N時,每個類簇只有一個點(diǎn),這時總的誤差平方和為0。手肘法認(rèn)為我們應(yīng)該選擇這樣的k:當(dāng)k繼續(xù)增大時,總誤差平方和減少的趨勢不再明顯,也就是“拐點(diǎn)”處。具體過程如下:

  • 選擇一個聚類算法(例如K-means),計算不同k時的聚類結(jié)果,例如k可以取為0~10。
  • 對每個k,計算總的簇間距離平方和。
  • 畫出總簇間距離平方和隨k值增加的變化趨勢。
  • 圖中彎曲的“拐點(diǎn)”處對應(yīng)的k就是最合適的類簇數(shù)量
  • # 手肘法調(diào)研了一下基本是畫出圖片以后,采取目測的方式選擇合適的K, # 這里我自己寫了一個獲取K的方法,好像有點(diǎn)不準(zhǔn) import matplotlib.pyplot as plt from sklearn.cluster import KMeansdef get_k_value(distortions, start_class_num = 1):"""通過手肘法計算最優(yōu)的k值A(chǔ)rgs:border_entity_info: Returns:k: 最優(yōu)的k值"""k = 0for i in 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 = []for k in 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 # 這個函數(shù)是我自己使用的時候封裝的 # data是需要進(jìn)行聚類的數(shù)據(jù),可以是多維矩陣 # range_K是類別的可選擇范圍 # pro_num是名稱,沒有實(shí)際意義是為了將圖片保存下來,不想保存圖片可以直接使用plt.show()

    (2)Gap Statistic

    是斯坦福大學(xué)的三位教授在2001年的一篇論文中(R. Tibshirani, G. Walther, and T. Hastie, 2001)提出來的,可用于任何的聚類方法。Gap Statistic的主要思想是比較不同k時原始數(shù)據(jù)的簇內(nèi)偏差總和與數(shù)據(jù)在均勻分布推斷下的簇內(nèi)偏差總和。使Gap Statistic這個統(tǒng)計量達(dá)到最大值意味著此時的聚類結(jié)果結(jié)構(gòu)與隨機(jī)均勻分布產(chǎn)生的數(shù)據(jù)的聚類結(jié)果差別最大,此時的k就是最優(yōu)的k。算法如下:

  • 將原始的觀測數(shù)據(jù)進(jìn)行聚類,k=0,…, k_max,計算不同k值對應(yīng)的簇內(nèi)偏離和W_k。
  • 通過隨機(jī)的均勻分布產(chǎn)生B個推斷數(shù)據(jù),對這些推斷數(shù)據(jù)進(jìn)行聚類,k=0,…, k_max。計算不同k值對應(yīng)的在B個推斷數(shù)據(jù)上的平均簇內(nèi)偏離和W_kb。
  • 計算gap statistic:W_k與W_kb的log偏差Gap(k)。同時計算這個偏差的標(biāo)準(zhǔn)差sd_k,然后令s_k = sprt(1+1/B*sd_k)。
  • 選擇一個最小的k,這樣的k滿足Gap(k) > Gap(k+1) - s_k+1。
    流行的做法是直接選擇最大的Gap(k)所對應(yīng)的k作為最優(yōu)k,也就是忽略上述的第四步。需要注意的是當(dāng)B=500時,W_kb是非常精確的,在下一次迭代中基本保持不變。
    注意??:使用這個需要安裝一個庫,具體信息可以看Gap Statistic
  • from gap_statistic import OptimalKef gap_statistic_K(data, range_K, pro_num):K = np.arange(1, range_K)optimalK = OptimalK(n_jobs=1, parallel_backend='joblib')n_clusters = optimalK(data, cluster_array=K)# Gap values plotplt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df.gap_value, linewidth=3)plt.scatter(optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].n_clusters,optimalK.gap_df[optimalK.gap_df.n_clusters == n_clusters].gap_value, s=250, c='r')plt.grid(True)plt.xlabel('Cluster Count')plt.ylabel('Gap Value')plt.title('Gap Values by Cluster Count')plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_gap_values_K.jpg')plt.cla()# plt.show()# # diff plot# plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["diff"], linewidth=3)# plt.grid(True)# plt.xlabel("Cluster Count")# plt.ylabel("Diff Value")# plt.title("Diff Values by Cluster Count")# # plt.show()# plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_diff_2.jpg')# plt.cla()# Gap* plot# max_ix = optimalK.gap_df[optimalK.gap_df["gap*"] == optimalK.gap_df["gap*"].max()].index[0]# plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["gap*"], linewidth=3)# plt.scatter(# optimalK.gap_df.loc[max_ix]["n_clusters"],# optimalK.gap_df.loc[max_ix]["gap*"],# s=250,# c="r",# )# plt.grid(True)# plt.xlabel("Cluster Count")# plt.ylabel("Gap* Value")# plt.title("Gap* Values by Cluster Count")# plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_Gap*_3.jpg')# plt.cla()# plt.show()# # diff* plot# plt.plot(optimalK.gap_df.n_clusters, optimalK.gap_df["diff*"], linewidth=3)# plt.grid(True)# plt.xlabel("Cluster Count")# plt.ylabel("Diff* Value")# plt.title("Diff* Values by Cluster Count")# plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_diff*_4.jpg')# plt.cla()# plt.show()return n_clusters

    (3)平均輪廓系數(shù)法

    平均輪廓系數(shù)方法衡量了聚類結(jié)果的質(zhì)量,即衡量每個點(diǎn)被放到當(dāng)前類簇有多合適,平均輪廓系數(shù)很高意味著聚類的結(jié)果很好。這種方法計算不同k值下,所有點(diǎn)的平均輪廓系數(shù),能夠使平均輪廓系數(shù)最大的k就是最優(yōu)的類簇數(shù)量(Kaufman and Rousseeuw 1990)。
    具體的過程與手肘法是相似的:

  • 選擇一個聚類算法(例如K-means),計算不同k時的聚類結(jié)果,例如k可以取為0~10。
  • 對于每個k,計算所有觀測點(diǎn)的平均輪廓系數(shù)。
  • 畫出這個指標(biāo)隨著k變化的曲線。
  • 曲線中最高點(diǎn)對應(yīng)的k就是最優(yōu)聚類數(shù)量。
  • from sklearn.metrics import silhouette_score from sklearn.cluster import KMeansdef get_silhouette_K(data, range_K, pro_num):K = range(2, range_K)Scores = [] for k in K:kmeans = KMeans(n_clusters=k)kmeans.fit(data)Scores.append(silhouette_score(data, kmeans.labels_, metric='euclidean'))max_idx = Scores.index(max(Scores))best_k = K[max_idx]plt.plot(K, Scores, 'bx-')plt.xlabel('k')plt.ylabel('silhouette')plt.title('Selecting k with the silhouette Method')plt.savefig(f'/Users/cecilia/Desktop/K_圖片/{pro_num}_silhouette_K.jpg')plt.cla()return best_k # 這個函數(shù)是我自己使用的時候封裝的 # data是需要進(jìn)行聚類的數(shù)據(jù),可以是多維矩陣 # range_K是類別的可選擇范圍 # pro_num是名稱,沒有實(shí)際意義是為了將圖片保存下來,不想保存圖片可以直接使用plt.show()

    注意??:在使用輪廓系數(shù)法時,遇到一個問題就是K值的選擇必須從2開始,最多只能選擇n_samples -1(最大K候選就是樣本數(shù)量-1),不然會報錯的,具體沒有細(xì)細(xì)研究。

    總結(jié)

    以上是生活随笔為你收集整理的Kmeans聚类时K值选择的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。