下述提及方法均以k-means算法為基礎, 不同聚類方法有不同的評價指標,這里說說k-means常用的兩種方法
我們知道k-means是以最小化樣本與質點平方誤差作為目標函數,將每個簇的質點與簇內樣本點的平方距離誤差和稱為畸變程度(distortions),那么,對於一個簇,它的畸變程度越低,代表簇內成員越緊密,畸變程度越高,代表簇內結構越松散。 畸變程度會隨着類別的增加而降低,但對於有一定區分度的數據,在達到某個臨界點時畸變程度會得到極大改善,之后緩慢下降,這個臨界點就可以考慮為聚類性能較好的點。 基於這個指標,我們可以重復訓練多個k-means模型,選取不同的k值,來得到相對合適的聚類類別,
如上圖所示,在k=2時,畸變程度得到大幅改善,可以考慮選取k=2作為聚類數量,附簡單代碼:
from sklearn.cluster import KMeansmodel = KMeans(n_clusters=k)model.fit(vector_points)md = model.inertia_ / vector_points.shape[0]
2、輪廓系數–Silhouette Coefficient
對於一個聚類任務,我們希望得到的簇中,簇內盡量緊密,簇間盡量遠離,輪廓系數便是類的密集與分散程度的評價指標,公式表達如下: s=b−amax(a,b)s=b−amax(a,b)其中a代表同簇樣本到彼此間距離的均值,b代表樣本到除自身所在簇外的最近簇的樣本的均值,s取值在[-1, 1]之間。 如果s接近1,代表樣本所在簇合理,若s接近-1代表s更應該分到其他簇中。 同樣,利用上述指標,訓練多個模型,對比選取合適的聚類類別:
如上圖, 當k=3時,輪廓系數最大,代表此時聚類的效果相對合理,簡單代碼如下:from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_scoremodel = KMeans(n_clusters=k)model.fit(vector_points)
s = silhouette_score(vector_points, model.labels_)
當然還有其他的一些評判標准,后面會具體詳細介紹一部分
主要參考可見:
https://www.cnblogs.com/niniya/p/8784947.html
https://blog.csdn.net/darkrabbit/article/details/80378597
https://www.jianshu.com/p/841ecdaab847?tdsourcetag=s_pctim_aiomsg