讲师中心 微信公众号
AI工具推荐 视频效率加速

如何使用Python实现数据聚类?KMeans算法

风辰吖_3933

风辰吖_3933

发布时间:2025-07-08 13:47:02

|

1113人浏览过

|

来源于php中文网

原创

kmeans聚类的核心步骤包括数据预处理、模型训练与结果评估。1. 数据预处理:使用standardscaler对数据进行标准化,消除不同特征量纲的影响;2. 模型训练:通过kmeans类设置n_clusters参数指定簇数,调用fit方法训练模型;3. 获取结果:使用labels_属性获取每个数据点所属簇,cluster_centers_获取簇中心坐标;4. 可视化:绘制散点图展示聚类效果及簇中心;5. k值选择:结合手肘法(inertia)和轮廓系数(silhouette score)确定最佳簇数,提升聚类质量;6. 优化策略:加强数据预处理、增加n_init运行次数、处理异常值、结合业务背景综合评估结果或选用其他算法弥补局限性。

如何使用Python实现数据聚类?KMeans算法

使用Python实现数据聚类,KMeans是一个非常常用且直观的算法。它通过迭代寻找数据点到聚类中心的最小距离来划分簇,Scikit-learn库提供了非常便捷的实现方式,让这个过程变得相当高效。

如何使用Python实现数据聚类?KMeans算法

在我看来,要用Python实现KMeans聚类,核心步骤其实并不复杂,但有些细节处理得好不好,直接关系到最终聚类效果的质量。

首先,你得准备好数据。通常,我们会用numpy或者pandas来处理数据。KMeans对数据尺度比较敏感,所以数据标准化(或者归一化)几乎是必不可少的一步。我个人习惯用StandardScaler,它能把数据转换成均值为0、方差为1的分布,这样不同特征之间的量纲差异就不会干扰到距离计算了。

立即学习“Python免费学习笔记(深入)”;

如何使用Python实现数据聚类?KMeans算法

接着,就是调用sklearn.cluster里的KMeans。实例化这个类的时候,最关键的参数就是n_clusters,也就是你希望把数据分成多少个簇。说实话,这个K值的选择,有时候真有点像门艺术,需要结合业务理解和一些经验方法。

然后,用fit方法把模型训练起来,它会自动找到最佳的聚类中心。训练完之后,你可以通过labels_属性获取每个数据点所属的簇,cluster_centers_则会给出每个簇的中心点坐标。

如何使用Python实现数据聚类?KMeans算法
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs # 用于生成示例数据

# 1. 生成一些示例数据
# 假设我们有3个自然的簇
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 2. 数据预处理:标准化
# 这一步非常关键,特别是当你的特征有不同量纲时
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. 初始化并训练KMeans模型
# 这里我们假设知道有4个簇,实际应用中K的确定是难点
# n_init='auto' 是Scikit-learn 1.2+ 的推荐设置,它会运行多次并选择最佳结果
kmeans = KMeans(n_clusters=4, random_state=0, n_init='auto')
kmeans.fit(X_scaled)

# 4. 获取聚类结果
labels = kmeans.labels_
centers = kmeans.cluster_centers_

# 5. 可视化结果(可选,但强烈推荐)
plt.figure(figsize=(8, 6))
# 绘制原始数据点,并根据聚类结果上色
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, s=50, cmap='viridis', alpha=0.7)
# 绘制聚类中心
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, marker='X', label='Cluster Centers')
plt.title('KMeans Clustering Results (Scaled Data)')
plt.xlabel('Feature 1 (Scaled)')
plt.ylabel('Feature 2 (Scaled)')
plt.legend()
plt.grid(True)
plt.show()

print("聚类标签前5个样本:", labels[:5])
print("聚类中心:\n", scaler.inverse_transform(centers)) # 将中心点逆转换为原始尺度以便理解

这段代码跑下来,你就能看到数据点被分成了几个不同的颜色区域,每个区域都有一个红色的'X'标记着它的中心。这感觉还是挺直观的。

如何选择KMeans算法中的最佳聚类数量K?

说实话,KMeans最大的一个痛点,就是你得提前告诉它要分多少个簇(K值)。这不像有些算法,能自己发现簇的数量。所以,确定这个K值,往往是聚类任务里最让人头疼,也最能体现数据分析师功力的地方。

最常用的方法之一是手肘法(Elbow Method)。它的核心思想是,随着K值的增加,每个数据点到其对应簇中心的距离之和(也叫作簇内平方和,Inertia)会不断减小。但这个减小的速度,在达到一个“最佳”K值后会显著放缓,图形上看起来就像一个手肘。你需要在图上找到那个“拐点”。这个方法虽然直观,但有时候“手肘”并不那么明显,需要一点主观判断。

另一个我个人觉得更靠谱,或者说更量化的方法是轮廓系数(Silhouette Score)。轮廓系数衡量的是一个数据点与其所在簇的凝合度( cohesion)和与其他簇的分离度(separation)。它的值介于-1到1之间:

  • 接近1表示该点与自身簇内点很近,与相邻簇点很远,聚类效果很好。
  • 接近0表示该点在两个簇的边界上。
  • 接近-1表示该点可能被分到了错误的簇。 我们通常会计算不同K值下的平均轮廓系数,然后选择那个平均轮廓系数最高的K值。这比手肘法看起来更“客观”一些,但也不是万能的。
from sklearn.metrics import silhouette_score

# 尝试不同K值
inertias = []
silhouette_scores = []
k_range = range(2, 11) # 通常K从2开始,因为K=1没有聚类意义

for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=0, n_init='auto')
    kmeans.fit(X_scaled)
    inertias.append(kmeans.inertia_)

    # 计算轮廓系数,需要至少2个簇
    if k > 1:
        score = silhouette_score(X_scaled, kmeans.labels_)
        silhouette_scores.append(score)
    else:
        silhouette_scores.append(0) # K=1时轮廓系数无意义

# 绘制手肘图
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(k_range, inertias, marker='o')
plt.title('Elbow Method (Inertia vs. K)')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.grid(True)

# 绘制轮廓系数图
plt.subplot(1, 2, 2)
# 注意:silhouette_scores 列表长度会比 k_range 少1,因为K=1时没有轮廓系数
plt.plot(k_range, silhouette_scores, marker='o', color='red')
plt.title('Silhouette Score vs. K')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Silhouette Score')
plt.grid(True)
plt.tight_layout()
plt.show()

# 找到轮廓系数最高的K值
# 注意索引对应关系,因为silhouette_scores是从k=2开始的
best_k_silhouette = k_range[np.argmax(silhouette_scores)]
print(f"根据轮廓系数,最佳K值可能为: {best_k_silhouette}")

在我看来,这两种方法结合起来看,会让你对K的选择更有信心。但最终,还是得回归到你对数据的理解,以及聚类结果是否符合你的业务预期。

KMeans算法的局限性与常见挑战有哪些?

尽管KMeans非常流行且易于实现,但它并不是万能的,在实际应用中会遇到一些挑战和局限性。这些问题有时候让人挺头疼的。

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

下载

最明显的一个是对初始聚类中心的敏感性。KMeans的迭代过程是从随机选择的K个点作为初始中心开始的。如果初始中心选得不好,算法可能会收敛到局部最优解,而不是全局最优解。虽然kmeans++这种初始化策略(Scikit-learn默认使用)大大缓解了这个问题,它会选择离已选中心较远的点作为下一个中心,但依然不能完全保证找到全局最优。所以,通常我们会设置n_init参数(例如n_init=10),让KMeans运行多次,每次用不同的初始中心,然后返回最好的那个结果,这能有效提高聚类质量。

另一个大问题是它假设簇是球形的且大小相似。KMeans基于欧氏距离来划分簇,自然倾向于找到圆形或椭圆形的簇。如果你的数据簇是任意形状的(比如月牙形、环形),或者簇的密度差异很大,KMeans的表现就会很差,它会强行把非球形的数据点切分成球形簇。这时候,像DBSCAN(基于密度)或者Agglomerative Clustering(层次聚类)可能更合适。

对异常值(Outliers)的敏感也是一个痛点。单个或少数几个离群点可能会显著拉动聚类中心,导致整个簇的形状和位置发生偏差,从而影响聚类结果的准确性。在进行KMeans之前,通常需要对数据进行离群点检测和处理。

还有就是K值的选择问题,前面已经提过了。没有一个放之四海而皆准的方法能确定最佳K值,这需要经验、业务知识和一些启发式方法(如手肘法、轮廓系数)的结合。

最后,KMeans无法处理非数值型数据。所有输入特征都必须是数值型的。如果你有类别特征,需要进行独热编码(One-Hot Encoding)或其他转换。

这些局限性并不是说KMeans不好,而是提醒我们在使用它之前,要对数据有足够的了解,并且在必要时考虑其他更适合的算法。

如何优化KMeans聚类结果并提升模型性能?

既然KMeans有这些局限性,那我们有没有办法去“优化”它,让它的表现更好呢?当然有,有些小技巧或者说最佳实践,能显著提升聚类效果。

首先,数据预处理是重中之重。我前面提到过标准化,这绝对是KMeans的基石。如果你的特征量纲差异很大,或者数值范围悬殊,不标准化就直接跑KMeans,结果往往会很糟糕。因为距离计算会被数值大的特征主导,小的特征几乎没啥发言权。除了标准化,有时候特征工程也能帮大忙。比如,如果你发现原始特征的组合能更好地揭示簇结构,那就大胆地去创造新特征。

其次,选择合适的初始化策略。虽然Scikit-learn的KMeans默认使用了kmeans++,这已经比纯随机初始化要好很多了,但如果你对结果还不满意,可以尝试多次运行KMeans并选择最优解(通过设置n_init参数为一个较大的值,例如10或20)。这能有效避免陷入局部最优。

再来,处理异常值。正如前面所说,异常值对KMeans的影响很大。在聚类之前,可以考虑使用一些离群点检测算法(比如Isolation Forest, LOF等)来识别并处理这些异常点。你可以选择移除它们,或者将它们单独标记出来,不参与核心聚类。

另外,评估指标的综合使用。不要只盯着手肘法或者轮廓系数。有时候,一个K值在这些指标上表现一般,但在业务上却非常有意义。所以,聚类结果出来后,一定要结合业务背景去解释和评估。比如,看看每个簇的特征分布,是不是符合你的直觉,或者能给你带来新的洞察。

最后,如果你发现KMeans确实不太适合你的数据(比如数据簇形状不规则),那就考虑其他聚类算法。DBSCAN在处理不规则形状簇和识别噪声方面有优势,层次聚类(Agglomerative Clustering)则能生成聚类树,帮助你理解不同粒度的簇结构。选择合适的工具,才是解决问题的关键。

在我看来,没有一种算法是完美的。KMeans虽然简单,但它强大的地方在于其直观性和计算效率。通过这些优化手段,我们可以在很大程度上弥补它的不足,让它在更广泛的场景中发挥作用。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

771

2026.04.13

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6596

2023.08.14

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

0

2026.11.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

120

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

80

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn