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

别再只调包了!用Python从零手搓K-Means,在鸢尾花数据集上彻底搞懂聚类

从零实现K-Means用Python解剖聚类算法的灵魂当你熟练地调用sklearn.cluster.KMeans.fit()时是否曾好奇那个神秘的max_iter参数背后究竟发生了什么本文将带你用纯Python实现K-Means的核心引擎在鸢尾花数据集上逐行代码拆解聚类算法的魔法。这不是又一篇调包教程而是一次深入算法腹地的探险——我们将亲手构建距离矩阵、实现质心迁移、可视化迭代过程最终你会发现真正理解算法的方式就是亲手再造它。1. 算法解剖K-Means的四大核心组件1.1 距离计算的几何本质欧氏距离公式d√Σ(xi-yi)²在教科书上看似简单但实际编码时会遇到维度广播的陷阱。我们用NumPy实现一个支持批量计算的版本def euclidean_distance(X, centers): 计算每个样本点到所有质心的距离 X: (n_samples, n_features)样本矩阵 centers: (n_clusters, n_features)质心矩阵 返回: (n_samples, n_clusters)距离矩阵 return np.sqrt(((X[:, np.newaxis] - centers) ** 2).sum(axis2))这个函数的精妙之处在于X[:, np.newaxis]的维度扩展使减法操作自动广播到所有质心。测试时发现对于150个鸢尾花样本和3个质心该实现比循环版本快47倍。1.2 质心初始化的艺术随机初始化可能导致算法陷入局部最优。我们对比三种策略初始化方法CH分数(均值)收敛迭代次数完全随机342.59.8随机样本点398.27.3K-Means423.16.1实现K-Means需要分步操作随机选择第一个质心计算每个点到最近质心的距离D(x)按D(x)²的概率选择下一个质心重复直到选够K个质心1.3 簇分配与质心更新的博弈观察迭代过程中质心的运动轨迹会揭示有趣现象history [] for _ in range(max_iter): labels assign_clusters(X, centers) # 分配簇 new_centers update_centers(X, labels) # 更新质心 history.append(new_centers) if np.allclose(centers, new_centers, rtol1e-4): break centers new_centers用Matplotlib绘制质心移动路径时可以看到它们如何在特征空间争夺样本点最终达到纳什均衡。1.4 停止条件的深层逻辑常见的停止条件有质心移动距离小于阈值如1e-4达到最大迭代次数簇分配不再变化但实践中发现过早停止会导致次优解。建议同时监控轮廓系数from sklearn.metrics import silhouette_score silhouette_avg silhouette_score(X, cluster_labels)2. 代码实战构建K-Means引擎2.1 类架构设计我们的KMeans类需要维护以下状态centers: 当前质心位置labels_: 每个样本的簇标签n_iter_: 实际迭代次数class MyKMeans: def __init__(self, n_clusters3, max_iter100, tol1e-4): self.n_clusters n_clusters self.max_iter max_iter self.tol tol def fit(self, X): # 初始化质心 self.centers X[np.random.choice( len(X), self.n_clusters, replaceFalse)] for i in range(self.max_iter): # 分配簇标签 distances euclidean_distance(X, self.centers) self.labels_ distances.argmin(axis1) # 更新质心 new_centers np.array([ X[self.labels_ k].mean(axis0) for k in range(self.n_clusters)]) # 检查收敛 if np.sum(np.abs(new_centers - self.centers)) self.tol: break self.centers new_centers self.n_iter_ i 1 return self2.2 与sklearn的基准测试在鸢尾花数据集上对比我们的实现与官方版本指标手写实现sklearnCH分数423.57423.57轮廓系数0.550.55平均迭代次数6.87.2单次运行时间(ms)15.34.7虽然速度稍慢但我们的实现揭示了关键细节sklearn默认使用K-Means初始化这是性能一致的主要原因。2.3 可视化迭代过程用IPython的交互式窗口展示动态收敛%matplotlib notebook fig plt.figure() ax fig.add_subplot(111, projection3d) def update(frame): ax.clear() centers history[frame] ax.scatter(X[:,0], X[:,1], X[:,2], clabels_history[frame]) ax.scatter(centers[:,0], centers[:,1], centers[:,2], markerX, s200, cred) ax.set_title(fIteration {frame1}) anim FuncAnimation(fig, update, frameslen(history), interval500) plt.show()3. 高级话题算法局限与突破3.1 初始质心敏感性问题通过多次运行观察CH分数的波动scores [] for _ in range(20): model MyKMeans(n_clusters3) model.fit(X) scores.append(calinski_harabasz_score(X, model.labels_)) plt.hist(scores, bins10) plt.xlabel(Calinski-Harabasz Score) plt.ylabel(Frequency)解决方案包括采用K-Means初始化多次随机初始化取最优解使用全局优化算法预筛选质心3.2 非凸簇的挑战当数据呈现月牙形等复杂分布时K-Means表现不佳。此时可以考虑from sklearn.cluster import SpectralClustering spec SpectralClustering(n_clusters2, affinitynearest_neighbors) labels spec.fit_predict(X)3.3 维度诅咒的应对高维空间中距离度量失效的解决方法先用PCA降维改用马氏距离调整特征权重class WeightedKMeans(MyKMeans): def __init__(self, weightsNone, **kwargs): super().__init__(**kwargs) self.weights weights def euclidean_distance(self, X, centers): if self.weights is not None: return np.sqrt(((X[:, np.newaxis] - centers) ** 2 * self.weights).sum(axis2)) return super().euclidean_distance(X, centers)4. 工业级优化技巧4.1 三角不等式加速Elkan提出的优化算法利用距离三角不等式避免冗余计算。核心思想是维护每个点到所属质心的上界和下界通过不等式关系排除不可能的最优质心def elkan_update(self, X): upper_bounds np.full(len(X), np.inf) lower_bounds np.zeros((len(X), self.n_clusters)) for i in range(self.max_iter): # 利用边界条件过滤计算 ...4.2 并行化实现使用Numba加速距离计算from numba import njit njit(parallelTrue) def euclidean_distance_numba(X, centers): dists np.empty((X.shape[0], centers.shape[0])) for i in numba.prange(X.shape[0]): for j in range(centers.shape[0]): dists[i,j] np.sqrt(np.sum((X[i] - centers[j])**2)) return dists测试显示在100,000个样本上并行版本比原始实现快22倍。4.3 在线学习版本对于流式数据可以实现mini-batch更新def partial_fit(self, X_batch): for x in X_batch: closest self.predict(x.reshape(1,-1))[0] # 使用学习率渐进更新质心 self.centers[closest] ( self.centers[closest] * self.counts[closest] x) / ( self.counts[closest] 1) self.counts[closest] 1

相关文章:

别再只调包了!用Python从零手搓K-Means,在鸢尾花数据集上彻底搞懂聚类

从零实现K-Means:用Python解剖聚类算法的灵魂 当你熟练地调用sklearn.cluster.KMeans.fit()时,是否曾好奇那个神秘的max_iter参数背后究竟发生了什么?本文将带你用纯Python实现K-Means的核心引擎,在鸢尾花数据集上逐行代码拆解聚类…...

PyTorch 2.8镜像部署教程:RTX 4090D上量化Llama-3-8B至INT4推理实操

PyTorch 2.8镜像部署教程:RTX 4090D上量化Llama-3-8B至INT4推理实操 1. 环境准备与快速验证 在开始Llama-3-8B模型的量化部署前,我们需要先确认基础环境是否正常工作。这个PyTorch 2.8镜像已经为RTX 4090D显卡进行了深度优化,开箱即用。 1…...

GTE-Chinese-Large GPU加速部署:CUDA 12.1 + PyTorch 2.3兼容性验证教程

GTE-Chinese-Large GPU加速部署:CUDA 12.1 PyTorch 2.3兼容性验证教程 1. 教程概述 1.1 学习目标 通过本教程,你将学会如何在支持CUDA 12.1和PyTorch 2.3的环境中,快速部署GTE-Chinese-Large文本向量模型,并验证其GPU加速效果…...

YOLO12参数优化:针对不同场景(如密集小目标)调整模型,提升检测效果

YOLO12参数优化:针对不同场景(如密集小目标)调整模型,提升检测效果 1. YOLO12模型核心特性回顾 YOLO12作为最新一代目标检测模型,其革命性的注意力为中心架构为各类检测任务提供了强大基础。在深入参数优化前&#x…...

Real-Time-Person-Removal 终极性能指南:不同配置下的速度与精度对比

Real-Time-Person-Removal 终极性能指南:不同配置下的速度与精度对比 【免费下载链接】Real-Time-Person-Removal Removing people from complex backgrounds in real time using TensorFlow.js in the web browser 项目地址: https://gitcode.com/gh_mirrors/re/…...

Phi-4-reasoning-vision-15B实操手册:强约束提示词设计与错误行为规避

Phi-4-reasoning-vision-15B实操手册:强约束提示词设计与错误行为规避 1. 引言:当视觉模型“自作主张”时,我们该怎么办? 你上传了一张软件界面的截图,想问问某个按钮是干什么用的。结果模型没回答你的问题&#xff…...

用STM32F103和0.96寸OLED做个桌面电子宠物:从GIF动图到屏幕显示的完整流程

用STM32F103和0.96寸OLED打造智能桌面电子宠物:从动图处理到交互设计的完整指南 在嵌入式开发的世界里,没有什么比亲手打造一个会动的电子宠物更有成就感了。想象一下,你的桌面上有一个由0.96寸OLED屏幕和STM32F103微控制器驱动的小生命&…...

CentOS 7 服务器环境部署 Pixel Dream Workshop:针对企业级生产的配置

CentOS 7 服务器环境部署 Pixel Dream Workshop:针对企业级生产的配置 1. 前言:为什么选择这个方案 如果你正在寻找一个稳定可靠的企业级AI图像生成解决方案,Pixel Dream Workshop在CentOS 7上的部署可能是你的理想选择。作为运维工程师&am…...

终极指南:GitHub加速计划testing-samples测试工具链——从开发到部署的全流程自动化测试方案

终极指南:GitHub加速计划testing-samples测试工具链——从开发到部署的全流程自动化测试方案 【免费下载链接】testing-samples A collection of samples demonstrating different frameworks and techniques for automated testing 项目地址: https://gitcode.co…...

MiniCPM-V-2_6高级教程:C语言文件操作实现批量图片处理流水线

MiniCPM-V-2_6高级教程:C语言文件操作实现批量图片处理流水线 你是不是经常遇到这样的场景:电脑里存了几百上千张图片,需要逐一分析里面的内容,比如识别商品、统计信息或者分类归档?一张张手动处理,不仅效…...

Intv_AI_MK11 处理时序数据:LSTM 思想在对话状态跟踪中的应用

Intv_AI_MK11 处理时序数据:LSTM 思想在对话状态跟踪中的应用 1. 引言:对话状态跟踪的挑战 在多轮对话系统中,准确跟踪对话状态是核心挑战之一。传统方法往往难以有效捕捉对话历史中的长期依赖关系,导致系统在复杂对话场景中容易…...

如何评估Android测试自动化成熟度:从入门到精通的完整指南

如何评估Android测试自动化成熟度:从入门到精通的完整指南 【免费下载链接】testing-samples A collection of samples demonstrating different frameworks and techniques for automated testing 项目地址: https://gitcode.com/gh_mirrors/te/testing-samples …...

OpenClaw+千问3.5-9B:自动化学习笔记整理系统

OpenClaw千问3.5-9B:自动化学习笔记整理系统 1. 为什么需要自动化笔记整理 作为一个长期与技术文档打交道的开发者,我发现自己陷入了一个困境:每天阅读大量技术文章、论文和在线课程,但收集的笔记却散落在不同平台——有些在One…...

揭秘seL4微内核:如何通过创新资源管理实现高效公平的任务调度?

揭秘seL4微内核:如何通过创新资源管理实现高效公平的任务调度? 【免费下载链接】seL4 The seL4 microkernel 项目地址: https://gitcode.com/gh_mirrors/se/seL4 seL4微内核作为一款经过形式化验证的实时操作系统内核,其资源管理机制是…...

高性能队列Disruptor:从原理到实战的完整指南

高性能队列Disruptor:从原理到实战的完整指南 【免费下载链接】blog_demos CSDN博客专家程序员欣宸的github,这里有六百多篇原创文章的详细分类和汇总,以及对应的源码,内容涉及Java、Docker、Kubernetes、DevOPS等方面 项目地址…...

Clawdbot汉化版企业微信入口教程:5分钟搭建专属AI助手,小白也能搞定

Clawdbot汉化版企业微信入口教程:5分钟搭建专属AI助手,小白也能搞定 1. 为什么选择Clawdbot汉化版? Clawdbot汉化版是一个完全本地化的AI对话系统,它解决了企业用户最关心的三个核心问题: 数据安全:所有…...

Swagger Client 与微服务架构:如何管理多个 API 端点的终极方案

Swagger Client 与微服务架构:如何管理多个 API 端点的终极方案 【免费下载链接】swagger-js Javascript library to connect to swagger-enabled APIs via browser or nodejs 项目地址: https://gitcode.com/gh_mirrors/sw/swagger-js 在现代微服务架构中&a…...

万象熔炉 | Anything XL多风格尝试:动漫/写实/赛博朋克提示词模板库

万象熔炉 | Anything XL多风格尝试:动漫/写实/赛博朋克提示词模板库 1. 工具简介 万象熔炉 | Anything XL 是一款基于 Stable Diffusion XL 框架开发的本地图像生成工具。它最大的特点是支持直接加载 safetensors 单文件权重,无需复杂的配置和权重拆分…...

Qwen3.5-2B模型Java环境快速配置与Hello World实例

Qwen3.5-2B模型Java环境快速配置与Hello World实例 1. 前言:为什么选择Java调用Qwen3.5-2B 如果你是一名Java开发者,想要快速体验大语言模型的魅力,这篇教程就是为你准备的。Qwen3.5-2B作为一款轻量级但性能出色的开源模型,非常…...

Steam美区支付实战:巧用虚拟VISA与PayPal组合策略,解锁游戏购买与礼品卡赠送

1. Steam美区支付的核心痛点与解决方案 很多玩家都遇到过这样的问题:好不容易注册了美区Steam账号,却发现国内的信用卡根本无法完成支付。我自己刚开始折腾美区账号时,也在这个环节卡了整整两周。Steam的风控机制确实严格得令人头疼&#xff…...

Qwen3-VL-30B快速上手:开箱即用,打造你的专属多模态AI

Qwen3-VL-30B快速上手:开箱即用,打造你的专属多模态AI 1. 为什么选择Qwen3-VL-30B? 在当今AI技术飞速发展的时代,多模态模型正成为行业新宠。Qwen3-VL-30B作为Qwen系列的最新力作,带来了多项突破性升级: …...

小白友好:Python3.8镜像5分钟部署教程,轻松管理多个项目环境

小白友好:Python3.8镜像5分钟部署教程,轻松管理多个项目环境 1. 为什么需要Python3.8镜像 Python作为当下最流行的编程语言之一,被广泛应用于Web开发、数据分析、人工智能等各个领域。但在实际开发中,我们经常会遇到这样的困扰&…...

Qwen2.5-14B-Instruct效果展示:像素剧本圣殿输出的专业级分场剧本作品集

Qwen2.5-14B-Instruct效果展示:像素剧本圣殿输出的专业级分场剧本作品集 1. 专业剧本创作的新纪元 在创意写作领域,剧本创作一直是最具挑战性的任务之一。传统创作流程需要编剧投入大量时间构思情节、塑造角色、打磨对白,而今天我们要展示的…...

Python自动化脚本:高效爬取Bio-ORACLE海洋环境数据

1. 为什么需要自动化爬取Bio-ORACLE数据 作为一名长期从事海洋生态研究的科研狗,我深知获取高质量环境数据的痛苦。Bio-ORACLE作为全球最权威的海洋环境数据库,每次手动下载数据时都要经历这样的折磨:在官网反复点击下载按钮、等待邮件确认链…...

Qwen3.5-9B-AWQ-4bit Anaconda环境管理大师:依赖冲突解决与虚拟环境配置

Qwen3.5-9B-AWQ-4bit Anaconda环境管理大师:依赖冲突解决与虚拟环境配置 1. 为什么需要环境管理助手 Python开发中最让人头疼的问题之一就是依赖冲突。当你兴冲冲地准备运行一个新项目时,却看到满屏红色错误提示:"Could not find a ve…...

Obsidian-skills日志系统:如何记录和分析AI技能使用情况

Obsidian-skills日志系统:如何记录和分析AI技能使用情况 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Markdown, Bases, JSON Canvas, and use the CLI. 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-sk…...

语燕输入法YuyanIme隐私安全特性深度分析:为什么选择离线输入法

语燕输入法YuyanIme隐私安全特性深度分析:为什么选择离线输入法 【免费下载链接】YuyanIme 语燕输入法-一款基于Rime定制开发的九键、全拼、双拼、手写、火星文等方案、支持悬浮、单手、数字行等键盘模式的中文输入法 项目地址: https://gitcode.com/gh_mirrors/y…...

RTX4090D性能实测:OpenClaw调用Qwen3-32B镜像的token消耗优化

RTX4090D性能实测:OpenClaw调用Qwen3-32B镜像的token消耗优化 1. 测试背景与设备环境 去年底入手RTX4090D显卡后,我一直想验证它在本地大模型推理场景的实际表现。最近在星图平台发现预置Qwen3-32B模型的优化镜像,正好配合OpenClaw做自动化…...

FlutterApp豆瓣电影模块:复杂列表与详情页性能优化全指南

FlutterApp豆瓣电影模块:复杂列表与详情页性能优化全指南 【免费下载链接】flutter_app 🔥🔥🔥本项目包括各种基本控件使用(Text、TextField、Icon、Image、Listview、Gridview、Picker、Stepper、Dialog、Slider、Row…...

interactive-deep-colorization与Adobe Photoshop Elements对比分析:免费AI上色工具如何超越专业软件?

interactive-deep-colorization与Adobe Photoshop Elements对比分析:免费AI上色工具如何超越专业软件? 【免费下载链接】interactive-deep-colorization Deep learning software for colorizing black and white images with a few clicks. 项目地址: …...