K-means 聚类算法:从原理到实战的完整知识点
1. 引言K-means 聚类是机器学习领域最经典、应用最广泛的无监督学习算法之一。它通过迭代计算将数据集划分为 K 个互斥的簇cluster使得同一簇内的数据点尽可能相似而不同簇间的数据点尽可能不同。由于其思想直观、实现简单、效率较高K-means 被广泛应用于客户分群、图像分割、文档归类、异常检测等诸多场景。本文将系统性地梳理 K-means 聚类的完整知识点涵盖其核心思想、数学原理、算法步骤、关键参数与优化、优缺点分析以及 Python 实战示例帮助你从零开始全面掌握这一重要算法。2. 核心思想与目标K-means 算法的核心思想可以概括为“物以类聚”。给定一个包含 N 个数据点的数据集和预设的簇数量 K算法的目标是将每个数据点分配到离其最近的“簇中心”centroid所代表的簇中。根据每个簇中所有数据点的位置重新计算该簇的簇中心通常取均值。不断迭代上述两个步骤直到簇中心的位置不再发生显著变化或达到最大迭代次数此时认为算法收敛。其优化的目标函数是最小化簇内平方和Within-Cluster Sum of Squares, WCSS也称为畸变DistortionJ∑i1K∑x∈Ci∣∣x−μi∣∣2 J \sum_{i1}^{K} \sum_{\mathbf{x} \in C_i} ||\mathbf{x} - \boldsymbol{\mu}_i||^2Ji1∑K​x∈Ci​∑​∣∣x−μi​∣∣2其中KKK是簇的个数。CiC_iCi​是第iii个簇。μi\boldsymbol{\mu}_iμi​是第iii个簇的质心均值向量。x\mathbf{x}x是簇CiC_iCi​中的一个数据点。∣∣x−μi∣∣2||\mathbf{x} - \boldsymbol{\mu}_i||^2∣∣x−μi​∣∣2是数据点到其所属簇质心的欧氏距离的平方。算法通过不断调整数据点的分配和簇中心的位置来最小化这个目标函数JJJ。3. 算法步骤详解标准的 K-means 算法遵循以下步骤步骤 1初始化随机从数据集中选择 K 个点作为初始簇中心质心。步骤 2分配阶段对于数据集中的每一个数据点计算其到 K 个簇中心的距离通常使用欧氏距离并将其分配给距离最近的簇中心所对应的簇。步骤 3更新阶段对于每一个簇重新计算其质心。新的质心是该簇所有数据点的均值向量。步骤 4迭代重复步骤 2分配和步骤 3更新直到满足停止条件。常见的停止条件有质心的位置变化小于某个阈值。目标函数JJJ的变化小于某个阈值。达到预设的最大迭代次数。下面的流程图清晰地展示了这一迭代过程否是开始输入数据集与K值随机初始化K个质心将每个数据点分配到最近的质心重新计算每个簇的质心取簇内点的均值质心是否变化显著或达到最大迭代次数输出最终的K个簇及质心4. 关键参数与优化4.1 如何选择 K 值K 是一个需要预先指定的超参数其选择至关重要。肘部法则Elbow Method绘制不同 K 值对应的 WCSS 曲线。WCSS 会随着 K 增大而减小当 K 增加到真实簇数时WCSS 的下降幅度会突然变缓曲线形似“肘部”该点对应的 K 值可作为参考。轮廓系数Silhouette Score结合了簇内的凝聚度和簇间的分离度。轮廓系数的取值范围为 [-1, 1]值越大表示聚类效果越好。可以计算不同 K 值下的平均轮廓系数选择使其最大化的 K。业务理解很多时候K 值由实际应用场景决定例如将客户分为高、中、低价值3类。4.2 初始化的改进K-means随机初始化可能导致算法收敛到局部最优解。K-means 是一种智能初始化方法随机选择第一个质心。对于每个数据点计算其与已选质心的最短距离D(x)D(x)D(x)。按照D(x)2D(x)^2D(x)2的概率分布随机选择下一个质心距离越远的点被选中的概率越大。重复步骤 2-3直到选出 K 个质心。这种方法能使初始质心彼此远离通常能获得更快、更好的收敛结果。sklearn中的KMeans默认使用initk-means。4.3 距离度量默认使用欧氏距离适用于连续数值型数据。对于其他类型的数据可以考虑曼哈顿距离、余弦相似度等但标准的 K-means 算法基于均值计算质心与欧氏距离最小化在数学上等价。5. 算法的优缺点5.1 优点原理简单易于理解和实现。对于大数据集计算效率相对较高时间复杂度约为O(N⋅K⋅I⋅d)O(N \cdot K \cdot I \cdot d)O(N⋅K⋅I⋅d)其中NNN为样本数III为迭代次数ddd为维度。当簇的形状为凸球形且大小相近时效果很好。5.2 缺点与局限性需要预先指定 K 值且 K 值选择不当会影响结果。对初始质心敏感可能收敛到局部最优使用 K-means 可缓解。对噪声和离群点敏感因为它们会显著影响均值的计算。不适合发现非凸形状的簇如环形、月牙形。对数据尺度敏感在应用前通常需要进行标准化如 Z-score 标准化。6. Python 实战示例下面我们使用scikit-learn和matplotlib库演示一个完整的 K-means 聚类流程。6.1 环境准备与数据生成importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_blobsfromsklearn.clusterimportKMeansfromsklearn.metricsimportsilhouette_scorefromsklearn.preprocessingimportStandardScaler# 生成模拟数据X,y_truemake_blobs(n_samples300,centers4,cluster_std0.60,random_state0)plt.scatter(X[:,0],X[:,1],s50)plt.title(原始数据)plt.show()6.2 使用肘部法则选择 K 值# 肘部法则wcss[]foriinrange(1,11):kmeansKMeans(n_clustersi,initk-means,max_iter300,n_init10,random_state0)kmeans.fit(X)wcss.append(kmeans.inertia_)# inertia_ 属性即 WCSSplt.plot(range(1,11),wcss)plt.title(肘部法则)plt.xlabel(簇的数量 (K))plt.ylabel(WCSS)plt.show()观察图形WCSS 下降的“肘部”通常出现在 K4 附近。6.3 训练 K-means 模型并可视化# 根据肘部法则选择 K4kmeansKMeans(n_clusters4,initk-means,max_iter300,n_init10,random_state0)y_kmeanskmeans.fit_predict(X)# 可视化聚类结果plt.scatter(X[y_kmeans0,0],X[y_kmeans0,1],s50,clightblue,label簇 1)plt.scatter(X[y_kmeans1,0],X[y_kmeans1,1],s50,corange,label簇 2)plt.scatter(X[y_kmeans2,0],X[y_kmeans2,1],s50,cgreen,label簇 3)plt.scatter(X[y_kmeans3,0],X[y_kmeans3,1],s50,cred,label簇 4)# 绘制质心plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s200,cblack,markerX,label质心)plt.title(K-means 聚类结果)plt.legend()plt.show()print(f簇中心坐标:\n{kmeans.cluster_centers_})print(f轮廓系数:{silhouette_score(X,y_kmeans):.4f})6.4 对非球形数据的局限性演示fromsklearn.datasetsimportmake_moons# 生成月牙形数据X_moons,_make_moons(n_samples200,noise0.05,random_state0)kmeans_moonsKMeans(n_clusters2,random_state0)y_moons_predkmeans_moons.fit_predict(X_moons)plt.scatter(X_moons[:,0],X_moons[:,1],cy_moons_pred,s50,cmapviridis)plt.scatter(kmeans_moons.cluster_centers_[:,0],kmeans_moons.cluster_centers_[:,1],s200,cred,markerX)plt.title(K-means 对非凸形状聚类效果不佳)plt.show()可以看到K-means 无法正确划分月牙形数据此时应考虑 DBSCAN 或谱聚类等算法。7. 总结与扩展K-means 是聚类分析的基石。掌握其原理、实现和局限性是学习更复杂聚类算法如 DBSCAN、层次聚类、高斯混合模型的良好起点。在实际应用中请注意数据预处理务必进行标准化/归一化。多次运行由于随机初始化可以多次运行算法n_init参数并选择最优结果。结合业务验证聚类结果最终需要结合业务知识进行解读和验证。探索变体如 K-medoids对离群点更鲁棒、Mini-Batch K-means适用于大数据集。希望这篇完整的知识点梳理能帮助你深入理解并有效应用 K-means 聚类算法。

相关新闻

ESP-SR终极指南:如何为嵌入式设备快速添加离线语音识别功能

ESP-SR终极指南:如何为嵌入式设备快速添加离线语音识别功能

ESP-SR终极指南:如何为嵌入式设备快速添加离线语音识别功能 【免费下载链接】esp-sr Speech recognition 项目地址: https://gitcode.com/gh_mirrors/es/esp-sr 想象一下,你的智能设备能够听懂你的指令,无需连接云端,完全离…

2026/10/3 4:15:23 阅读更多 →
Prometheus 监控 Google Cloud Monitoring Exporter 全栈实战:从 GCE 到 Cloud Run 的 GCP 资源可观测性

Prometheus 监控 Google Cloud Monitoring Exporter 全栈实战:从 GCE 到 Cloud Run 的 GCP 资源可观测性

Prometheus 监控 Google Cloud Monitoring Exporter 全栈实战:从 GCE 到 Cloud Run 的 GCP 资源可观测性在 Google Cloud Platform (GCP) 上,无数计算、存储、数据库和无服务器资源支撑着现代应用。GCP 的 Cloud Monitoring(原 Stackdriver&a…

2026/10/4 19:44:53 阅读更多 →
流状态“失忆”与“脑裂”:Spring Boot 流处理状态管理与容错,从灾难到强韧的涅槃之路

流状态“失忆”与“脑裂”:Spring Boot 流处理状态管理与容错,从灾难到强韧的涅槃之路

流状态“失忆”与“脑裂”:Spring Boot 流处理状态管理与容错,从灾难到强韧的涅槃之路 你用 Spring Boot 配合 Kafka Streams 或 Flink 构建了实时流处理服务,订单风控、实时特征计算跑得风生水起。然而一个周五的下午,服务滚动重…

2026/9/24 12:22:03 阅读更多 →

最新新闻

Trade.dll与TradeX.dll调用避坑指南:通达信程序化交易接口实战

Trade.dll与TradeX.dll调用避坑指南:通达信程序化交易接口实战

简介:面向量化交易与程序化交易开发者的通达信交易接口资料包,整合老版Trade.dll与新一代TradeX.dll行情交易二合一接口,通过TdxTradeServer将交易请求封装为HTTP REST API,解决DLL直连的跨语言调用与远程接入难题,适用…

2026/10/4 21:56:06 阅读更多 →
AI论文网站排行:10款避坑,毕业生真心推荐TaoToken

AI论文网站排行:10款避坑,毕业生真心推荐TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 21:56:06 阅读更多 →
内存压力测试实战指南:从工具选型到容器避坑全解析

内存压力测试实战指南:从工具选型到容器避坑全解析

简介:一份内存压力测试工具memtester 4.1.2的源码压缩包,面向Linux系统管理员、运维人员及底层开发者,用于检测服务器或PC内存的稳定性与潜在错误,解决因内存位翻转、数据丢失或内存泄漏导致的系统崩溃、数据损坏等隐患。压缩包仅…

2026/10/4 21:56:06 阅读更多 →
Cursor插件四层架构:解决加载失败与中文支持实战指南

Cursor插件四层架构:解决加载失败与中文支持实战指南

1. 项目概述:从“plugins”标题看Cursor生态的底层逻辑与实操真相“plugins”这个词在Cursor语境下,绝不是简单的一个文件夹名或配置项。它直指当前AI编程工具最核心、也最容易被新手忽略的命脉——可扩展性架构。我用Cursor三年,从最早手动改…

2026/10/4 21:55:05 阅读更多 →
Unity3D嵌入WPF实战:窗口句柄、D3DImage纹理共享与视频流方案选型

Unity3D嵌入WPF实战:窗口句柄、D3DImage纹理共享与视频流方案选型

简介:面向需要在桌面应用中集成三维交互能力的开发者,这份资源围绕Unity3D嵌入WPF的实现流程,提供了从Unity场景设计、工程导出到WPF宿主集成的完整示例,覆盖了WindowsFormsHost控件承载渲染窗口、场景加载,以及Unity与…

2026/10/4 21:55:05 阅读更多 →
代码 Agent 自动处理 GitHub Issue 并生成 PR 的工程实践

代码 Agent 自动处理 GitHub Issue 并生成 PR 的工程实践

1. 为什么我要把 Issue 到 PR 这条链路交给代码 Agent第一次冒出“让代码 Agent 处理 GitHub Issue”这个念头,是因为我实在受够了那种机械重复的搬运工作。团队里每天都有新 Issue 进来,一半是拼写错误、空指针防护、日志格式不统一这类小修小补&#x…

2026/10/4 21:55:05 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →