K-Means 算法从零实现:手写 100 行代码,可视化 5 步迭代过程
K-Means 算法从零实现手写 100 行代码可视化 5 步迭代过程当数据科学家第一次接触聚类问题时K-Means 算法往往是他们的首选武器。这个看似简单的算法背后隐藏着优雅的数学原理和强大的实践价值。今天我们将抛开现成的机器学习库用不到100行Python代码实现完整的K-Means算法并通过动态可视化揭示其迭代过程的奥秘。1. 算法原理与核心思想K-Means 的核心目标是将n个数据点划分到k个簇中使得每个点到其所属簇中心的距离平方和最小。这个过程可以分解为两个关键步骤分配阶段将每个点分配给最近的簇中心更新阶段重新计算每个簇的中心位置数学表达式为最小化以下目标函数J Σ(每个点到其簇中心的距离²)算法执行流程如下初始化k个簇中心 while 簇中心变化大于阈值: 将每个点分配到最近的簇中心 重新计算每个簇的中心位置注意K-Means对初始中心点选择敏感通常采用k-means初始化方法减少迭代次数2. 环境准备与数据生成我们使用NumPy进行矩阵运算Matplotlib进行可视化。首先创建一个包含三个明显簇的二维数据集import numpy as np import matplotlib.pyplot as plt # 生成模拟数据 np.random.seed(42) cluster1 np.random.normal(loc[0,0], scale0.5, size(50,2)) cluster2 np.random.normal(loc[3,3], scale0.8, size(50,2)) cluster3 np.random.normal(loc[-3,3], scale0.3, size(50,2)) data np.vstack([cluster1, cluster2, cluster3]) # 可视化初始数据 plt.scatter(data[:,0], data[:,1], alpha0.6) plt.title(原始数据分布) plt.show()3. 完整K-Means类实现下面是我们实现的K-Means类包含核心算法和可视化功能class KMeans: def __init__(self, n_clusters3, max_iter100, tol1e-4): self.n_clusters n_clusters self.max_iter max_iter self.tol tol self.history [] # 记录每次迭代的中心点变化 def _init_centers(self, X): # 随机初始化中心点 indices np.random.permutation(X.shape[0])[:self.n_clusters] return X[indices] def _assign_clusters(self, X, centers): # 计算每个点到各中心的距离 distances np.linalg.norm(X[:, np.newaxis] - centers, axis2) # 返回最近中心的索引 return np.argmin(distances, axis1) def _update_centers(self, X, labels): centers np.zeros((self.n_clusters, X.shape[1])) for k in range(self.n_clusters): centers[k] np.mean(X[labels k], axis0) return centers def fit(self, X): self.centers self._init_centers(X) for _ in range(self.max_iter): old_centers self.centers.copy() self.labels self._assign_clusters(X, self.centers) self.centers self._update_centers(X, self.labels) self.history.append((old_centers.copy(), self.labels.copy())) # 检查收敛条件 if np.linalg.norm(self.centers - old_centers) self.tol: break return self def plot_iterations(self, X, rows2, cols3): plt.figure(figsize(15, 10)) for i, (centers, labels) in enumerate(self.history[:rows*cols]): plt.subplot(rows, cols, i1) for k in range(self.n_clusters): cluster_data X[labels k] plt.scatter(cluster_data[:,0], cluster_data[:,1], alpha0.6) plt.scatter(centers[k,0], centers[k,1], cblack, markerx, s100) plt.title(f迭代 {i1}) plt.tight_layout() plt.show()4. 算法执行与可视化分析现在让我们使用这个类并观察其迭代过程# 初始化并训练模型 kmeans KMeans(n_clusters3) kmeans.fit(data) # 可视化迭代过程 kmeans.plot_iterations(data) # 打印最终中心点 print(最终簇中心) print(kmeans.centers)典型的迭代过程会呈现以下演变初始随机中心中心点可能聚集在同一区域第一次分配形成初步的簇边界中心点调整中心向数据密集区移动稳定状态中心和簇分配不再显著变化5. 关键问题与优化技巧在实际应用中我们需要注意以下几个关键问题初始中心敏感度k-means初始化可以显著改善结果肘部法则确定K值通过不同K值的SSE曲线拐点选择最优簇数数据标准化不同量纲的特征需要归一化处理优化后的初始化方法实现def kmeans_plus_plus(X, n_clusters): centers [X[np.random.randint(X.shape[0])]] for _ in range(1, n_clusters): distances np.array([min([np.linalg.norm(x-c)**2 for c in centers]) for x in X]) prob distances / distances.sum() centers.append(X[np.random.choice(X.shape[0], pprob)]) return np.array(centers)6. 数学推导与变种算法K-Means可以看作是一种期望最大化(EM)算法E步固定中心点优化簇分配最小化JM步固定簇分配优化中心点求导令∂J/∂c0常见变种包括算法变种改进点适用场景K-Medoids使用中位数代替均值抗噪声数据Mini-Batch使用数据子集更新大规模数据Fuzzy C-Means软分配概率隶属度重叠簇场景7. 实战建议与性能考量在实际项目中应用K-Means时# 最佳实践示例 from sklearn.preprocessing import StandardScaler from sklearn.metrics import silhouette_score # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(data) # 寻找最优K值 silhouette_scores [] for k in range(2, 6): kmeans KMeans(n_clustersk).fit(X_scaled) score silhouette_score(X_scaled, kmeans.labels) silhouette_scores.append(score) # 可视化K值选择 plt.plot(range(2,6), silhouette_scores, markero) plt.xlabel(Number of clusters) plt.ylabel(Silhouette Score) plt.show()关键性能指标对比计算复杂度O(nkI*d)n样本数k簇数I迭代次数d特征数内存需求只需存储中心点和临时距离矩阵收敛速度通常10-20次迭代即可收敛8. 扩展应用与创新思路K-Means的变通应用场景图像压缩将像素颜色聚类为k种代表色异常检测远离所有中心的点视为异常特征工程簇编号作为新特征创新改进方向自适应K值根据数据密度动态调整簇数核方法通过核函数处理非线性可分数据流数据增量式更新中心点# 图像压缩示例 from sklearn.cluster import KMeans from PIL import Image def compress_image(image_path, n_colors16): image Image.open(image_path) pixels np.array(image).reshape(-1, 3) kmeans KMeans(n_clustersn_colors).fit(pixels) compressed kmeans.cluster_centers_[kmeans.labels_].reshape(image.size[1], image.size[0], 3) return Image.fromarray(compressed.astype(uint8))9. 算法局限与替代方案K-Means的固有局限假设簇是凸形且各向同性对噪声和异常值敏感需要预先指定簇数量替代算法对比算法优势劣势DBSCAN自动确定簇数处理任意形状参数敏感高维效果差高斯混合模型软聚类概率输出计算复杂可能过拟合谱聚类能发现复杂结构内存消耗大扩展性差10. 工程实践中的技巧在真实业务场景中应用K-Means时特征选择使用PCA降维提高聚类效果评估指标结合轮廓系数和肘部法则并行化利用Spark MLlib处理海量数据增量学习partial_fit方法处理流式数据一个完整的聚类分析流程# 完整分析流程示例 def full_analysis(X, max_k10): # 数据预处理 X StandardScaler().fit_transform(X) X PCA(n_components0.95).fit_transform(X) # 寻找最优K results [] for k in range(2, max_k1): kmeans KMeans(n_clustersk).fit(X) results.append({ k: k, inertia: kmeans.inertia_, silhouette: silhouette_score(X, kmeans.labels_) }) # 可视化评估 fig, (ax1, ax2) plt.subplots(1, 2, figsize(12,4)) ax1.plot([r[k] for r in results], [r[inertia] for r in results]) ax1.set_title(Elbow Method) ax2.plot([r[k] for r in results], [r[silhouette] for r in results]) ax2.set_title(Silhouette Score) plt.show() return results11. 可视化进阶技巧除了基本的散点图我们还可以使用更多高级可视化def advanced_visualization(X, labels, centers): plt.figure(figsize(12,5)) # 原始数据与簇分布 plt.subplot(121) for k in range(len(centers)): cluster_data X[labels k] plt.scatter(cluster_data[:,0], cluster_data[:,1], alpha0.5) plt.scatter(centers[:,0], centers[:,1], cblack, markerX, s200) # Voronoi图展示决策边界 plt.subplot(122) x_min, x_max X[:,0].min()-1, X[:,0].max()1 y_min, y_max X[:,1].min()-1, X[:,1].max()1 xx, yy np.meshgrid(np.linspace(x_min, x_max, 500), np.linspace(y_min, y_max, 500)) Z np.array([np.argmin([np.linalg.norm(x-c) for c in centers]) for x in np.c_[xx.ravel(), yy.ravel()]]) Z Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha0.3) plt.scatter(X[:,0], X[:,1], clabels, alpha0.6) plt.scatter(centers[:,0], centers[:,1], cblack, markerX, s200) plt.tight_layout() plt.show()12. 数学深度解析从优化角度理解K-Means目标函数J Σ_{i1}^n Σ_{k1}^K r_{ik} ||x_i - μ_k||^2其中r_{ik}是指示变量点i是否属于簇k求导过程∂J/∂μ_k 2Σ_{i1}^n r_{ik}(μ_k - x_i) 0 μ_k Σ r_{ik}x_i / Σ r_{ik}这正好对应我们的更新步骤新的中心是所有属于该簇的点的平均值。13. 多维数据与降维处理对于高维数据我们可以结合降维技术from sklearn.decomposition import PCA # 高维数据聚类示例 def high_dim_clustering(X, n_clusters3): # 降维可视化 pca PCA(n_components2) X_pca pca.fit_transform(X) # 聚类 kmeans KMeans(n_clustersn_clusters).fit(X) # 可视化 plt.scatter(X_pca[:,0], X_pca[:,1], ckmeans.labels_) plt.title(PCA Projection with Cluster Labels) plt.show() return kmeans14. 时间序列与轨迹聚类K-Means也可以应用于时间序列数据from scipy.spatial.distance import euclidean from fastdtw import fastdtw # 动态时间规整距离 def time_series_clustering(series_list, n_clusters3): # 计算距离矩阵 distance_matrix np.zeros((len(series_list), len(series_list))) for i in range(len(series_list)): for j in range(i1, len(series_list)): distance, _ fastdtw(series_list[i], series_list[j]) distance_matrix[i,j] distance distance_matrix[j,i] distance # 谱聚类 from sklearn.cluster import SpectralClustering model SpectralClustering(n_clustersn_clusters, affinityprecomputed) labels model.fit_predict(distance_matrix) return labels15. 总结与未来方向通过这次从零实现我们深入理解了K-Means的每个细节。现代机器学习框架虽然提供了现成的实现但亲手编写算法仍然是掌握其精髓的最佳方式。未来可以探索与深度学习结合的自适应聚类处理流式数据的在线聚类算法融合领域知识的半监督聚类方法完整的实现代码和可视化工具可以轻松扩展到实际项目中成为数据分析工具箱中的利器。

相关新闻

Claude 中转站怎么选?国内开发者的稳定接入清单

Claude 中转站怎么选?国内开发者的稳定接入清单

🧭 适合人群:准备把 AI 编程助手接入日常开发,但还没确定入口、模型、费用和稳定性标准的开发者。 🚀 先把问题说清楚 很多人搜索“Claude 中转站”,并不是单纯想找一个地址,而是想解决三个现实问题&#…

2026/7/9 7:45:17阅读更多 →
RTSP 拉流与录制:IPC 摄像头本地录像完整方案

RTSP 拉流与录制:IPC 摄像头本地录像完整方案

RTSP 拉流与录制:IPC 摄像头本地录像完整方案 做 IPC 摄像头、无人售货柜、安防监控,RTSP 拉流和录制是基本功。这篇讲清楚:怎么稳定拉流、怎么存成文件、怎么按时间分片、断线怎么自动重连、延迟怎么优化——全是实际项目里踩过的坑。 大家好…

2026/7/9 7:45:17阅读更多 →
Google PAT论文助手:AI智能体框架在学术评审中的推理缩放与自动化验证

Google PAT论文助手:AI智能体框架在学术评审中的推理缩放与自动化验证

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在科研论文评审过程中,审稿人需要投入大量时间阅读文献、验证实验、检查逻辑一致性,这一过程既耗时又容易因人…

2026/7/9 7:40:17阅读更多 →
ChatBI试点常见12问:客户成功一线的FAQ与行动建议

ChatBI试点常见12问:客户成功一线的FAQ与行动建议

导语 “ChatBI到底能不能直接替代分析师?”“是不是接上大模型,业务就能自己问数了?”“试点选哪个场景才不会翻车?”——这是我们在陪伴客户启动ChatBI试点的头一个月里,几乎每周都会被反复追问的问题。答案往往不是一…

2026/7/9 8:55:23阅读更多 →
XUnity自动翻译器:打破语言壁垒,畅玩全球Unity游戏

XUnity自动翻译器:打破语言壁垒,畅玩全球Unity游戏

XUnity自动翻译器:打破语言壁垒,畅玩全球Unity游戏 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩文本而烦恼吗?是否曾因语言障碍而错过优秀的…

2026/7/9 8:55:23阅读更多 →
外教课录音怎么选?AI智能整理清晰高效帮你省不少心

外教课录音怎么选?AI智能整理清晰高效帮你省不少心

外教课录音怎么选,核心不是选多贵的录音设备,是选对匹配你需求的后续整理方式。如果你录完只是临时记内容,听完就删,用手机自带录音功能就足够;如果需要用来课后复习、整理知识点、做论文语料积累,一定要选…

2026/7/9 8:55:23阅读更多 →
d2s-editor:5分钟学会修改暗黑破坏神2存档的终极指南

d2s-editor:5分钟学会修改暗黑破坏神2存档的终极指南

d2s-editor:5分钟学会修改暗黑破坏神2存档的终极指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经想过轻松修改暗黑破坏神2的存档文件,但又害怕复杂的十六进制编辑器?d2s-editor…

2026/7/9 8:55:23阅读更多 →
web作业1-3

web作业1-3

Web作业1输出九九乘法表编写表单和表单信息接收这两个页面Web作业2从数据库获取显示修改表单<% page contentType"text/html;charset UTF-8" language"java" %><% page import"java .sql.*" %><!DOCTYPE html><html><…

2026/7/9 8:55:23阅读更多 →
腾讯云Edgeone Makers:轻松打造AI Agent,小白也能玩转AI开发!

腾讯云Edgeone Makers:轻松打造AI Agent,小白也能玩转AI开发!

1.Edgeone Makers是什么 腾讯最近上线的Edgeone makers&#xff0c;可以帮开发者快速搭建和运行 AI Agent&#xff0c;不需要自己搭建一堆复杂的服务。它提供了模型接入、运行环境、数据记忆和监控等能力&#xff0c;让你可以更简单地把 AI 功能接入现有业务&#xff0c;或者快…

2026/7/9 8:50:23阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/8 7:00:12阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集&#xff1a; 三维可视化功能案例&#xff08;threehub.cn&#xff09;开源仓库github地址&#xff1a; https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理&#xff1a;开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0&#xff1a;ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中&#xff0c;表结构变更&#xff08;DDL操作&#xff09;是不可避免的需求。GBase 8a作为国产分析型数据库代表&#xff0c;与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/8 6:59:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →