當前位置:
首頁 >
kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定
發布時間:2025/4/17
67
豆豆
生活随笔
收集整理的這篇文章主要介紹了
kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
kmeans算法是無監督聚類學習中最常見、最常用的算法之一,其基本原理如下:
1、隨機初始化k個聚類中心點,并計算數據中每個點到k個點的距離;
2、將每個數據點分到距離聚類中心點最近的聚類中心中;
3、針對每個類別重新計算聚類中心;
4、重復上面的2、3步驟中,直到達到預先設置的停止條件(迭代次數、最小誤差變化等)。
kmeans算法其實挺簡單,但是聚類個數k應該如何的選擇?目前常用有肘部法則和輪廓系數法等。肘部法則通過尋找損失值下降平穩的拐點來確定k值,而輪廓系統則是通過尋找輪廓系數的最大值來進行計算:
肘部法則SSE(誤差平方和):
( 為第i簇的質心)輪廓系數:
( 是樣本i在同類別內到其它點的平均距離,是樣本i到最近不同類別中樣本的平均距離)通過Python模擬數據,應用kmeans,分別通過肘部法則和輪廓系數選擇相應的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'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號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()隨機產生的數據如下圖所示:
隨機產生3個類別的數據應用肘部法則來選擇相應的k值
#應用肘部法則確定 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的走勢關系如下圖所示:
肘部法則確定最佳的k值從圖中可以明顯的看出k在3之后減小的幅度變緩,這說明當k=3之后,如果在增加聚類的類別效果提高不是十分明顯,由此可以確認此批數據的k應該取3.
應用輪廓系數確定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'輪廓系數') plt.title(u'輪廓系數確定最佳的K值') plt.show()輪廓系數法確定最佳的k值由上圖可以看出當k=3值輪廓系數達到最大值,此時的聚類效果最好,因此k應該選擇3。
可以看一下當k=3時聚類中心與樣本點的分布情況,選取的聚類中心還是挺準確的。因為是模擬產生的數據,所有聚類效果異常的好,但是在實際的應用中一般不會有這么好的聚類效果 的。
聚類中心與樣本點的分布圖總結
以上是生活随笔為你收集整理的kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7开启uasp协议_Dubbo-go 源
- 下一篇: 如何把a1的图纸变成a0_「云顶之弈装备