当前位置: 首页 > news >正文

机器学习——KMeans聚类算法(算法原理+超参数详解+实战案例)


K-Means 聚类算法详解与实战

1. 什么是 K-Means?

K-Means 是一种常用的无监督学习聚类算法,用于将数据集划分为 K 个簇(Cluster)。它的目标是让簇内的数据尽量相似,簇间的数据尽量不同。

应用场景包括:

  • 客户分群(Marketing Segmentation)

  • 图像压缩(Image Compression)

  • 文档聚类(Document Clustering)

  • 异常检测(Anomaly Detection)


2. 算法原理

K-Means 的核心思想是:

  1. 随机选择 K 个点作为初始聚类中心(质心,Centroid)

  2. 计算每个样本到各质心的距离,将样本分配到最近的质心所在的簇。

  3. 重新计算每个簇的质心(即簇内所有点的均值)。

  4. 重复步骤 2 和 3,直到簇不再变化或达到最大迭代次数。

其优化目标是最小化簇内的平方误差和(Sum of Squared Errors, SSE):

其中:

  • Ck :第 k 个簇

  • μk :第 k 个簇的质心


3. 算法流程

  1. 选择 K 值(簇的数量)。

  2. 初始化 K 个质心。

  3. 分配样本到最近质心。

  4. 更新质心为簇内样本均值。

  5. 检查收敛条件:

    • 质心变化小于阈值

    • 或达到最大迭代次数


4. K 值的选择方法

K-Means 需要提前设定 K,但这个值怎么选呢?
常用方法:

  • 肘部法(Elbow Method)
    绘制 K 对 SSE 的曲线,当下降幅度明显减缓的位置就是“肘部”。

  • 轮廓系数(Silhouette Coefficient)
    取值范围 [-1, 1],越接近 1 聚类效果越好。


5. 优缺点

优点:

  • 简单高效,易于实现

  • 对大数据集表现较好(时间复杂度 O(n) ~ O(nkt))

缺点:

  • 需要提前设定 K

  • 对异常值和噪声敏感

  • 假设簇是球形且大小相近

  • 容易陷入局部最优(可用多次初始化改善)


6.KMeans 超参数详解

from sklearn.cluster import KMeansmodel = KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=1e-4,verbose=0,random_state=None,copy_x=True,algorithm='lloyd'
)
超参数作用描述类型默认值备注与建议
n_clusters聚类簇的数量 Kint8需根据数据选择,常用肘部法或轮廓系数确定
init质心初始化方法{'k-means++','random'} 或 ndarray'k-means++'推荐用 'k-means++',提升收敛速度和效果
n_init不同随机质心初始化运行次数int10值越大越稳定,默认10次足够,多数情况下不用调
max_iter单次运行最大迭代次数int300超过该迭代次数则停止,一般300够用
tol收敛容差阈值float1e-4质心移动小于该值停止迭代,调小提高精度但慢
verbose迭代过程输出等级int00不输出,1或2输出详细调试信息
random_state随机种子,保证结果复现int 或 RandomStateNone实验需固定,常用42等数字
copy_x是否复制输入数据boolTrueFalse节省内存但修改原数据
algorithmK-Means算法实现版本{'lloyd', 'elkan'}'lloyd''elkan'更快适合小稠密数据,稀疏数据用'lloyd'

7. Python 实战案例

我们用 scikit-learn 对二维数据进行聚类,并可视化结果。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans# 1. 生成模拟数据 (这一部分不用在意)
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=42)# 2. 创建并训练KMeans模型
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
kmeans.fit(X)# 3. 获取聚类结果
y_kmeans = kmeans.predict(X)# 4. 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')# 绘制质心
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X', label='质心')plt.title("K-Means")
plt.legend()
plt.show()

运行结果:

  • 数据被分为 4 类,不同颜色代表不同簇

  • 红色 X 是质心位置


8. 代码细节说明

  • n_clusters:指定簇的数量 K

  • random_state:确保结果可复现

  • n_init:KMeans 会多次随机初始化质心,取最佳结果,默认值从 1 提升到 10 以提高稳定性

  • cluster_centers_:存储最终的质心坐标

  • labels_:每个样本的簇标签


9. 改进方法

  • K-Means++:优化质心初始化,减少陷入局部最优的概率

  • Mini-Batch K-Means:适合大规模数据,使用小批量数据迭代更新质心

  • 谱聚类、DBSCAN:在簇形状不规则时效果更好


10. 总结

K-Means 是机器学习中最常用的聚类算法之一,适合簇形状较为规则、数量已知的场景。它简单、高效,但也有对 K 值和噪声敏感等缺点,实际应用时往往需要结合数据分布和改进方法使用。

http://www.lryc.cn/news/613919.html

相关文章:

  • 计算机视觉CS231n学习(5)
  • 手搓MCP全流程指南:从本地开发部署到PyPI公开发布
  • 构建健壮的数据库连接池:高并发 Web 应用的制胜之匙
  • 面向真实场景的定制化图像降质模型设计方案
  • 深度剖析主流AI大模型的编程语言与架构选择:行业实践与技术细节解读
  • Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具
  • 什么是2米分辨率卫星影像数据?
  • Baumer相机如何通过YoloV8深度学习模型实现高速公路车辆的实时检测计数(C#代码UI界面版)
  • 无服务器日志分析由 Elasticsearch 提供支持,推出新的低价层
  • 14. isaacsim4.2教程-April Tags/给相机加噪声
  • 解析工业机器视觉中的飞拍技术
  • MySQL binlog日志文件转为可正常查看的文本文件
  • 双目标定中旋转矩阵参数应用及旋转角度计算(聚焦坐标系平行)
  • 系统网络端口安全扫描脚本及详解
  • Fabarta个人专属智能体:三维搜索链+动态大纲重构教材开发范式
  • 南方略咨询与与清源科技正式启动国际市场GTM流程规划咨询项目!!!
  • 论文阅读:User Behavior Simulation with Large Language Model-based Agents
  • Langchain入门:构建一个基于SQL数据的问答系统
  • 云平台运维工具 ——Azure 原生工具
  • 化工厂安全升级:分布式光纤传感的 “实时监测 + 精准预警” 方案
  • 高校合作 | 世冠科技联合普华、北邮项目入选教育部第二批工程案例
  • 分布式膛压应变测量系统
  • 稿定科技:多云架构下的 AI 存储挑战与 JuiceFS 实践
  • No time to train! Training-Free Reference-Based Instance Segmentation之论文阅读
  • 无人机教育热潮下,超优航空如何为青少年插上科技翅膀?
  • 芯科科技成为全球首家通过PSA 4级认证的物联网芯片厂商巩固其在物联网安全领域的领导地位
  • Claude Code 实战场景解析:从代码生成到系统重构的典型应用案例
  • 负氧离子监测站:守护清新空气的科技卫士
  • Horse3D引擎研发记录(二):基于QtOpenGL使用仿Three.js的BufferAttribute结构重构三角形绘制
  • 技术融合赋能文旅元宇宙:虚实共生重构产业新生态