聚类k值确定--肘部法则

文章介绍了k-means聚类算法中,通过观察SSE(误差平方和)随k值变化的曲线来确定最佳聚类数的方法。当k值增加,SSE下降,但增长速率在达到真实聚类数时会显著放缓,形成肘部,该点对应的k值被视为最优。示例代码展示了如何计算不同k值下的SSE并用图表展示这一过程。
摘要由CSDN通过智能技术生成

 k-means是以最小化样本与质点平方误差作为目标函数,将每个簇的质点与簇内样本点的平方距离误差和(sum of the squared errors,SSE,误差平方和)称为畸变程度(distortions),那么,对于一个簇,它的畸变程度越低,代表簇内成员越紧密,畸变程度越高,代表簇内结构越松散。

当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数.

例如上图,在k=5时,相较于k=4时,畸变程度的变化急剧减小,所以,在k=4这点就是最佳的k值

实例代码

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
 
df_features = pd.read_csv(r'x:\xxxx.csv',encoding='gbk') 
SSE = []  # 存放每次结果的误差平方和
for k in range(1,9):
    estimator = KMeans(n_clusters=k)  # 构造KMeans聚类器
    estimator.fit(df_features[['R','F','M']]) # 训练模型
    SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
X = range(1,9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.show()

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供相关的Python代码。不过在此之前,需要确保您已经安装了以下库: - pandas - numpy - matplotlib - sklearn - mpl_toolkits 接下来,我们可以按照以下步骤进行操作: 1. 读取CSV文件 我们可以使用 Pandas 库中的 read_csv() 函数来读取 CSV 文件,并将其转换为 DataFrame 格式。假设我们的 CSV 文件名为 "data.csv",那么可以使用以下代码来读取它: ```python import pandas as pd df = pd.read_csv('data.csv') ``` 2. 聚类分析 我们可以使用 sklearn 库中的 KMeans 类来进行聚类分析。使用 KMeans 类的基本步骤为: - 实例化 KMeans 类并指定 k ; - 使用 fit() 函数拟合数据; - 使用 predict() 函数预测聚类结果。 在进行聚类分析之前,我们需要先对数据进行一些预处理操作,例如去除缺失、标准化等。这里我们假设数据已经处理好了,直接进行聚类分析。下面是对数据进行聚类分析的代码: ```python from sklearn.cluster import KMeans k = 10 # 设置 k kmeans = KMeans(n_clusters=k) # 实例化 KMeans 类 kmeans.fit(df) # 拟合数据 labels = kmeans.predict(df) # 预测聚类结果 ``` 3. 肘部法则确定 k 肘部法则是一种常用的确定 k 的方法,其基本思想是在不同的 k 下计算聚类的性能指标(如 SSE),并绘制成图像。当 k 增大时,聚类的性能指标会逐渐降低,但降低速度会逐渐变缓。在这个过程中,会出现一条“肘部”形状的曲线,肘部对应的 k 就是最佳的聚类数目。 下面是使用肘部法则确定 k 的代码: ```python import numpy as np import matplotlib.pyplot as plt sse = [] # 存放每个 k 下的 SSE for k in range(1, 11): kmeans = KMeans(n_clusters=k) kmeans.fit(df) sse.append(kmeans.inertia_) # inertia_ 属性可以得到 SSE # 绘制 SSE-K 图像 x = np.arange(1, 11) plt.plot(x, sse, 'o-') plt.xlabel('k') plt.ylabel('SSE') plt.show() ``` 运行以上代码,可以得到 SSE-K 图像。根据图像找到肘部对应的点的 k ,即可确定最佳的聚类数目。 4. 三维可视化图 为了将聚类结果可视化,我们可以使用 mpl_toolkits 库中的 mplot3d 模块来绘制三维图形。下面是绘制三维图形的代码: ```python from mpl_toolkits.mplot3d import Axes3D # 假设数据有三个特征,分别为 x、y、z fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制散点图 ax.scatter(df['x'], df['y'], df['z'], c=labels) # 设置坐标轴标签 ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') plt.show() ``` 运行以上代码,可以得到三维可视化图。其中,不同颜色的点表示不同的聚类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值