kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定
生活随笔
收集整理的这篇文章主要介绍了
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_「云顶之弈装备