kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定
kmeans算法是無監(jiān)督聚類學(xué)習(xí)中最常見、最常用的算法之一,其基本原理如下:
1、隨機(jī)初始化k個聚類中心點,并計算數(shù)據(jù)中每個點到k個點的距離;
2、將每個數(shù)據(jù)點分到距離聚類中心點最近的聚類中心中;
3、針對每個類別重新計算聚類中心;
4、重復(fù)上面的2、3步驟中,直到達(dá)到預(yù)先設(shè)置的停止條件(迭代次數(shù)、最小誤差變化等)。
kmeans算法其實挺簡單,但是聚類個數(shù)k應(yīng)該如何的選擇?目前常用有肘部法則和輪廓系數(shù)法等。肘部法則通過尋找損失值下降平穩(wěn)的拐點來確定k值,而輪廓系統(tǒng)則是通過尋找輪廓系數(shù)的最大值來進(jìn)行計算:
肘部法則SSE(誤差平方和):
( 為第i簇的質(zhì)心)輪廓系數(shù):
( 是樣本i在同類別內(nèi)到其它點的平均距離,是樣本i到最近不同類別中樣本的平均距離)通過Python模擬數(shù)據(jù),應(yīng)用kmeans,分別通過肘部法則和輪廓系數(shù)選擇相應(yīng)的k值
import os from sklearn.cluster import KMeans import pandas as pd import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號num = 100 np.random.seed(0) #聚類群體1 mu1 =np.array([1,1]) sigma1=np.array([[0.5,0],[0,0.5]]) R1 = np.linalg.cholesky(sigma1) s1 = np.dot(np.random.randn(num, 2), R1) + mu1 plt.plot(s1[:,0],s1[:,1],'y.')# 聚類群體2 mu2 =np.array([6,0]) sigma2=np.array([[0.1,0.1],[0,0.5]]) R2 = np.linalg.cholesky(sigma2) s2 = np.dot(np.random.randn(num, 2), R2) + mu2 plt.plot(s2[:,0],s2[:,1],'*r')# 聚類群體3 mu3 = np.array([-2,-2]) sigma3 = np.array([[0.6,0],[0,1]]) R3 = np.linalg.cholesky(sigma3) s3 = np.dot(np.random.randn(num,2),R3)+mu3 plt.plot(s3[:,0],s3[:,1],'b+') plt.show()隨機(jī)產(chǎn)生的數(shù)據(jù)如下圖所示:
隨機(jī)產(chǎn)生3個類別的數(shù)據(jù)應(yīng)用肘部法則來選擇相應(yīng)的k值
#應(yīng)用肘部法則確定 kmeans方法中的k from scipy.spatial.distance import cdist K=range(1,10) sse_result=[] for k in K:kmeans=KMeans(n_clusters=k)kmeans.fit(s)sse_result.append(sum(np.min(cdist(s,kmeans.cluster_centers_,'euclidean'),axis=1))/s.shape[0]) plt.plot(K,sse_result,'gx-') plt.xlabel('k') plt.ylabel(u'平均畸變程度') plt.title(u'肘部法則確定最佳的K值') plt.show()k值與sse的走勢關(guān)系如下圖所示:
肘部法則確定最佳的k值從圖中可以明顯的看出k在3之后減小的幅度變緩,這說明當(dāng)k=3之后,如果在增加聚類的類別效果提高不是十分明顯,由此可以確認(rèn)此批數(shù)據(jù)的k應(yīng)該取3.
應(yīng)用輪廓系數(shù)確定k
from sklearn.metrics import silhouette_scoreK=range(2,10) score=[] for k in K:kmeans=KMeans(n_clusters=k)kmeans.fit(s)score.append(silhouette_score(s,kmeans.labels_,metric='euclidean')) plt.plot(K,score,'r*-') plt.xlabel('k') plt.ylabel(u'輪廓系數(shù)') plt.title(u'輪廓系數(shù)確定最佳的K值') plt.show()輪廓系數(shù)法確定最佳的k值由上圖可以看出當(dāng)k=3值輪廓系數(shù)達(dá)到最大值,此時的聚類效果最好,因此k應(yīng)該選擇3。
可以看一下當(dāng)k=3時聚類中心與樣本點的分布情況,選取的聚類中心還是挺準(zhǔn)確的。因為是模擬產(chǎn)生的數(shù)據(jù),所有聚類效果異常的好,但是在實際的應(yīng)用中一般不會有這么好的聚類效果 的。
聚類中心與樣本點的分布圖總結(jié)
以上是生活随笔為你收集整理的kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7开启uasp协议_Dubbo-go 源
- 下一篇: 如何把a1的图纸变成a0_「云顶之弈装备