欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

kmeans中的k的含义_聚类分析:kmeans 算法簇个数的确定

发布时间:2025/4/17 编程问答 68 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 算法簇个数的确定的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。