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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

K-means聚类最优k值的选取

發(fā)布時(shí)間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K-means聚类最优k值的选取 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?????? 最近做了一個(gè)數(shù)據(jù)挖掘的項(xiàng)目,挖掘過(guò)程中用到了K-means聚類方法,但是由于根據(jù)行業(yè)經(jīng)驗(yàn)確定的聚類數(shù)過(guò)多并且并不一定是我們獲取到數(shù)據(jù)的真實(shí)聚類數(shù),所以,我們希望能從數(shù)據(jù)自身出發(fā)去確定真實(shí)的聚類數(shù),也就是對(duì)數(shù)據(jù)而言的最佳聚類數(shù)。為此,我查閱了大量資料和博客資源,總結(jié)出主流的確定聚類數(shù)k的方法有以下兩類。

1.手肘法

1.1 理論

手肘法的核心指標(biāo)是SSE(sum of the squared errors,誤差平方和),


其中,Ci是第i個(gè)簇,p是Ci中的樣本點(diǎn),mi是Ci的質(zhì)心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。

?????? 手肘法的核心思想是:隨著聚類數(shù)k的增大,樣本劃分會(huì)更加精細(xì),每個(gè)簇的聚合程度會(huì)逐漸提高,那么誤差平方和SSE自然會(huì)逐漸變小。并且,當(dāng)k小于真實(shí)聚類數(shù)時(shí),由于k的增大會(huì)大幅增加每個(gè)簇的聚合程度,故SSE的下降幅度會(huì)很大,而當(dāng)k到達(dá)真實(shí)聚類數(shù)時(shí),再增加k所得到的聚合程度回報(bào)會(huì)迅速變小,所以SSE的下降幅度會(huì)驟減,然后隨著k值的繼續(xù)增大而趨于平緩,也就是說(shuō)SSE和k的關(guān)系圖是一個(gè)手肘的形狀,而這個(gè)肘部對(duì)應(yīng)的k值就是數(shù)據(jù)的真實(shí)聚類數(shù)。當(dāng)然,這也是該方法被稱為手肘法的原因。

1.2 實(shí)踐

我們對(duì)預(yù)處理后數(shù)據(jù).csv 中的數(shù)據(jù)利用手肘法選取最佳聚類數(shù)k。具體做法是讓k從1開始取值直到取到你認(rèn)為合適的上限(一般來(lái)說(shuō)這個(gè)上限不會(huì)太大,這里我們選取上限為8),對(duì)每一個(gè)k值進(jìn)行聚類并且記下對(duì)于的SSE,然后畫出k和SSE的關(guān)系圖(毫無(wú)疑問(wèn)是手肘形),最后選取肘部對(duì)應(yīng)的k作為我們的最佳聚類數(shù)。python實(shí)現(xiàn)如下:

import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as pltdf_features = pd.read_csv(r'C:\預(yù)處理后數(shù)據(jù).csv',encoding='gbk') # 讀入數(shù)據(jù) '利用SSE選擇k' SSE = [] # 存放每次結(jié)果的誤差平方和 for k in range(1,9):estimator = KMeans(n_clusters=k) # 構(gòu)造聚類器estimator.fit(df_features[['R','F','M']])SSE.append(estimator.inertia_) X = range(1,9) plt.xlabel('k') plt.ylabel('SSE') plt.plot(X,SSE,'o-') plt.show()畫出的k與SSE的關(guān)系圖如下:


顯然,肘部對(duì)于的k值為4,故對(duì)于這個(gè)數(shù)據(jù)集的聚類而言,最佳聚類數(shù)應(yīng)該選4

2. 輪廓系數(shù)法

2.1 理論

該方法的核心指標(biāo)是輪廓系數(shù)(Silhouette Coefficient),某個(gè)樣本點(diǎn)Xi的輪廓系數(shù)定義如下:

???????????????????????????????????????????????????????????

其中,a是Xi與同簇的其他樣本的平均距離,稱為凝聚度,b是Xi與最近簇中所有樣本的平均距離,稱為分離度。而最近簇的定義是

?????????????????????????????????????????????? ? ? ?

其中p是某個(gè)簇Ck中的樣本。事實(shí)上,簡(jiǎn)單點(diǎn)講,就是用Xi到某個(gè)簇所有樣本平均距離作為衡量該點(diǎn)到該簇的距離后,選擇離Xi最近的一個(gè)簇作為最近簇。

?????? 求出所有樣本的輪廓系數(shù)后再求平均值就得到了平均輪廓系數(shù)。平均輪廓系數(shù)的取值范圍為[-1,1],且簇內(nèi)樣本的距離越近,簇間樣本距離越遠(yuǎn),平均輪廓系數(shù)越大,聚類效果越好。那么,很自然地,平均輪廓系數(shù)最大的k便是最佳聚類數(shù)。

2.2 實(shí)踐

我們同樣使用2.1中的數(shù)據(jù)集,同樣考慮k等于1到8的情況,對(duì)于每個(gè)k值進(jìn)行聚類并且求出相應(yīng)的輪廓系數(shù),然后做出k和輪廓系數(shù)的關(guān)系圖,選取輪廓系數(shù)取值最大的k作為我們最佳聚類系數(shù),python實(shí)現(xiàn)如下:

import pandas as pd from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as pltdf_features = pd.read_csv(r'C:\Users\61087\Desktop\項(xiàng)目\爬蟲數(shù)據(jù)\預(yù)處理后數(shù)據(jù).csv',encoding='gbk') Scores = [] # 存放輪廓系數(shù) for k in range(2,9):estimator = KMeans(n_clusters=k) # 構(gòu)造聚類器estimator.fit(df_features[['R','F','M']])Scores.append(silhouette_score(df_features[['R','F','M']],estimator.labels_,metric='euclidean')) X = range(2,9) plt.xlabel('k') plt.ylabel('輪廓系數(shù)') plt.plot(X,Scores,'o-') plt.show()
得到聚類數(shù)k與輪廓系數(shù)的關(guān)系圖:

????????????????????????????

可以看到,輪廓系數(shù)最大的k值是2,這表示我們的最佳聚類數(shù)為2。但是,值得注意的是,從k和SSE的手肘圖可以看出,當(dāng)k取2時(shí),SSE還非常大,所以這是一個(gè)不太合理的聚類數(shù),我們退而求其次,考慮輪廓系數(shù)第二大的k值4,這時(shí)候SSE已經(jīng)處于一個(gè)較低的水平,因此最佳聚類系數(shù)應(yīng)該取4而不是2。

?????? 但是,講道理,k=2時(shí)輪廓系數(shù)最大,聚類效果應(yīng)該非常好,那為什么SSE會(huì)這么大呢?在我看來(lái),原因在于輪廓系數(shù)考慮了分離度b,也就是樣本與最近簇中所有樣本的平均距離。為什么這么說(shuō),因?yàn)閺亩x上看,輪廓系數(shù)大,不一定是凝聚度a(樣本與同簇的其他樣本的平均距離)小,而可能是b和a都很大的情況下b相對(duì)a大得多,這么一來(lái),a是有可能取得比較大的。a一大,樣本與同簇的其他樣本的平均距離就大,簇的緊湊程度就弱,那么簇內(nèi)樣本離質(zhì)心的距離也大,從而導(dǎo)致SSE較大。所以,雖然輪廓系數(shù)引入了分離度b而限制了聚類劃分的程度,但是同樣會(huì)引來(lái)最優(yōu)結(jié)果的SSE比較大的問(wèn)題,這一點(diǎn)也是值得注意的。

總結(jié)

從以上兩個(gè)例子可以看出,輪廓系數(shù)法確定出的最優(yōu)k值不一定是最優(yōu)的,有時(shí)候還需要根據(jù)SSE去輔助選取,這樣一來(lái)相對(duì)手肘法就顯得有點(diǎn)累贅。因此,如果沒(méi)有特殊情況的話,我還是建議首先考慮用手肘法。


總結(jié)

以上是生活随笔為你收集整理的K-means聚类最优k值的选取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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