如何选择kmeans中的k值——肘部法则–Elbow Method和轮廓系数–Silhouette Coefficient...

本文介绍了KMeans聚类中选择合适k值的两种方法:肘部法则(Elbow Method)和轮廓系数(Silhouette Coefficient)。肘部法则通过观察随着k值增加畸变程度的变化,找到拐点选择合适的k值;轮廓系数衡量簇内紧密度和簇间距离,选取使系数最大的k值。sklearn库提供了计算轮廓系数的API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

肘部法则–Elbow Method

我们知道k-means是以最小化样本与质点平方误差作为目标函数,将每个簇的质点与簇内样本点的平方距离误差和称为畸变程度(distortions),那么,对于一个簇,它的畸变程度越低,代表簇内成员越紧密,畸变程度越高,代表簇内结构越松散。 畸变程度会随着类别的增加而降低,但对于有一定区分度的数据,在达到某个临界点时畸变程度会得到极大改善,之后缓慢下降,这个临界点就可以考虑为聚类性能较好的点。

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
 
df_features = pd.read_csv(r'11111111.csv',encoding='gbk') # 读入数据
#print(df_features)
'利用SSE选择k'
SSE = []  # 存放每次结果的误差平方和
for k in range(1,9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(df_features[['0','1','2','3','4','5','6
### 使用肘部法则轮廓系数确定KMeans聚类的最佳k #### 肘部法则的应用 肘部法则是通过观察不同 \( k \) 下的簇内平方(Within-Cluster Sum of Squares, WCSS)的变化趋势来选择合适的 \( k \)[^1]。具体而言,在绘制 \( k \) 对应的 WCSS 的曲线图时,通常可以看到一个明显的“拐点”,即当 \( k \) 达到某一特定后,WCSS 减少的速度明显变缓。这个拐点被称为“肘部”。该方法的核心在于寻找这样一个临界点,使得增加更多的簇中心不再显著改善模型性能[^3]。 以下是实现肘部法则的一个简单 Python 示例: ```python from sklearn.cluster import KMeans import matplotlib.pyplot as plt def find_optimal_k_elbow(data, max_k): wcss = [] for k in range(1, max_k + 1): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(data) wcss.append(kmeans.inertia_) plt.plot(range(1, max_k + 1), wcss, marker='o') plt.title('Elbow Method') plt.xlabel('Number of clusters (k)') plt.ylabel('WCSS') plt.show() ``` 调用 `find_optimal_k_elbow` 方法可以生成一张图表,帮助识别最佳的 \( k \) 。 #### 轮廓系数的作用 尽管肘部法则直观易懂,但在某些情况下可能难以清晰定义“肘部”位置[^2]。此时,可以通过引入轮廓系数Silhouette Coefficient)作为补充指标。轮廓系数衡量的是样本其所属簇内的其他成员之间的紧密程度以及其他簇的距离关系。其取范围为 [-1, 1],其中接近于 1 表明样本很好地分配到了相应的簇中;而负则意味着可能存在错误分类的情况。 下面展示了一个基于轮廓分数评估 \( k \) 的过程: ```python from sklearn.metrics import silhouette_score def find_optimal_k_silhouette(data, min_k, max_k): best_k = min_k highest_score = -1 for k in range(min_k, max_k + 1): kmeans = KMeans(n_clusters=k, random_state=42).fit(data) score = silhouette_score(data, kmeans.labels_) if score > highest_score: highest_score = score best_k = k return best_k, highest_score ``` 此函数返回具有最高平均轮廓分的那个 \( k \),并可进一步验证是否符合实际需求。 综合运用这两种技术能够更可靠地决定适合数据集特性的理想簇数量。然而需要注意的是,即使两者都提供了指导性意见,最终决策仍需结合领域知识及业务背景加以考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值