为什么你的K-means聚类效果差?,可能是k值选错了——用R cluster包科学决策

部署运行你感兴趣的模型镜像

第一章:为什么你的K-means聚类效果差?

K-means 是最广泛使用的聚类算法之一,但在实际应用中,许多用户发现其聚类效果不尽如人意。问题往往不在于算法本身,而在于使用方式和数据预处理环节的疏忽。

初始中心点选择不当

K-means 对初始聚类中心极为敏感,随机初始化可能导致收敛到局部最优解。推荐使用 K-means++ 算法来优化初始中心点的选择,它通过概率机制使初始中心点分布更合理。
  • 避免使用纯随机初始化
  • 优先采用 K-means++ 初始化策略
  • 可通过多次运行取最优结果提升稳定性

未进行数据标准化

当特征量纲差异较大时,距离计算会被某些特征主导,导致聚类偏差。必须对数据进行标准化处理。
# 使用 sklearn 进行标准化
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # X 为原始特征矩阵

kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
labels = kmeans.fit_predict(X_scaled)

簇的数量选择不合理

K 值选择直接影响聚类效果。常用肘部法则(Elbow Method)或轮廓系数(Silhouette Score)辅助判断。
方法优点缺点
肘部法则直观、计算简单拐点不明显时难判断
轮廓系数量化聚类分离度计算开销较大
graph TD A[原始数据] --> B{是否标准化?} B -- 否 --> C[标准化] B -- 是 --> D[选择K值] C --> D D --> E[运行K-means] E --> F[评估聚类效果]

第二章:K-means聚类与肘部法理论基础

2.1 K-means算法原理及其局限性

算法核心思想
K-means是一种基于距离的无监督聚类算法,其目标是将n个样本划分为k个簇,使得每个样本到其所属簇中心的距离平方和最小。算法通过迭代优化簇中心位置,直至收敛。
算法流程与实现
from sklearn.cluster import KMeans
import numpy as np

# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0, n_init="auto")
labels = kmeans.fit_predict(X)
print(kmeans.cluster_centers_)
该代码使用scikit-learn实现K-means聚类。参数n_clusters指定聚类数量,fit_predict返回每个样本的簇标签,cluster_centers_输出最终质心坐标。
主要局限性
  • 需预先指定k值,实际中难以确定最优聚类数
  • 对初始质心敏感,可能收敛于局部最优
  • 假设簇为凸形且各向同性,难以处理复杂形状
  • 对异常值敏感,极端值会显著影响质心位置

2.2 聚类质量评估指标:WSS与轮廓系数

在聚类分析中,评估聚类结果的质量至关重要。常用的指标包括组内平方和(WSS)与轮廓系数。
组内平方和(WSS)
WSS衡量每个簇内样本到其质心的欧氏距离平方和,值越小表示簇内紧凑性越高。
# 计算WSS示例
wss = 0
for cluster in clusters:
    centroid = np.mean(cluster, axis=0)
    wss += np.sum((cluster - centroid) ** 2)
该代码通过遍历每个簇并计算样本与质心的平方距离累加得到WSS,反映聚类的凝聚程度。
轮廓系数
轮廓系数综合考虑样本的凝聚度(a)与分离度(b),定义为 (b - a) / max(a, b),取值范围[-1,1],越接近1表示聚类效果越好。
  • 轮廓系数 > 0.7:强聚类结构
  • 0.5 ~ 0.7:合理聚类
  • < 0.25:可能需重新确定簇数

2.3 肘部法则的数学直觉与适用场景

数学直觉:误差平方和的边际递减
肘部法则基于聚类中簇内误差平方和(WCSS)随簇数量增加而下降的趋势。当增加簇数带来的 WCSS 下降幅度显著减缓时,形成“肘部”,暗示继续划分收益有限。
from sklearn.cluster import KMeans
wcss = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)  # inertia_ 即 WCSS
上述代码计算不同 k 值下的 WCSS。随着 k 增大,模型复杂度上升,但数据点到其簇中心的距离平方和下降速度变缓,拐点即为推荐的最优 k。
适用场景与局限性
  • 适用于球形、密度均匀的簇结构
  • 在高维或非凸分布数据中效果不佳
  • 主观判断拐点可能引入偏差

2.4 R中cluster包核心功能概览

R语言中的`cluster`包是聚类分析的核心工具之一,提供了多种经典聚类算法的实现,广泛应用于数据探索与模式识别。
主要聚类算法支持
  • pam():围绕中心点的划分方法,对异常值鲁棒;
  • clara():大规模数据的抽样聚类扩展;
  • fanny():模糊聚类,允许对象属于多个簇;
  • diana():分裂层次聚类,适用于树状结构分析。
示例:使用PAM进行聚类

library(cluster)
data(iris)
pam_result <- pam(iris[, 1:4], k = 3)
print(pam_result$clustering)
该代码调用`pam()`函数在鸢尾花数据上执行k=3的聚类。输入为前四列特征,返回每个样本所属簇标签。参数`k`指定簇数量,适用于中小规模数据集,具备良好的可解释性。

2.5 肘部图构建的统计逻辑解析

肘部图(Elbow Plot)是确定聚类数量的重要工具,其核心在于分析不同聚类数下的组内平方和(WCSS)。随着聚类数 $ k $ 增加,WCSS 持续下降,但下降速率在某一点明显减缓,形成“肘部”,该点即为最优 $ k $。
WCSS 计算公式
组内平方和定义为: $$ \text{WCSS} = \sum_{i=1}^{k} \sum_{x \in C_i} \|x - \mu_i\|^2 $$ 其中 $ C_i $ 为第 $ i $ 类,$ \mu_i $ 为其质心。
代码实现与说明
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

wcss = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)
    kmeans.fit(data)
    wcss.append(kmeans.inertia_)  # inertia_ 即 WCSS
plt.plot(range(1, 11), wcss)
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.title('Elbow Method')
plt.show()
上述代码遍历 $ k=1 $ 到 $ 10 $,调用 KMeans.inertia_ 获取 WCSS 并绘图。拐点处即为建议聚类数。
判断准则与局限性
  • 拐点越明显,决策越可靠
  • 数据分布均匀时可能无清晰肘部
  • 需结合轮廓系数等指标综合判断

第三章:R语言环境准备与数据预处理

3.1 安装并加载cluster及相关包

在进行聚类分析之前,首先需要安装并加载R语言中的核心包`cluster`及其依赖环境。该包提供了多种聚类算法的实现,是开展无监督学习的基础工具。
安装与加载流程
使用CRAN镜像安装`cluster`包,并加载至当前会话:
# 安装cluster包及其依赖项
install.packages("cluster", dependencies = TRUE)

# 加载包到R环境中
library(cluster)
其中,`dependencies = TRUE`确保`MASS`、`stats`等所需依赖包一并安装。`library(cluster)`将函数如`pam()`、`clara()`引入搜索路径。
常用关联包
除`cluster`外,以下包常配合使用:
  • dplyr:数据预处理
  • ggplot2:可视化聚类结果
  • factoextra:提取和美化聚类输出

3.2 数据读取与探索性数据分析

在数据科学流程中,数据读取是分析的起点。通常使用Pandas库从CSV、JSON或数据库加载数据。
数据加载示例
import pandas as pd
# 读取CSV文件,header=0表示首行为列名,index_col可指定索引列
df = pd.read_csv('data.csv', encoding='utf-8')
该代码将结构化数据载入DataFrame,便于后续处理。encoding参数防止中文乱码。
探索性分析核心步骤
  • 查看前几行:df.head()
  • 检查数据类型:df.dtypes
  • 统计缺失值:df.isnull().sum()
数据分布概览
统计量数值
样本数1000
缺失值比例5%

3.3 特征标准化与缺失值处理

特征标准化方法
在机器学习建模中,特征量纲差异会导致模型收敛缓慢或权重偏差。常用标准化方法包括Z-score标准化和Min-Max归一化。Z-score将数据转换为均值为0、标准差为1的分布:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
其中,fit_transform() 先计算训练集均值与标准差,再对数据进行缩放,确保特征处于同一数量级。
缺失值处理策略
缺失值影响模型稳定性,常见处理方式包括删除、均值/中位数填充和插值法。对于数值型特征,使用中位数填充可减少异常值干扰:
  • 删除缺失率高于50%的特征
  • 连续变量采用中位数填充
  • 分类变量使用众数填充
结合标准化与缺失值处理,能显著提升模型鲁棒性与泛化能力。

第四章:基于cluster包的肘部法实践操作

4.1 使用pam()和kmeans()进行初步聚类

在聚类分析中,kmeans()pam() 是两种广泛使用的划分方法。前者基于质心,后者基于中心点,对异常值更具鲁棒性。
k-means 聚类实现

# 使用内置的 iris 数据集
data(iris)
set.seed(123)
km <- kmeans(iris[, 1:4], centers = 3, nstart = 25)
table(iris$Species, km$cluster)
该代码对鸢尾花数据的四个数值特征执行 k-means 聚类。参数 centers = 3 指定聚类数量,nstart = 25 表示随机初始化 25 次以优化结果稳定性。
PAM 聚类对比
  • pam() 来自 cluster 包,使用实际数据点作为中心(中心点)
  • 相比 k-means,对噪声和离群值更稳健
  • 适用于小到中等规模数据集

library(cluster)
pam_result <- pam(iris[, 1:4], k = 3)
plot(pam_result)
此代码执行 PAM 聚类并可视化聚类结果,展示每个簇的轮廓与中心点分布。

4.2 计算不同k值下的总组内平方和(WSS)

在K-means聚类中,选择最优簇数k是关键步骤。总组内平方和(Within-Cluster Sum of Squares, WSS)衡量样本到其所属簇中心的距离平方和,常用于评估聚类质量。
WSS计算流程
  • 对每个k值(如1到10),运行K-means算法
  • 计算每个样本点到其簇中心的欧氏距离平方
  • 将所有距离平方求和,得到该k值下的WSS
from sklearn.cluster import KMeans
wss = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X)
    wss.append(kmeans.inertia_)  # inertia_ 即为WSS
上述代码中,inertia_ 属性直接返回模型的总组内平方和。随着k增大,WSS单调递减,需结合“肘部法则”寻找拐点以确定最优k值。

4.3 绘制肘部图并识别最优k值

在K-means聚类中,选择合适的簇数k至关重要。肘部法则通过分析不同k值对应的聚类内平方和(WCSS)变化趋势,帮助识别最优k值。
计算不同k值的WCSS
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

wcss = []
k_range = range(1, 11)
for k in k_range:
    kmeans = KMeans(n_clusters=k, init='k-means++', max_iter=300, n_init=10, random_state=42)
    kmeans.fit(data)
    wcss.append(kmeans.inertia_)  # inertia_ 返回 WCSS
上述代码遍历k从1到10,使用k-means++初始化方法训练模型,并记录每个k对应的WCSS值。
绘制肘部图
Elbow Method Plot
当k较小时,WCSS随k增加迅速下降;当k超过某阈值后,下降趋势变缓,形成“肘部”。该拐点即为最优k值。
  • WCSS:Within-Cluster Sum of Squares,衡量簇内样本与质心的距离平方和
  • 拐点判断需结合业务场景,避免过度拟合

4.4 结果验证:结合轮廓分析提升可信度

在聚类任务中,仅依赖内部指标如SSE可能误导模型评估。引入轮廓系数(Silhouette Score)可量化样本与其所属簇的紧密度及与其他簇的分离度,值域[-1,1]直观反映聚类质量。
轮廓系数计算示例
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
print(f"轮廓系数: {score:.3f}")
该代码段计算K-Means聚类结果的轮廓系数。`silhouette_score`接收数据集X与聚类标签,输出平均轮廓值。值越接近1表示聚类效果越优。
多方案对比验证
簇数量SSE轮廓系数
2120.50.62
385.30.71
470.10.63
结合SSE递减趋势与轮廓系数峰值,可确定最优簇数为3,实现结果可信度双重验证。

第五章:科学选择k值,提升聚类性能

在K-means聚类中,k值的选择直接影响模型的性能与解释性。盲目设定k值可能导致过拟合或欠聚类,因此需借助量化指标辅助决策。
肘部法则评估
通过计算不同k值下的总组内平方和(WSS),绘制变化曲线。当WSS下降趋势明显变缓时,对应k即为合理选择。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

wss = []
k_range = range(1, 11)
for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(data)
    wss.append(kmeans.inertia_)

plt.plot(k_range, wss, 'bo-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Within Sum of Squares')
plt.title('Elbow Method for Optimal k')
plt.show()
轮廓系数分析
轮廓系数衡量样本与其所属簇的紧密度及与其他簇的分离度,取值[-1,1],越接近1表示聚类效果越好。
  • 轮廓系数 > 0.7:强聚类结构
  • 0.5 ~ 0.7:合理聚类
  • 0.25 ~ 0.5:弱聚类,需优化
  • < 0.25:可能无显著簇结构
实际案例:客户分群
某电商平台对用户消费行为聚类,尝试k=3~6。经轮廓系数计算,k=4时系数达0.68,结合业务理解划分为高价值、潜力、普通、流失客户,支撑精准营销策略。
k值轮廓系数业务可解释性
30.61中等
40.68
50.66较低

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值