K means聚類最優k值的選取

2021-09-13 11:25:09 字數 1451 閱讀 7544

我們希望能從資料自身出發去確定真實的聚類數,也就是對資料而言的最佳聚類數

1.手肘法

1.1 理論

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

其中,ci是第i個簇,p是ci中的樣本點,mi是ci的質心(ci中所有樣本的均值),sse是所有樣本的聚類誤差,代表了聚類效果的好壞。

手肘法的核心思想是:隨著聚類數k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那麼誤差平方和sse自然會逐漸變小。並且,當k小於真實聚類數時,由於k的增大會大幅增加每個簇的聚合程度,故sse的下降幅度會很大,而當k到達真實聚類數時,再增加k所得到的聚合程度回報會迅速變小,所以sse的下降幅度會驟減,然後隨著k值的繼續增大而趨於平緩,也就是說sse和k的關係圖是乙個手肘的形狀,而這個肘部對應的k值就是資料的真實聚類數。當然,這也是該方法被稱為手肘法的原因。
1.2 實踐

我們對預處理後資料.csv 中的資料利用手肘法選取最佳聚類數k。具體做法是讓k從1開始取值直到取到你認為合適的上限(一般來說這個上限不會太大,這裡我們選取上限為8),對每乙個k值進行聚類並且記下對於的sse,然後畫出k和sse的關係圖(毫無疑問是手肘形),最後選取肘部對應的k作為我們的最佳聚類數。python實現如下:

[python] view plain copy

import pandas as pd  

from sklearn.cluster import kmeans

import matplotlib.pyplot as plt

df_features = pd.read_csv(r'c:\預處理後資料.csv',encoding='gbk') # 讀入資料

'利用sse選擇k'

sse = # 存放每次結果的誤差平方和

for k in range(1,9):

estimator = kmeans(n_clusters=k) # 構造聚類器

estimator.fit(df_features[['r','f','m']])

x = range(1,9)

plt.xlabel('k')

plt.ylabel('sse')

plt.plot(x,sse,'o-')

plt.show()

畫出的k與sse的關係圖如下:

顯然,肘部對於的k值為4,故對於這個資料集的聚類而言,最佳聚類數應該選4

輪廓係數法

輪廓係數法確定出的最優k值不一定是最優的,有時候還需要根據sse去輔助選取,這樣一來相對手肘法就顯得有點累贅。因此,如果沒有特殊情況的話,我還是建議首先考慮用手肘法。

博文**: 感謝

K Means聚類最優k值的選取

最近做乙個文字分類的專案,在最開始的時候會用到k means的聚類方法,因此需要在文字上找到最佳的聚類數。1.1 理論 手肘法的評價k值好壞的標準是sse sum of the squared errors ss e p ci p mi 2s se p ci p mi 2其中 c i c i代表第 ...

K means聚類最優k值的選取

最近做了乙個資料探勘的專案,挖掘過程中用到了k means聚類方法,但是由於根據行業經驗確定的聚類數過多並且並不一定是我們獲取到資料的真實聚類數,所以,我們希望能從資料自身出發去確定真實的聚類數,也就是對資料而言的最佳聚類數。為此,我查閱了大量資料和部落格資源,總結出主流的確定聚類數k的方法有以下兩...

kmeans聚類選擇最優K值python實現

kmeans演算法中k值的確定是很重要的。下面利用python中sklearn模組進行資料聚類的k值選擇 資料集自製資料集,格式如下 手肘法 手肘法的核心指標是sse sum of the squared errors,誤差平方和 其中,ci是第i個簇,p是ci中的樣本點,mi是ci的質心 ci中所...