新闻详情

新闻详情

首页 / 资讯中心 / 详情

【老计带你懂AI算法】07:聚类,没有标准答案时,让机器自己把数据分堆

发布时间:2026/9/26 12:13:52来源:尧图网络
【老计带你懂AI算法】07:聚类,没有标准答案时,让机器自己把数据分堆
【老计带你懂AI算法】07聚类没有标准答案时让机器自己把数据分堆开头从有答案到没答案前面五篇讲的模型有个共同的前提你得先给数据打好标签。这是垃圾邮件那不是、这套房卖了多少钱、这个肿瘤是良性还是恶性。机器是照着你给的标准答案学的这叫监督学习。可现实里大量数据根本没有标签。你有一百万个用户的行为数据没人事先告诉你谁是谁一类你有一堆商品也没人标好哪些该归一起。这时候你想让机器帮你自动把相似的东西归到一堆怎么办这就是无监督学习要干的事其中最典型、最常用的就是聚类。聚类的目标很朴素在没有标准答案的情况下让机器根据数据本身的相似程度自动把它们分成若干堆术语叫簇。同一堆里的尽量像不同堆之间尽量不像。打个比方你走进一个陌生的大聚会没人给你介绍谁是谁。但你观察一会儿就会发现那边一群人聊投资、这边一群人聊带娃、角落几个人聊游戏你自然而然就把人分成了几堆。你靠的不是谁贴了标签而是他们表现出来的相似性。聚类就是让机器干这件事。K-Means找几个中心点让数据抱团最经典、最常用的聚类算法叫K-MeansK均值思路特别直观。它的核心想法是假设数据能分成K堆那每一堆应该都有一个中心堆里的点都围着自己的中心抱团。于是它要做的就是找到这K个最合适的中心位置让每个点都离它所属的那个中心尽可能近。它怎么找是个特别巧妙的反复迭代过程我用大白话描述第一步随机撒K个中心点比如你想分3堆就先随便撒3个点当临时中心。第二步每个数据点看自己离哪个中心最近就先归到那一堆。第三步每一堆归好后重新计算这堆的真正中心把堆里所有点的位置平均一下得到新中心这就是均值的由来。第四步中心挪动了那每个点离哪个中心最近可能就变了回到第二步重新归堆再算新中心……这个归堆、算中心、再归堆、再算中心的循环反复进行直到中心不再明显移动、分堆稳定下来聚类就完成了。你可以想象成一群人围着几个临时召集人站队召集人根据身边站了谁不断挪到人群正中间人们又根据召集人的新位置重新站队来回几轮就自然形成了几个稳定的圈子。K-Means的软肋K要你自己定K-Means有个绕不开的问题那个K分几堆得你自己事先指定。可现实里你往往并不知道数据该分几堆这就尴尬了。有个常用的办法帮你挑K叫手肘法。思路是把K从小到大试一遍分2堆、3堆、4堆……每次算一下堆内的点离中心有多紧凑这个指标。K越大堆分得越细、点离中心自然越近这个指标一路下降。但你会发现降到某个K之后再增加堆数紧凑度的提升就不明显了曲线出现一个像手肘一样的拐点。那个拐点对应的K通常就是比较合适的分堆数。它背后的直觉是拐点之前每多分一堆都带来明显收益拐点之后收益骤减说明再细分意义不大了。除了K要指定K-Means还有几个脾气得知道它假设每堆大致是圆形、大小差不多的遇到形状怪异比如弯月形的数据堆就会分错它对初始中心的随机位置敏感撒得不好可能收敛到不太好的结果实践中会多撒几次取最好的sklearn默认就这么做它还对离群点敏感一个极端的outlier能把中心拽偏。DBSCAN按密度圈人群还能揪出离群点针对K-Means的软肋另一个经典算法DBSCAN换了个完全不同的思路它不找中心点而是看密度。DBSCAN的想法很符合直觉一堆数据如果某个区域点挤得密密麻麻那这片就是一个簇点和点之间稀稀拉拉的地方就是簇的边界而那些孤零零、周围没几个邻居的点就是噪声离群点。它顺着密集的区域一点点蔓延把连成一片的稠密点圈成一个簇。这带来几个K-Means没有的好处不用事先指定分几堆它自己根据密度算出来有几个簇。能发现任意形状的簇弯月形、环形都行因为它是顺着密度蔓延的不假设是圆的。天生能识别离群点那些不属于任何稠密区域的点会被直接标记为噪声这在异常检测里很有用下一篇孤立森林会专门讲异常检测。当然它也有自己的脾气它靠两个参数控制多密才算密一个是邻域半径一个是成簇的最少点数这俩参数得调而且当数据里不同簇的疏密程度差异很大时用一套统一的密度标准就不好使了。还有一类层次聚类像画家谱除了K-Means和DBSCAN还有一类值得知道的思路叫层次聚类它的画风又不一样像在给数据画一棵家谱树。它有两种走法。一种是自底向上一开始把每个点都当成一个独立的小簇然后每一步把最相近的两个簇合并成一个就像亲戚关系里先合并最亲的再一层层往上合最后所有点合成一大家子。另一种是自顶向下反过来先把所有点当一大堆再逐步往下拆分。层次聚类最迷人的产出是一棵叫树状图的东西它记录了谁先和谁合并、在多相似的程度上合并的完整过程。好处是你不用像K-Means那样事先定死分几堆而是可以事后看着这棵树在你想要的相似程度上横切一刀切出几堆就是几堆非常灵活。打个比方这就像看家谱你想按直系亲属分就切浅一点、想按整个家族分就切深一点一棵树满足不同粒度的需求。它的代价是计算量大数据一多就慢所以更适合中小规模、且你想看清数据层层嵌套结构的场景比如生物学里给物种分类天生就是层层嵌套的。记住聚类不止一种玩法K-Means求快、DBSCAN看密度识异形、层次聚类给你一棵可任意切分的关系树各有各的用武之地。输入和输出长什么样输入一批没有标签的样本每个样本若干数值特征。因为聚类基本都靠算距离所以和上一篇的KNN、SVM一样特征通常要先标准化。输出每个样本被分到的簇编号0号堆、1号堆……。DBSCAN还会把离群点单独标记出来通常标为-1。注意这些编号只是分组标识没有大小和好坏含义聚类只告诉你谁和谁一伙至于每伙代表什么要你自己去解读。上代码K-Means和DBSCAN对比用sklearn在同一份数据上跑两种聚类。输入二维坐标点。输出每个点的簇编号。# 依赖pip install scikit-learnfromsklearn.datasetsimportmake_moonsfromsklearn.clusterimportKMeans,DBSCANfromsklearn.preprocessingimportStandardScalerimportnumpyasnp# 造一份两个弯月形的数据,专门难为假设圆形的K-MeansX,_make_moons(n_samples300,noise0.06,random_state0)XStandardScaler().fit_transform(X)# 聚类前先标准化# K-Means:硬指定分2堆kmKMeans(n_clusters2,n_init10,random_state0)km_labelskm.fit_predict(X)print(K-Means 分出的簇:,np.unique(km_labels))# DBSCAN:按密度自动成簇,还能标离群点dbDBSCAN(eps0.3,min_samples5)db_labelsdb.fit_predict(X)print(DBSCAN 分出的簇(含-1噪声):,np.unique(db_labels))print(DBSCAN 识别出的离群点数量:,int(np.sum(db_labels-1)))# 简单看一下两者对弯月形的处理差异(不画图,看每个簇的样本数)forname,labelsin[(K-Means,km_labels),(DBSCAN,db_labels)]:vals,countsnp.unique(labels,return_countsTrue)print(f{name}各簇样本数:,dict(zip(vals.tolist(),counts.tolist())))运行输出示例K-Means 分出的簇: [0 1] DBSCAN 分出的簇(含-1噪声): [-1 0 1] DBSCAN 识别出的离群点数量: 4 K-Means 各簇样本数: {0: 150, 1: 150} DBSCAN 各簇样本数: {-1: 4, 0: 148, 1: 148}运行你会体会到差异面对弯月形数据K-Means因为假设圆形往往会把两个月牙从中间硬切开、分得不自然而DBSCAN顺着密度蔓延能漂亮地把两个弯月各自圈成一簇还顺手标出零星的噪声点。这直观展示了两个算法适用的数据形状不同。关键参数K-Means的n_clusters分几堆最关键、要你定可用手肘法辅助。K-Means的n_init多撒几次初始中心取最好缓解对初始值敏感的问题。DBSCAN的eps邻域半径和min_samples成簇最少点数这两个共同定义多密才算一簇是DBSCAN调参的核心。优缺点与适用场景K-Means简单、快、易懂适合数据量大、各簇大致圆形且大小相近的场景如用户分群、图像颜色量化。软肋是要指定K、只认圆形、怕离群点。DBSCAN不用指定簇数、能识别任意形状和离群点适合形状不规则的数据和需要顺带做异常检测的场景。软肋是参数要调、对疏密差异大的数据不友好。聚类整体适合探索性分析先看看数据能自然分成几类、用户或商品分群、异常检测、给数据打初步标签。不适合你其实已经有明确标签、该用监督学习的场景那样用聚类是舍近求远。这里还得点破一个新手常纠结的问题聚类的结果到底怎么判断好不好监督学习有标准答案对了几个一目了然聚类没有答案怎么评有两个角度。一是看内部指标比如轮廓系数衡量同一堆内部够不够紧凑、不同堆之间够不够分得开值越高说明分得越利落这不需要标签。二是看业务解不解释得通这往往更重要机器把用户分成了五群你得去看每群的实际特征是不是真对应了高价值活跃用户“沉睡用户这种有业务意义的群体。聚类给出的分组只是数学上的相似最终有没有价值要靠人结合业务去解读和验证这一步机器替代不了。记住这点你用聚类时就不会盲目相信机器分出的堆而会多问一句这么分业务上讲得通吗”。小结与承上启下聚类无监督学习没标准答案时让机器按相似度自动把数据分堆。K-Means找K个中心让数据抱团反复归堆算中心要指定K、认圆形。DBSCAN按密度圈簇不用指定簇数、能识别任意形状和离群点。共同点靠距离吃饭要先标准化输出只是分组编号含义靠人解读。聚类里DBSCAN已经露了一手识别离群点的本事。可专门用来抓异常、抓那些和大家都不一样的点还有更专门更强的模型。下一篇我们讲一个异常检测的利器孤立森林看它怎么用一个反常识的思路快速揪出异常。我们下一篇见。延伸阅读scikit-learn 官方文档聚类含K-Means、DBSCAN、层次聚类https://scikit-learn.org/stable/modules/clustering.html说明以上为官方公开文档地址可能随版本调整如打不开可用标题搜索。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STM32培训机构怎么选?从课程体系到试听提问的避坑指南 2026/9/26 13:54:01

STM32培训机构怎么选?从课程体系到试听提问的避坑指南

1. 先搞清楚一件事:你是真需要STM32,还是需要"学会东西的感觉"每隔一段时间,就会有人私信问我类似的问题:STM32培训机构怎么选、哪家口碑好、线上还是线下靠谱。问得多了,我慢慢发现一个规律——大多数人问这…

阅读更多 →
学习通粘贴限制破解指南:前端事件拦截与绕过技术详解 2026/9/26 13:53:48

学习通粘贴限制破解指南:前端事件拦截与绕过技术详解

1. 学习通粘贴限制的底层逻辑与破解思路1.1 为什么学习通要限制粘贴用过学习通的人都知道,在网页版答题或者填写主观题的时候,直接按 CtrlV 是没反应的,右键菜单里的“粘贴”选项也经常是灰的。很多人第一反应是“我键盘坏了”或者“浏览器出…

阅读更多 →
基于SpringBoot的医院排队叫号系统设计与实现 2026/9/26 13:53:48

基于SpringBoot的医院排队叫号系统设计与实现

经常有读者私信问我这类选题怎么做,正好最近刚帮人把一套基于SpringBoot的医院排队叫号系统从零跑到上线,从需求梳理到部署踩了不少坑。趁周末把整个项目的核心设计、关键流程、踩坑实录完整整理出来,这套东西无论是拿来当毕设,还…

阅读更多 →
Gin参数校验从标签到实战:自定义校验、错误翻译与性能优化全解析 2026/9/26 13:53:42

Gin参数校验从标签到实战:自定义校验、错误翻译与性能优化全解析

写Gin的项目做了不少,参数校验这块从最早的if err ! nil满天飞,到后来老老实实用validator/v10,中间踩过不少坑。标题里说“不只是定义几个标签”,这话我深有体会——binding:"required"只是入门,真到了复杂…

阅读更多 →
2026实测:10个有效降低AI率的方案与避坑指南 2026/9/26 13:53:42

2026实测:10个有效降低AI率的方案与避坑指南

从2025年起,我就开始被“AI率”这三个字反复折磨。后台编辑说稿子“一眼假”,合作方甩来一张截图,上面赫然标着“AI生成概率92%”。我一度以为是输出端的提示词问题,换了十几个写法,结果只是从92%变成80%。后来我才明白…

阅读更多 →
DeepSeek V4.1 Flash存储层级重塑:MoE架构下KV Cache与FP4量化实战 2026/9/26 13:53:42

DeepSeek V4.1 Flash存储层级重塑:MoE架构下KV Cache与FP4量化实战

1. 从“存储层级”切入,看懂 V4.1 Flash 到底在改什么DeepSeek V4.1 Flash 这个名字最近在圈子里被反复提起,但真正让我感兴趣的,不是“Flash”这个后缀,而是它背后那句“存储层级重塑模型架构”。这句话听起来很抽象,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉