Day 86:【99天精通Python】机器学习进阶 - K-Means 聚类 - 让数据自动“站队“

Day 86:【99天精通Python】机器学习进阶 - K-Means 聚类 - 让数据自动"站队"

前言

欢迎来到第86天!

在之前的机器学习课程中,我们处理的都是有监督学习 (Supervised Learning)
这意味着我们的数据都带有标签 (Label),比如:这张图片是"猫",这个房价是"300万"。

但现实中,大量的数据是没有标签的。比如,你有一堆用户的消费记录,但你不知道他们属于哪个消费群体。
无监督学习 (Unsupervised Learning)就是要让机器在没有标签的数据中,自动发现隐藏的结构。聚类 (Clustering)是其中最常用的一种。

K-Means是最经典的聚类算法,它的目标是把数据分成 K 个簇,让同一个簇内的数据尽可能相似,不同簇之间的数据尽可能不同。

本节内容:

  • K-Means 算法原理
  • Sklearn 中的KMeans
  • 评估指标:轮廓系数 (Silhouette Score)
  • 手肘法 (Elbow Method) 确定 K 值
  • 实战练习:客户分群

一、K-Means 原理:“物以类聚,人以群分”

算法流程很简单:

  1. 初始化:随机选择 K 个点作为初始的"质心" (Centroids)。
  2. 分配 (Assignment):计算每个数据点到各个质心的距离,把它分到最近的那个簇。
  3. 更新 (Update):重新计算每个簇的平均值,将质心移动到这个平均值的位置。
  4. 重复2-3 步,直到质心不再移动。

[外链图片转存中…(img-346iHRze-1768773799828)]


二、Sklearn 实现

我们用make_blobs生成一些用于聚类的数据。

fromsklearn.datasetsimportmake_blobsfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt# 1. 生成数据# n_samples: 样本数, centers: 簇中心数, cluster_std: 簇内标准差X,y=make_blobs(n_samples=300,centers=4,cluster_std=0.8,random_state=42)# 可视化原始数据plt.scatter(X[:,0],X[:,1],s=50)# plt.show()# 2. 创建并训练模型# n_clusters=4: 我们想分成 4 个簇kmeans=KMeans(n_clusters=4,random_state=42,n_init='auto')kmeans.fit(X)# 3. 获取结果labels=kmeans.labels_# 每个点的标签 (0, 1, 2, 3)centers=kmeans.cluster_centers_# 4 个质心的坐标# 4. 可视化结果plt.scatter(X[:,0],X[:,1],c=labels,s=50,cmap='viridis')plt.scatter(centers[:,0],centers[:,1],c='red',s=200,alpha=0.75,marker='X')plt.title("K-Means Clustering Result")# plt.show()

三、如何确定 K 值?

在实际问题中,我们事先并不知道数据应该分成几类。K-Means 的一个缺点就是需要手动指定 K 值
我们有两种常用的方法来辅助判断。

3.1 手肘法 (Elbow Method)

计算不同 K 值下的簇内平方和 (Inertia)。Inertia 越小,说明簇内越紧凑。
随着 K 增大,Inertia 肯定会减小。我们寻找那个"拐点"(手肘),即 K 再增大,Inertia 下降得不那么明显的地方。

inertia_list=[]forkinrange(1,11):kmeans=KMeans(n_clusters=k,random_state=42,n_init='auto')kmeans.fit(X)inertia_list.append(kmeans.inertia_)plt.plot(range(1,11),inertia_list,marker='o')plt.xlabel("Number of clusters (K)")plt.ylabel("Inertia")plt.title("Elbow Method For Optimal K")# plt.show()# 在图中,K=4 处是一个明显的拐点

3.2 轮廓系数 (Silhouette Score)

轮廓系数同时考虑了簇内紧凑度簇间分离度

  • 分数范围 [-1, 1]。
  • 越接近 1,聚类效果越好。
fromsklearn.metricsimportsilhouette_score score=silhouette_score(X,labels)print(f"轮廓系数:{score:.2f}")# e.g. 0.82

四、实战练习:客户分群

假设我们有一份商场客户数据,包含"年收入"和"消费分数 (1-100)"。

importpandasaspd# 1. 准备数据data={'Annual Income (k$)':[15,15,16,16,17,18],'Spending Score (1-100)':[39,81,6,77,40,6]}# (为了演示,这里只用少量数据,实际中应该是上千条)df=pd.DataFrame(data)# 2. 标准化 (距离敏感,必须标准化)fromsklearn.preprocessingimportStandardScaler scaler=StandardScaler()X_scaled=scaler.fit_transform(df)# 3. 用手肘法找 K# ... (略)# 4. 训练 (假设我们决定 K=3)kmeans=KMeans(n_clusters=3,random_state=42,n_init='auto')df['Cluster']=kmeans.fit_predict(X_scaled)# 5. 可视化plt.figure(figsize=(8,6))sns.scatterplot(data=df,x='Annual Income (k$)',y='Spending Score (1-100)',hue='Cluster',palette='viridis')plt.title("Customer Segments")# plt.show()# 6. 分析结果print(df)# 簇 0: 低收入高消费 (冲动型)# 簇 1: 低收入低消费 (保守型)# 簇 2: ...

五、常见问题

Q1:K-Means 对初始点敏感吗?

非常敏感。不同的初始质心可能导致完全不同的聚类结果。
Sklearn 的KMeans默认会跑 10 次(n_init=10),每次用不同的初始点,然后返回最好的那次结果。

Q2:数据不是圆形怎么办?

K-Means 假设簇是凸形的(类似圆形),对于不规则形状(如月牙形)效果很差。
这时候需要用其他聚类算法,如DBSCAN谱聚类 (Spectral Clustering)

Q3:如何处理分类特征?

K-Means 是基于欧式距离的,不能直接处理字符串。
需要先将分类特征进行独热编码 (One-Hot)


六、小结

无监督学习

聚类 Clustering

K-Means

1. 随机定 K 个中心
2. 分配点到最近中心
3. 更新中心到平均值

重复 2-3

如何选 K?

手肘法 (Inertia)

轮廓系数 (Silhouette)

关键要点

  1. K-Means是最简单、最常用的聚类算法。
  2. 它需要手动指定 K 值,并对数据尺度敏感(记得标准化)。
  3. 手肘法轮廓系数是确定 K 值的两大辅助工具。

七、课后作业

  1. 图片颜色聚类:读取一张彩色图片,将其像素点的 RGB 值作为特征,用 K-Means (K=8) 进行聚类。然后用每个簇的质心颜色替换该簇所有像素点,看看图片变成了什么样(主题色提取)。
  2. DBSCAN:查阅 sklearn 文档,使用DBSCAN算法处理make_moons(月牙形)数据集,并与 K-Means 的效果进行对比。
  3. 文本聚类:将一堆新闻标题进行 TF-IDF 向量化,然后用 K-Means 进行聚类,看看能否自动把"体育"、"财经"等主题分开。

下节预告

Day 87:机器学习进阶 - PCA 降维- 特征太多了怎么办?1000 个维度的特征可能只有 10 个是真正有用的。明天我们学习如何给数据"瘦身",提取核心特征。


系列导航

  • 上一篇:Day 85 - 支持向量机SVM
  • 下一篇:Day 87 - PCA降维(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1181473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

颠覆传统:这款系统监控工具如何让资源管理变得如此简单?

颠覆传统:这款系统监控工具如何让资源管理变得如此简单? 【免费下载链接】btop A monitor of resources 项目地址: https://gitcode.com/GitHub_Trending/bt/btop 还在为系统卡顿而烦恼吗?当你发现电脑运行缓慢时,第一反应…

Day 87:【99天精通Python】机器学习进阶 - PCA 降维 - 抓住数据的“主干“

Day 87:【99天精通Python】机器学习进阶 - PCA 降维 - 抓住数据的"主干" 前言 欢迎来到第87天! 在机器学习中,我们经常遇到高维数据。比如,一张 100x100 像素的图片,拉平后就是 10000 个特征;一份…

通俗解释Multisim仿真中失真现象的产生机制

Multisim仿真中的失真从哪来?一文讲透波形“变形记”的底层逻辑你有没有在Multisim里搭好一个放大电路,信心满满地跑仿真,结果示波器一打开——输出波形歪歪扭扭,顶部被削掉一块,底部压成平线?别急着怀疑软…

FST ITN-ZH中文逆文本标准化系统架构优化解析

FST ITN-ZH中文逆文本标准化系统架构优化解析 1. 引言:中文逆文本标准化的技术背景与挑战 随着语音识别(ASR)和自然语言处理(NLP)技术的广泛应用,逆文本标准化(Inverse Text Normalization, I…

opencode跨平台部署:Windows/Linux/Mac一致性配置

opencode跨平台部署:Windows/Linux/Mac一致性配置 1. 背景与核心价值 随着AI编程助手在开发流程中的深度集成,开发者对工具的跨平台一致性、模型灵活性和隐私安全性提出了更高要求。OpenCode 作为2024年开源的终端优先AI编码框架,凭借其Go语…

零基础入门ComfyUI视频生成:WanVideo包装器终极指南

零基础入门ComfyUI视频生成:WanVideo包装器终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 想要在ComfyUI中轻松实现视频生成和编辑吗?ComfyUI-WanVideoWrapper正…

Day 89:【99天精通Python】项目篇(二) - 电影推荐系统 (上) - 需求分析与数据探索

Day 89:【99天精通Python】项目篇(二) - 电影推荐系统 (上) - 需求分析与数据探索 前言 欢迎来到第89天! 我们将启动本系列最后一个,也是最有趣的大型项目——电影推荐系统。 推荐系统是现代互联网产品的核心(淘宝的猜你喜欢、…

kkFileView国产化迁移实战:从x86到ARM架构的完整解决方案

kkFileView国产化迁移实战:从x86到ARM架构的完整解决方案 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView 在信创产业快速发展的今天,企…

AI手势识别如何实现毫秒级响应?极速CPU版实战解析

AI手势识别如何实现毫秒级响应?极速CPU版实战解析 1. 引言:AI 手势识别与追踪的技术价值 随着人机交互技术的不断演进,非接触式控制正逐步成为智能设备的重要输入方式。在智能家居、虚拟现实、车载系统乃至工业控制中,手势识别凭…

Keil5安装后如何验证?新手必备测试方法

Keil5装完怎么测?一个最简工程搞定环境验证 你是不是也经历过这样的时刻: 花了一两个小时,终于走完了Keil5的安装流程,点开图标看到uVision界面顺利启动,心里刚松一口气—— 结果下一秒就想问自己: 这到…

终极指南:open-notebook - 完全免费的AI驱动笔记管理神器

终极指南:open-notebook - 完全免费的AI驱动笔记管理神器 【免费下载链接】open-notebook An Open Source implementation of Notebook LM with more flexibility and features 项目地址: https://gitcode.com/GitHub_Trending/op/open-notebook 在信息爆炸的…

如何快速掌握Frigate:AI智能监控的完整使用指南

如何快速掌握Frigate:AI智能监控的完整使用指南 【免费下载链接】frigate NVR with realtime local object detection for IP cameras 项目地址: https://gitcode.com/GitHub_Trending/fr/frigate Frigate是一款革命性的开源NVR系统,它通过本地AI…

Hunyuan推理速度优化:batch_size设置实战教程

Hunyuan推理速度优化:batch_size设置实战教程 1. 引言 1.1 业务场景描述 在企业级机器翻译系统中,响应延迟和吞吐量是衡量服务性能的核心指标。Tencent-Hunyuan/HY-MT1.5-1.8B 是一款基于 Transformer 架构的高性能翻译模型,参数量达 1.8B…

使用状态机设计UDS 19服务响应流程操作指南

用状态机重构UDS 19服务响应:让诊断流程更清晰、更可靠你有没有遇到过这样的场景?在调试一个复杂的ECU时,诊断仪反复发送0x19请求读取DTC信息,结果ECU偶尔返回乱码,或者干脆无响应。翻遍代码发现,处理逻辑被…

如何用Sandboxie实现安全沙箱隔离:5步完整配置指南

如何用Sandboxie实现安全沙箱隔离:5步完整配置指南 【免费下载链接】Sandboxie Sandboxie Plus & Classic 项目地址: https://gitcode.com/gh_mirrors/sa/Sandboxie Sandboxie是一款功能强大的系统沙箱工具,能够在隔离环境中安全运行应用程序…

树莓派AirPlay镜像终极指南:零配置网络发现深度解析

树莓派AirPlay镜像终极指南:零配置网络发现深度解析 【免费下载链接】RPiPlay An open-source AirPlay mirroring server for the Raspberry Pi. Supports iOS 9 and up. 项目地址: https://gitcode.com/gh_mirrors/rpi/RPiPlay 在当今智能设备普及的时代&am…

ComfyUI-WanVideoWrapper终极指南:从零搭建完整视频生成工作流

ComfyUI-WanVideoWrapper终极指南:从零搭建完整视频生成工作流 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 想要在ComfyUI中实现专业级视频生成效果?这篇文章将带你一…

AI编程新体验:Open Interpreter+Qwen3-4B实测分享

AI编程新体验:Open InterpreterQwen3-4B实测分享 1. 引言:当自然语言成为编程入口 在传统开发流程中,编写代码是一项高度专业化的工作,需要掌握语法、调试技巧和系统知识。然而,随着大语言模型(LLM&#…

Steam饰品交易终极助手:跨平台自动比价完整指南

Steam饰品交易终极助手:跨平台自动比价完整指南 【免费下载链接】SteamTradingSiteTracker Steam 挂刀行情站 —— 24小时自动更新的 BUFF & IGXE & C5 & UUYP 挂刀比例数据 | Track cheap Steam Community Market items on buff.163.com, igxe.cn, c5g…

Cap开源录屏工具终极指南:免费替代Loom的完整解决方案

Cap开源录屏工具终极指南:免费替代Loom的完整解决方案 【免费下载链接】Cap Effortless, instant screen sharing. Open-source and cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 还在为录制屏幕时遇到的功能限制、水印困扰和跨…