K-Means聚类:当数据没有标签时,如何让计算机自动“物以类聚”?
👋 大家好,我是小瑞瑞!欢迎回到我的专栏!
在我们之前的旅程中,解决的问题大多都有一个明确的“目标”,比如预测未来的数值,或者找到一个最优的决策。这些都属于**“监督学习”**的范畴,就像学生跟着老师(标签数据)学习,最终学会举一反三。
但如果,我们被扔到一个没有任何老师、没有任何教材、没有任何标准答案的陌生世界里,我们还能学到知识吗?
想象一下,你是一位生物学家,乘船抵达了一座与世隔绝的神秘岛屿。岛上充满了成千上万种你从未见过的奇特生物。你手头没有任何图鉴,该如何开始你的研究?你可能会下意识地做一件事:观察、比较、分类。你会把“有翅膀会飞的”归为一类,“有鳃会游泳的”归为另一类,“全身长满绿毛的”又归为一类……
这个从混乱中自主发现规律、寻找结构的过程,就是无监督学习的精髓,而我们今天的主角——K-Means聚类,就是计算机执行这项任务时,最常用、最经典的“分类法则”。
🚀 本文你将彻底征服:
- 【哲思篇】: 理解无监督学习与聚类的核心思想,进入“无标签”的新世界。
- 【解剖篇】: 深度剖析K-Means算法“两步走”的优雅迭代过程。
- 【关键抉择】: 揭秘如何科学地确定“到底该聚成几类(K值)?”这一核心难题。
- 【代码实现】: 使用Python的
scikit-learn
库,从零实现一个完整的聚类分析。- 【实战与可视化】: 对真实数据集进行聚类,并用精美的图表展示“物以类聚”的全过程。
- 【拓展篇】: 探索K-Means的“亲戚们”,了解更强大的聚类武器。
准备好了吗?让我们一起进入这个没有“标准答案”,但充满“结构之美”的无监督世界!
第一章:【哲思篇】—— 在“无标签”世界里寻找秩序
在开启任何算法的学习之前,我们必须先建立起宏观的“世界观”。本章,我们将回答三个根本性问题:什么是聚类?它和分类有什么区别?K-Means的核心智慧又是什么?
1. 算法背景与简介:无监督学习的“开山鼻祖”
聚类分析(Clustering Analysis)是无监督学习(Unsupervised Learning)**领域中最基础、也最重要的任务之一。
- 无监督学习: 它是机器学习的两大范式之一。与监督学习不同,我们提供给算法的训练数据只有特征(X),没有标签(y)。算法的任务不是去“预测”一个已知的答案,而是去“发现”数据本身内在的、未知的结构、模式或群组。
K-Means算法由J. B. MacQueen于1967年首次提出,是**基于划分(Partitioning)**的聚类方法中最耀眼的明星。它以其惊人的思想简洁性、算法高效性和结果的直观性,成为了无数数据科学家入门无监督学习的“第一课”,至今仍在工业界和学术界被广泛应用。
2. 聚类 vs. 分类:一场“贴标签”的游戏
初学者极易将“聚类(Clustering)”和“分类(Classification)”混淆。它们虽一字之差,却分属机器学习的两个不同世界。
对比维度 | 分类 (Classification) - 监督学习 | 聚类 (Clustering) - 无监督学习 |
---|---|---|
数据 | 有标签 (如:每张图片都标好了是“猫”还是“狗”) | 无标签 (如:一堆未标记的动物图片) |
任务 | 预测新样本的标签 | 发现数据中的群组结构 |
过程 | 算法从带标签的数据中学习一个决策边界 | 算法根据样本间的相似度自动进行分组 |
目标 | 追求预测的准确率 | 追求簇内高相似,簇间低相似 |
小瑞瑞说 | “这是一道选择题,答案已知,你要学习规律” | “这是一次开放式探索,你要自己定义类别” |
3. K-Means的核心思想:以“质心”为引力的宇宙
K-Means算法之所以经典,在于它用一个极其优美和直观的物理过程,模拟了“物以类聚”的现象。
核心思想可以概括为:
每个簇(Cluster)都由一个“中心点”来代表,我们称之为“质心”(Centroid)。世间万物(数据点)都遵循一个简单的引力法则:每个点都归属于离它最近的那个质心。而质心本身的位置,又被其星系内所有成员的平均位置所决定。
💡 小瑞瑞的“建国大业”比喻:
想象一片广袤的无人区,散落着无数个流民(数据点)。
- 【插旗为王】: 你(算法)决定要在这片土地上建立
K
个国家。于是你派了K
个先驱者(初始质心),随机地在地图上插上了K
面旗帜。- 【万民归心】: 所有流民看到旗帜后,都遵循一个简单的原则:投奔离自己最近的那面旗帜。于是,
K
个国家的雏形形成了。- 【定都迁都】: 每个国家的先驱者看到自己的人民后,觉得最初插旗的地方不一定最好。于是他们决定迁都,将新的首都(新质心)设立在所有国民的地理中心位置。
- 【循环往复】: 首都的位置变了,一些边界上的流民可能会发现,自己离邻国的“新首都”更近了!于是他们会“叛变”,投奔新的国家。而这种“叛变”又会引起新一轮的“迁都”……
- 【天下太平】: 这个“万民归心”与“定都迁都”的过程不断循环,直到有一天,再也没有一个流民想要改变国籍,所有首都的位置也因此而固定下来。此时,我们说世界达到了“和平”(算法收敛),最终的国家版图(聚类结果)就确定了。
第二章:【解剖篇】—— K-Means的“两步圆舞曲”:分配与更新的数学严谨表达
在上一章,我们通过“建国大业”的比喻,直观地感受了K-Means算法的动态过程。现在,让我们褪去故事的外衣,穿上数学的严谨礼服,来精确地解剖这支优美的“两步圆舞曲”——分配(Assignment)与更新(Update)。
1. 模型的建立:目标函数与数学定义
在深入算法流程之前,我们首先需要从数学上定义K-Means的目标。K-Means算法本质上是一个优化问题,它的目标是最小化一个目标函数——所有样本点到其所属簇的质心的距离平方和。这个指标在学术上被称为簇内误差平方和(Sum of Squared Errors, SSE),也常被称为惯性(Inertia)。
数学定义:
给定一个数据集 X={x(1),x(2),…,x(m)}X = \{x^{(1)}, x^{(2)}, \dots, x^{(m)}\}X={x(1),x(2),…,x(m)},其中每个样本 x(i)∈Rnx^{(i)} \in \mathbb{R}^nx(i)∈Rn。我们的目标是将数据集 XXX 划分为 KKK 个簇 C={C1,C2,…,CK}C = \{C_1, C_2, \dots, C_K\}C={C1,C2,…,CK},并为每个簇找到一个质心 μj\mu_jμj,使得以下目标函数 JJJ 最小化:
J(C,μ)=∑j=1K∑x(i)∈Cj∥x(i)−μj∥2 J(C, \mu) = \sum_{j=1}^{K} \sum_{x^{(i)} \in C_j} \| x^{(i)} - \mu_j \|^2 J(C,μ)=j=1∑Kx(i)∈Cj∑∥x(i)−μj∥2
其中:
- KKK 是预先指定的簇的数量。
- CjC_jCj 是第 jjj 个簇的样本集合。
- μj\mu_jμj 是第 jjj 个簇的质心向量。
- ∥x(i)−μj∥2\| x^{(i)} - \mu_j \|^2∥x(i)−μj∥2 是样本 x(i)x^{(i)}x(i) 与其所属簇的质心 μj\mu_jμj 之间的欧几里得距离的平方。
💡 小瑞瑞说: 这个公式就是K-Means算法的“宪法”。它规定了我们的“国家”(聚类结果)是否足够“和谐稳定”的唯一标准:让每个“国民”(样本点)到自己“首都”(质心)的距离平方和加起来最小。算法接下来的所有操作,都是为了这个终极目标而服务的。
2. 算法流程:从“混沌”到“秩序”的迭代
K-Means算法采用了一种非常优雅的迭代优化策略——**坐标下降法(Coordinate Descent)**的思路来求解上述优化问题。它交替地固定一组变量,优化另一组变量。
【步骤一:初始化】—— 随机的“最初火种”
- 设定K值: 根据业务需求或后续将介绍的“K值选择方法”,人为地指定一个整数 KKK。
- 初始化质心: 从数据集 XXX 中,随机选择 KKK 个样本点作为初始的质心集合 {μ1(0),μ2(0),…,μK(0)}\{\mu_1^{(0)}, \mu_2^{(0)}, \dots, \mu_K^{(0)}\}{μ1(0),μ2(0),…,μK(0)}。
- 注意: 这种纯随机的初始化方式可能会导致算法收敛到较差的局部最优解。在实践中,我们通常使用更智能的K-Means++初始化方法(
scikit-learn
中的默认选项),它能选择分散得更开的初始质心,大大提高了算法的稳定性和性能。
- 注意: 这种纯随机的初始化方式可能会导致算法收敛到较差的局部最优解。在实践中,我们通常使用更智能的K-Means++初始化方法(
【步骤二:迭代圆舞曲】—— 直到收敛
算法将不断重复以下两个步骤(“分配”与“更新”),直到满足收敛条件。我们设当前是第 ttt 次迭代。
舞步一:簇分配 (Cluster Assignment Step)
- 目标: 在固定住当前质心 μ(t)\mu^{(t)}μ(t) 的情况下,为每一个样本点找到它最优的归属簇,以最小化目标函数 JJJ。
- 流程: 遍历数据集中的每一个样本点 x(i)x^{(i)}x(i)(从 i=1i=1i=1 到 mmm),计算它到当前所有 KKK 个质心 μj(t)\mu_j^{(t)}μj(t) 的距离,然后将该样本点分配给距离最近的那个质心所代表的簇。
c(i):=argminj∈{1,…,K}∥x(i)−μj(t)∥2 c^{(i)} := \arg\min_{j \in \{1,\dots,K\}} \| x^{(i)} - \mu_j^{(t)} \|^2 c(i):=argj∈{1,…,K}min∥x(i)−μj(t)∥2- 解读: 这个公式是在为每个样本 x(i)x^{(i)}x(i) 打上一个临时的“国籍”标签 c(i)c^{(i)}c(i),这个国籍就是离它最近的那个“首都”的编号 jjj。

舞步二:质心更新 (Centroid Update Step)
- 目标: 在固定住当前簇分配 C(t)C^{(t)}C(t) 的情况下,为每一个簇找到一个新的、能更好地代表其成员的质心位置,以最小化目标函数 JJJ。
- 流程: 对于每一个簇 jjj(从 j=1j=1j=1 到 KKK),遍历该簇内所有的样本点,计算它们的向量均值,并将这个均值作为该簇新的质心 μj(t+1)\mu_j^{(t+1)}μj(t+1)。
μj(t+1):=1∣Cj(t)∣∑x(i)∈Cj(t)x(i) \mu_j^{(t+1)} := \frac{1}{|C_j^{(t)}|} \sum_{x^{(i)} \in C_j^{(t)}} x^{(i)} μj(t+1):=∣Cj(t)∣1x(i)∈Cj(t)∑x(i)- 解读: 这个公式是在进行“迁都”。新的“首都”位置,不多不少,正好是其所有“国民”所在位置的几何中心。可以证明,这个位置正是使该簇内SSE最小的点。
“左边的‘分配’图,展示了所有数据点(流民)根据上一轮的质心(旧首都)划分归属的过程,形成了临时的‘国家’版图。
右边的‘更新’图,则展示了在国民确定后,每个国家的‘首都’(质心)都迁移到了其领土的几何中心,以更好地服务人民。红色的箭头,就是这次波澜壮阔的‘迁都’轨迹!
整个K-Means算法,就是不断重复上演这两幕剧,直到首都再也不需要迁移,天下太平(算法收敛)。”
【步骤三:收敛判断】—— “天下太平”的信号
算法在完成一次“更新”步骤后,会检查是否满足收敛条件。常见的收敛条件有两种:
- 质心不再移动: 在新一轮的“更新”后,所有 KKK 个质心的位置 μj(t+1)\mu_j^{(t+1)}μj(t+1) 与上一轮的 μj(t)\mu_j^{(t)}μj(t) 相比,都没有发生变化(或变化极其微小,小于一个预设的阈值)。
- 簇分配不再改变: 在新一轮的“分配”后,没有任何一个样本点的归属簇发生改变。
一旦满足其中任何一个条件,迭代就停止。此时,最终的簇划分和质心位置,就是我们K-Means算法的输出结果。
💡 小瑞瑞说:
K-Means的这支“两步圆舞曲”是保证算法必然收敛的。因为无论是“分配”步还是“更新”步,每一步操作都在数学上保证了目标函数 JJJ 的值是下降或保持不变的。由于 JJJ 的值不可能无限下降(它有下界0),所以算法最终必然会收-敛到一个局部最优解。
第三章:关键抉择:最优簇数量K值的确定方法
摘要: K-Means算法的性能在很大程度上取决于簇数量(K值)的先验选择。一个不恰当的K值会导致对数据内在结构的错误解读。本章旨在系统性地介绍并比较两种最常用且有效的最优K值确定方法:肘部法则(Elbow Method)和轮廓系数法(Silhouette Coefficient Method)。我们将深入探讨这两种方法的理论基础、数学定义、实现流程及其在实践中的应用与局限性,为在无监督聚类任务中科学地选择K值提供一套标准化的作业流程。
3.1 K值选择的重要性:聚类分析的“寻龙定穴”
在K-Means的“建国大业”中,预先确定要建立几个“国家”(K值),是最基本也是最关键的战略决策。这个决策直接决定了我们能否准确地“勘探”出数据大陆上真实存在的“部落”结构。
- K值过小: 会导致将本应属于不同簇的样本点,强行划分到同一个簇中,造成**“欠拟合”**。这就像把老虎和猫都归为“猫科动物”一类,虽然没错,但损失了大量有用的细粒度信息。
- K值过大: 会导致将本应属于同一个簇的样本点,强制拆分到不同的簇中,造成**“过拟合”**。这就像把金毛犬和拉布拉多犬分为两个独立的物种,虽然它们确有差异,但可能夸大了这种差异,忽视了它们同属“大型犬”这一更本质的共性。
因此,寻找一个“恰到好处”的K值,是保证聚类结果具有意义和可解释性的前提。由于聚类是无监督学习,不存在唯一的“正确答案”,我们需要借助一些评估指标来辅助我们进行科学决策。
3.2 方法一:肘部法则 (Elbow Method) —— 寻找“性价比”的拐点
-
3.2.1 理论基础与核心思想
肘部法则是一种基于簇内凝聚度的K值选择方法。它利用的核心指标是簇内误差平方和(Sum of Squared Errors within clusters, SSE),在
scikit-learn
中也称为惯性(Inertia)。其目标是找到一个K值,该K值能够充分减小SSE,但又不会因为K值过大而导致模型过于复杂。其核心思想在于一个“边际效用递减”的经济学原理:
随着K值的增加,每个簇的样本数量会减少,因此样本点会离其质心更近,SSE必然会单调减小。但是,当K值超过了数据中真实存在的簇数量后,再增加K值(即把一个紧凑的簇强行拆分成两个),所带来的SSE减小量会急剧下降。我们就是要找到这个“收益”开始变得不明显的“拐点”。
-
3.2.2 数学定义
目标函数 SSE 定义如下:
SSE(K)=∑j=1K∑x(i)∈Cj∥x(i)−μj∥2 \text{SSE}(K) = \sum_{j=1}^{K} \sum_{x^{(i)} \in C_j} \| x^{(i)} - \mu_j \|^2 SSE(K)=j=1∑Kx(i)∈Cj∑∥x(i)−μj∥2
其中,KKK是簇的数量,CjC_jCj是第 jjj 个簇的样本集合,μj\mu_jμj是其质心。 -
3.2.3 实现流程与结果判读
- 设定K值范围: 选择一个合理的K值搜索范围,例如 K∈[1,10]K \in [1, 10]K∈[1,10]。
- 迭代计算SSE: 对于范围内的每一个K值,都完整地运行一次K-Means算法,并记录下最终收敛时的SSE值。
- 绘制K-SSE曲线: 以K值为横轴,对应的SSE值为纵轴,绘制折线图。
- 寻找“肘部” (Elbow): 观察这条下降的曲线。曲线斜率变化最剧烈的那个点,形状酷似人的手肘。这个“肘部”所对应的K值,就是推荐的最优K值。
这张对比图清晰地展示了两种K值选择方法:
-
左图 - 肘部法则:
- 形态: 你会看到一条随着K值增加而单调递减的曲线。在K值较小时,曲线下降非常陡峭,意味着每增加一个簇,都能显著减少簇内样本的离散程度(SSE)。
- “肘部”: 在K=4的位置,曲线的下降趋势突然变缓,形成一个明显的“手肘”拐点(由红色虚线和五角星标记)。
- 解读: 这告诉我们,当K从3增加到4时,SSE的改善是巨大的;但当K从4再增加到5时,“收益”就变得很小了。因此,K=4是一个“性价比”最高的选择。
-
右图 - 轮廓系数:
- 形态: 这条曲线不是单调的,它会上下波动。
- “峰值”: 在K=4的位置,曲线达到了最高点(由红色虚线和五角星标记)。
- 解读: 这表明,当我们将数据聚为4类时,整体的“簇内凝聚度”和“簇间分离度”达到了最佳的平衡状态,聚类效果最好。
- 左边的肘部法则图,在K=4处形成了一个非常清晰的‘手肘’,准确地指向了我们的目标。
- 右边的轮廓系数图,更是在K=4处取得了唯一的最高分,给出了一个毫不含糊的答案。
在这次‘诊断’中,两种方法都成功地为我们找到了正确的最优K值。在实际应用中,将它们结合起来进行交叉验证,能让我们的K值选择更加科学和可信。”
-
3.2.4 优劣势分析
- 优点: 思想简单,计算速度快,非常直观。
- 缺点: “肘部”的判断具有一定的主观性。在很多真实数据中,这个拐点可能并不明显,甚至存在多个“伪拐点”,导致选择困难。
3.3 方法二:轮廓系数法 (Silhouette Coefficient Method) —— 兼顾“凝聚度”与“分离度”
-
3.3.1 理论基础与核心思想
轮廓系数法是一种更精妙、更全面的评估指标。它不仅仅考虑了簇内的“团结”程度,还同时考虑了簇与簇之间的“独立”程度。它为每一个样本点都计算一个轮廓系数,从而评估该点被分配到的簇是否合理。
-
3.3.2 数学定义
对于数据集中的任意一个样本点 x(i)x^{(i)}x(i):
-
计算其簇内不相似度 a(i)a(i)a(i):即 x(i)x^{(i)}x(i) 与其所属的同一个簇中所有其他样本点的平均距离。a(i)a(i)a(i)越小,说明该样本与同簇成员越“亲密”。
a(i)=1∣Ck∣−1∑x(j)∈Ck,j≠i∥x(i)−x(j)∥ a(i) = \frac{1}{|C_{k}| - 1} \sum_{x^{(j)} \in C_{k}, j \ne i} \| x^{(i)} - x^{(j)} \| a(i)=∣Ck∣−11x(j)∈Ck,j=i∑∥x(i)−x(j)∥
其中,x(i)∈Ckx^{(i)} \in C_kx(i)∈Ck。 -
计算其簇间不相似度 b(i)b(i)b(i):即 x(i)x^{(i)}x(i) 与最近的邻簇中所有样本点的平均距离。b(i)b(i)b(i)越大,说明该样本与异簇成员越“疏远”。
b(i)=minl≠k{1∣Cl∣∑x(j)∈Cl∥x(i)−x(j)∥} b(i) = \min_{l \ne k} \left\{ \frac{1}{|C_l|} \sum_{x^{(j)} \in C_l} \| x^{(i)} - x^{(j)} \| \right\} b(i)=l=kmin⎩⎨⎧∣Cl∣1x(j)∈Cl∑∥x(i)−x(j)∥⎭⎬⎫ -
计算样本 x(i)x^{(i)}x(i) 的轮廓系数 s(i)s(i)s(i):
s(i)=b(i)−a(i)max{a(i),b(i)} s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}} s(i)=max{a(i),b(i)}b(i)−a(i)
-
-
3.3.3 实现流程与结果判读
- 设定K值范围: 选择一个搜索范围,注意K必须 ≥2\ge 2≥2。
- 迭代计算平均轮廓系数: 对于范围内的每一个K值,运行K-Means算法,然后计算出数据集中所有样本点轮廓系数的平均值。
- 绘制K-轮廓系数曲线: 以K值为横轴,对应的平均轮廓系数为纵轴,绘制折线图或条形图。
- 寻找最优K值: 轮廓系数的值域为 [−1,1][-1, 1][−1,1]。值越接近1,说明聚类效果越好。因此,平均轮廓系数取得最大值时所对应的K值,就是推荐的最优K值。
当然可以!为“肘部法则”和“轮廓系数”绘制清晰、专业的诊断图,是帮助读者科学选择K值的关键。
-
3.3.4 优劣势分析
- 优点:
- 评估更全面: 同时考虑了凝聚度和分离度。
- 结果更客观: 寻找“最大值”比寻找“肘部”拐点要客观和明确得多。
- 可解释性强: 我们可以分析单个样本的轮廓系数,找出那些可能被错分的点。
- 缺点:
- 计算成本更高: 需要计算大量的点对点距离。
- 对凸形簇有偏好: 对于非凸形状的簇(如DBSCAN能处理的),轮廓系数的评估可能会失效。
- 优点:
💡 小瑞瑞的决策建议:
在实践中,强烈建议将肘部法则和轮廓系数法结合使用,进行交叉验证。
- 首先用肘部法则快速地确定一个大致的最优K值范围(比如肘部看起来在K=3或4附近)。
- 然后,在这个小范围内,再用轮廓系数法进行精细的比较,找出那个使得平均轮廓系数最高的、最精确的K值。
这种“粗调”与“精调”相结合的策略,能让你在效率和准确性之间达到最佳的平衡。
第四章:【代码实现篇】—— scikit-learn
:你的“一键聚类”神器
理论的精妙,终须在代码的实践中绽放光芒。幸运的是,我们不必从零开始手动实现K-Means的每一个迭代步骤。强大的Python机器学习库 scikit-learn
已经为我们提供了一个高度优化、功能完备的K-Means实现。
本章,我们将学习如何驾驭这个“神器”,并将其封装成一个标准化的、可复用的“聚类工作流”,让你面对任何聚类任务都能得心应手。
1. 我们的“武器库”:核心Python库与模块
在开始之前,请确保你已经安装了我们的“数据科学三件套”:
numpy
: 用于进行高效的数值计算,是所有数据科学库的基石。matplotlib
: 用于数据可视化,让我们的结果会“说话”。scikit-learn
: 提供了从数据预处理、模型训练到评估的全套工具。我们将主要使用:sklearn.cluster.KMeans
:K-Means算法的核心实现。sklearn.metrics.silhouette_score
:用于计算轮廓系数。sklearn.datasets.make_blobs
:一个方便的工具,用于生成聚类测试数据。
如果你尚未安装,可以通过以下命令一键安装:
pip install numpy matplotlib scikit-learn tqdm kneed
(tqdm
用于显示进度条,kneed
用于自动寻找肘部点,让我们的工作流更智能)
2. “聚类工作流”:一个函数的封装艺术
为了让整个流程清晰可控、可复用,我们将所有步骤——从寻找最优K值到最终聚类和可视化——全部封装在一个名为kmeans_workflow
的函数中。
完整的Python实现代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs # 用于生成聚类测试数据
from tqdm import tqdm # 用于显示美观的进度条
from kneed import KneeLocator # 用于自动寻找肘部点# --- 1. 环境设置 ---
# 忽略一些未来版本的警告,让输出更干净
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)# 设置matplotlib以正确显示中文和负号
try:plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False
except Exception as e:print(f"中文字体设置失败,将使用默认字体: {e}")def kmeans_workflow(data, max_k=10, visualize=True):"""一个完整的、自动化的K-Means聚类工作流。该函数会自动寻找最优K值,训练最终模型,并进行可视化。参数:data (np.array): 输入的数据,格式为 (n_samples, n_features)。max_k (int): 搜索最优K值的上限。visualize (bool): 是否绘制并显示所有可视化图表。返回:tuple: (final_labels, final_centroids, optimal_k)- final_labels: 每个样本点的最终簇标签。- final_centroids: 最终的质心坐标。- optimal_k: 算法确定的最优K值。"""print("--- 步骤1: 寻找最优K值 ---")# 1.1 使用肘部法则和轮廓系数进行评估k_range = range(1, max_k + 1)sse = [] # 存储簇内误差平方和 (SSE)silhouette_scores = [] # 存储轮廓系数for k in tqdm(k_range, desc="[进度] 正在计算K值评估指标"):# a) 初始化KMeans模型# init='k-means++': 智能初始化质心,避免局部最优陷阱# n_init='auto': 自动决定运行次数,选择最好的结果,增强稳定性kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42, n_init='auto')kmeans.fit(data)# b) 记录SSE (用于肘部法则)sse.append(kmeans.inertia_)# c) 记录轮廓系数 (K>=2)if k > 1:labels = kmeans.labels_score = silhouette_score(data, labels)silhouette_scores.append(score)# 1.2 自动确定最优K值# a) 自动寻找“肘部”点kn = KneeLocator(list(k_range), sse, S=1.0, curve='convex', direction='decreasing')elbow_k = kn.elbow# b) 自动寻找轮廓系数最大点silhouette_k = np.argmax(silhouette_scores) + 2 # +2因为k_range_silhouette是从2开始的print(f"\n[诊断报告] 肘部法则推荐K值: {elbow_k}")print(f"[诊断报告] 轮廓系数推荐K值: {silhouette_k}")# 我们优先采纳轮廓系数的结果,因为它通常更客观optimal_k = silhouette_k# 1.3 可视化K值选择诊断图if visualize:# ... (此部分代码与上一章提供的 plot_k_selection_diagnostics 函数完全相同) ...# 为了简洁,此处省略重复代码,但在最终运行时会包含pass # 假设已绘制print(f"\n--- 步骤2: 使用最优K={optimal_k}进行最终聚类 ---")# 2.1 训练最终模型final_kmeans = KMeans(n_clusters=optimal_k, init='k-means++', random_state=42, n_init='auto')final_labels = final_kmeans.fit_predict(data)final_centroids = final_kmeans.cluster_centers_print("[成功] 最终模型训练完成!")# 2.2 可视化最终聚类结果if visualize:plt.figure(figsize=(12, 8))scatter = plt.scatter(data[:, 0], data[:, 1], c=final_labels, cmap='viridis', s=50, alpha=0.8)plt.scatter(final_centroids[:, 0], final_centroids[:, 1], c='red', s=250, marker='*', edgecolors='black', label='质心 (Centroids)', zorder=10)plt.title(f'K-Means聚类最终结果 (K={optimal_k})', fontsize=18, fontweight='bold')plt.xlabel('特征 1', fontsize=14)plt.ylabel('特征 2', fontsize=14)plt.legend()plt.grid(True, linestyle=':', alpha=0.6)plt.show()return final_labels, final_centroids, optimal_k# --- 主程序入口,用于演示和测试 ---
if __name__ == '__main__':# 为了演示,我们生成一组有4个明显簇的模拟数据X_test, y_true = make_blobs(n_samples=500, centers=4, cluster_std=0.8, random_state=42)# 调用我们的自动化工作流labels, centroids, k = kmeans_workflow(X_test, max_k=10)print("\n--- 工作流执行完毕 ---")print(f"确定的最优簇数量为: {k}")# print("每个样本的簇标签:", labels)# print("最终的质心坐标:\n", centroids)
代码逐行分析 (Code Analysis)
-
kmeans_workflow(...)
函数定义:- 我们将所有操作封装在一个函数里,使其成为一个可复用的、标准化的工作流。输入
data
,它就能自动完成所有分析并返回结果。
- 我们将所有操作封装在一个函数里,使其成为一个可复用的、标准化的工作流。输入
-
步骤1:寻找最优K值
- 循环与计算: 我们通过一个
for
循环,遍历从1到max_k
的所有K值。 KMeans(...)
初始化:n_clusters=k
:这是最重要的参数,指定了当前要聚成几类。init='k-means++'
:这是一个极其重要的参数!它使用了一种智能的初始化方法,选择的初始质心彼此相互远离,能极大地避免算法陷入糟糕的局部最优解,并加速收敛。比纯随机'random'
要好得多。random_state=42
:固定随机种子,保证每次运行代码的结果都完全一样,便于复现和调试。n_init='auto'
:在scikit-learn
的新版本中,这个参数会自动决定运行K-Means算法的次数(每次使用不同的随机初始质心),并返回其中最好的结果。这进一步增强了模型的稳定性。
kmeans.inertia_
:这是scikit-learn
中直接获取SSE值的便捷属性。silhouette_score(...)
:这是scikit-learn
中直接计算平均轮廓系数的函数。KneeLocator(...)
: 我们引入了一个非常好用的第三方库kneed
,它可以自动地、客观地从一堆数据点中找到“肘部”拐点,避免了我们用肉眼主观判断的困难。
- 循环与计算: 我们通过一个
-
步骤2:最终聚类与可视化
final_kmeans = KMeans(n_clusters=optimal_k, ...)
: 在确定了最优K值后,我们用这个K值来初始化最终的模型。final_labels = final_kmeans.fit_predict(data)
:fit_predict
方法会一步完成模型的训练和对每个数据点进行簇标签的预测。final_centroids = final_kmeans.cluster_centers_
: 训练好的模型会把最终的质心坐标存储在cluster_centers_
属性中。- 可视化:
plt.scatter(..., c=final_labels, cmap='viridis')
:这是可视化的精髓。我们将final_labels
(一个包含0, 1, 2…的数组)作为颜色参数c
传入,matplotlib
会自动地为不同簇的数据点赋予不同的颜色。cmap='viridis'
是一个视觉上很舒服的色板。- 质心用红色的、巨大的五角星来标记,确保它们在图中清晰可见。
💡 小瑞瑞说: 这段代码不仅仅是“能用”,它体现了一套科学、严谨、可复现的聚类分析范式。它教会你如何负责任地选择K值,如何使用scikit-learn
中那些能提升模型稳定性的高级参数,以及如何用清晰的可视化来呈现你的发现。掌握了它,你就拥有了探索任何“无标签”世界的强大能力。
第五章:【实战与可视化篇】—— 案件重演:让数据“自己站队”
理论的强大,终须在实战中得以印证。现在,我们将化身为一名真正的数据侦探,应用上一章打造的kmeans_workflow
自动化工作流,来侦破一个“身份不明”的数据集案件。我们的任务,就是在没有任何先验标签的情况下,揭示出数据背后隐藏的真实“派系”结构。
5.1 案情介绍:一份神秘的二维数据集
我们的“案卷”,是一份包含了500个样本点的二维数据集。我们只知道每个样本点的两个特征(Feature 1 和 Feature 2),但对其类别一无所知。
# (接上一章代码)
# --- 主程序入口 ---
if __name__ == '__main__':# 1. 生成“案发现场”:一组用于测试的、有明显聚类结构的数据X_test, y_true = make_blobs(n_samples=500, centers=4, cluster_std=0.8, random_state=42)
- 代码解读: 我们使用
sklearn.datasets.make_blobs
函数生成了这份模拟数据。为了检验我们算法的准确性,我们“偷偷地”设定了它其实包含centers=4
个真实的簇。在整个分析过程中,我们的算法是完全不知道这个“真实答案”的。
第一步:现场勘查 —— 原始数据可视化
在进行任何复杂的分析之前,先对数据进行可视化,是数据侦探的“第一直觉”。
plt.figure(figsize=(10, 8))plt.scatter(X_test[:, 0], X_test[:, 1], s=50, alpha=0.7, c='gray', edgecolors='k')plt.title('案发现场:一份神秘的未标记数据集', fontsize=18)plt.xlabel('特征 1 (Feature 1)', fontsize=14)plt.ylabel('特征 2 (Feature 2)', fontsize=14)plt.grid(True, linestyle=':', alpha=0.6)plt.show()
可视化结果一:原始数据散点图
侦探的初步勘查报告:
- 直观感受: 数据点并非完全随机地散布,而是呈现出明显的**“抱团”**现象。
- 初步推断: 用肉眼观察,我们可以大致分辨出4个“云团状”的密集区域。这为我们后续选择K值提供了一个非常重要的直觉性参考。我们的任务,就是让K-Means算法自动地、精确地找出这4个“派系”。
5.2 寻找线索:科学地确定最优K值
现在,我们正式调用我们的自动化工作流kmeans_workflow
,让它为我们进行科学的K值诊断。
labels, centroids, k = kmeans_workflow(X_test, max_k=10)
可视化结果二:K值选择诊断图
法医的诊断报告(深度解读):
-
左图 - 肘部法则 (Elbow Method):
- 曲线分析: 我们可以看到,簇内误差平方和(SSE)随着K值的增加而急剧下降。
- “肘部”定位: 在K=4的位置,曲线的下降斜率发生了一个非常明显的转折,变得平缓了许多。这个清晰的“手肘”(由红色虚线和五角星标记)强烈地暗示我们,K=4是一个“性价比”极高的选择。当K>4后,再增加簇的数量,对降低簇内总距离的“收益”已经不大了。
- 结论: 肘部法则指向 K=4。
-
右图 - 轮廓系数 (Silhouette Score):
- 曲线分析: 平均轮廓系数在K=2时表现不错,在K=3时有所下降,但在K=4时达到了全局的最高点。当K>4后,得分开始下降。
- 峰值定位: 最高的轮廓系数得分出现在K=4处(由红色虚线和五角星标记)。
- 结论: 轮廓系数法以一种更客观、更量化的方式告诉我们,当数据被划分为4个簇时,整体的“簇内凝聚度”和“簇间分离度”达到了最佳的平衡。它也明确地指向 K=4。
侦探的最终裁决:
两份独立的“法医报告”(肘部法则和轮廓系数)都指向了同一个“嫌疑人”——K=4。证据确凿,我们有充分的信心,认为这份数据背后隐藏着4个真实的群组。
5.3 案件告破:最终聚类结果与分析
在确定了最优K值为4之后,我们的工作流会自动用K=4
来训练最终的K-Means模型,并给出可视化的“结案报告”。
可视化结果三:K-Means聚类最终结果图
结案报告(深度解读):
-
图表元素分析:
- 四种颜色的散点:
scikit-learn
已经自动地为我们识别出的四个簇,分别染上了不同的颜色(紫、蓝、青、黄)。这就是“让数据自己站队”的最终结果。 - 红色的五角星: 这四个闪亮的星星,是K-Means算法找到的每个簇的最终质心。它们精确地坐落在了各自“云团”的几何中心,完美地扮演了每个“派系”的“首领”角色。
- 四种颜色的散点:
-
结论与洞察:
- 聚类效果显著: 算法成功地将原始的、混沌的灰色数据点,划分为了四个边界清晰、结构紧凑的群组。这个结果与我们最初肉眼观察的直觉得到了完美的相互印证。
- 质心的代表性: 每个质心的位置,都高度概括了其所在簇的数据分布特征。如果我们想用一个点来代表这个簇,这个质心就是最佳选择。
- 无监督的力量: 最令人惊叹的是,整个过程我们没有给计算机任何一个“标准答案”。仅仅通过计算样本间的距离,K-Means就自主地、智能地发现了数据中隐藏的模式。这就是无监督学习的巨大魅力。
💡 小瑞瑞说:
通过这一整套从“现场勘查”到“法医鉴定”,再到“结案陈词”的流程,我们不仅得到了一个聚类结果,更重要的是,我们对这个结果的由来和可靠性了如指掌。在下一章,我们将跳出K-Means本身,去看看它在更广阔的真实世界中能解决哪些问题,以及当它遇到“疑难杂案”时,我们还能请哪些“外援专家”。
第六章:【检验与拓展篇】—— K-Means的“朋友圈”与“进化之路”
恭喜你!到目前为止,你已经完整地掌握了K-Means建模的全流程,并成功地完成了一次实战聚类。但这就像一位侦探侦破了他的第一个案子,真正的成长在于复盘与反思。
一个模型是否优秀,不仅要看它能做什么,更要看它不能做什么,以及有没有更好的替代品。本章,我们将对K-Means模型进行一次全面的“压力测试”,并探索其“家族”中更强大的成员。
6.1 模型的优劣势与敏感性分析:K-Means的“阿喀琉斯之踵”
K-Means算法以其简洁和高效赢得了广泛赞誉,但也正因其简洁,使其带有一些固有的“性格缺陷”。
优势 (Pros) - 闪光点 | 劣势 (Cons) - 致命弱点 |
---|---|
算法简单,易于理解 “分配-更新”的迭代逻辑非常直观,结果的可解释性强。 | K值敏感,需要预先指定 这是K-Means最大的“软肋”。K值的选择对结果影响巨大,且往往需要依赖启发式方法(如肘部法则)来辅助判断。 |
计算高效,速度快 算法复杂度近似线性于样本数量 O(n⋅K⋅T⋅d)O(n \cdot K \cdot T \cdot d)O(n⋅K⋅T⋅d),对于大规模数据集的处理速度非常快。 | 对初始质心敏感 随机的初始质心可能导致算法收敛到较差的局部最优解。虽然 k-means++ 初始化策略能极大缓解此问题,但并非万无一失。 |
通用性强 作为无监督学习的基石,适用于各种特征空间的数据探索。 | 对“球形”簇的偏好 K-Means的内在数学假设是簇是凸形的、各项同性的(类似球形),且大小相似。它无法处理非球形簇(如月牙形、环形)、大小差异悬殊的簇。 |
结果易于解释 每个簇由一个明确的“质心”来代表,这个质心本身就具有业务含义(该簇的“平均画像”)。 | 对异常值和噪声极其敏感 由于质心是簇内所有点的均值,一两个远离群体的**异常值(Outliers)**会极大地“拽偏”质心的位置,从而严重影响聚类结果。 |
敏感性分析:初始化的“蝴蝶效应”
为了直观感受K-Means对初始质心的敏感性,我们可以做一个简单的实验:使用纯随机初始化init='random'
,并多次运行K-Means,你会发现每次得到的聚类结果可能都不完全相同,SSE值也有差异。这正是scikit-learn
中n_init='auto'
参数存在的意义——它会自动帮你多次运行,并返回最好的那次结果,从而增强了模型的鲁棒性。
💡 小瑞瑞的判决书:
K-Means是一位速度极快、逻辑清晰,但有点“强迫症”和“脸盲”的侦探。它擅长处理那些界限分明、形状规整的“常规案件”。但一旦遇到形状诡异、混入“伪装者”(异常值)的“疑难杂案”,它就可能“断错案”。
6.2 拓展与延申:K-Means的“亲戚”与“升级版武器”
当K-Means遇到困难时,我们不必束手无策。在聚类算法的“武器库”中,还有许多更强大的“专家”可供我们召唤。
6.2.1 K-Means的“稳健版”:K-Medoids (K-中心点)
- 核心思想:
K-Medoids与K-Means唯一的区别在于,它不再使用簇的“均值”(一个可能是虚拟的点)作为中心,而是选择簇内真实存在的一个样本点(我们称之为中心点 Medoid)来作为代表。这个中心点的选择标准是:它到簇内所有其他点的距离之和最小。 - 解决了什么痛点?
因为它使用真实样本点作为中心,所以它对异常值和噪声的敏感度远低于K-Means。一个异常值无法大幅改变“距离之和最小”的那个真实点的位置。 - 代价: 计算成本通常高于K-Means,因为它需要计算大量的点对点距离。
6.2.2 无需预设K值:层次聚类 (Hierarchical Clustering)
- 核心思想:
它不试图一次性将数据划分为K个簇,而是构建一个嵌套的、树状的聚类结构。- 凝聚型(自底向上): 开始时每个点都是一个簇,然后逐步合并最相似的簇,直到所有点都在一个簇里。
- 分裂型(自顶向下): 开始时所有点都在一个簇,然后逐步分裂最不相似的簇,直到每个点都是一个簇。
- 解决了什么痛点?
无需预先指定K值! 我们可以通过观察其输出的树状图(Dendrogram),根据业务需求,在任意高度“横切”一刀,从而得到任意数量的簇。 - 可视化: 树状图本身就是一种非常强大的、能揭示数据层次结构的分析工具。
“这张树状图简直就是一部数据样本的‘合并史’!
底部是20个独立的‘个体’。
向上看,最相似的个体(如样本8和样本1)在很低的距离上就合并成了第一个‘小家庭’。
这个过程不断重复,小家庭合并成大家族,直到最顶端形成一个‘国家’。
我们如何决定分几类呢? 只需要用水果刀在图上“横切”一刀!
红色的虚线告诉我们,如果我们想把数据分成3个簇,应该在哪里‘下刀’。
绿色的虚线则展示了如何得到2个簇。
这种无需预设K值、又能直观展示数据内在层次结构的特性,正是层次聚类的魅力所在。”
6.2.3 识别任意形状:DBSCAN (基于密度的聚类)
- 核心思想:
K-Means的“引力宇宙”模型,决定了它只能发现球形簇。而DBSCAN则采用了一种全新的“密度”世界观。一个簇,是由一群密度足够高的样本点所组成的区域。簇与簇之间,被密度稀疏的区域(噪声)所分隔。
- 解决了什么痛点?
- 能够发现任意形状的簇,如月牙形、环形、S形等。
- 能够自动识别出噪声点,并将其排除在任何簇之外。
- 无需预先指定K值(但需要设定两个密度相关的参数:
eps
和min_samples
)。
- 应用场景: 在地理空间数据分析、异常检测等领域,当簇的形状不规则时,DBSCAN是绝对的首选。
“为了让大家直观地感受到DBSCAN在处理复杂形状数据时的“降维打击”能力,我们来看一个经典的‘月牙形’数据集对比实验:”
这张对比图清晰地展示了一个“K-Means失灵,DBSCAN称王”的经典场景:
- 面对月牙形数据(左图),我们的老朋友K-Means(中图)彻底‘脸盲’了。它固执的‘球形’世界观让它无法理解这种优雅的曲线结构,给出了一个完全错误的答案。
- 而DBSCAN(右图)则像一位真正的艺术家,它不问形状,只看密度。它轻松地沿着数据的密集路径,完美地勾勒出了两个月牙的轮廓,并正确地将它们分离开来。
这张图告诉我们一个深刻的道理:**没有最好的算法,只有最适合的算法。**当你的数据呈现出非球形的复杂结构时,DBSCAN就是你武器库中那把不可或缺的‘瑞士军刀’。”
💡 小瑞瑞的武器升级建议:
将这几种算法看作你工具箱里的不同“镜头”:
- K-Means: 你的标准定焦镜头,快速、清晰,适用于大多数常规场景。
- K-Medoids: 带有“防抖”功能的升级版标头,在环境嘈杂(有噪声)时更可靠。
- 层次聚类: 一支强大的变焦镜头,让你可以在不同的“焦段”(聚类粒度)上自由切换,观察全局。
- DBSCAN: 一支神奇的“鱼眼/微距镜头”,能带你发现那些形状奇特、隐藏在常规视角之外的微观结构。
第七章:【应用与终章】—— K-Means的“用武之地”与未来的“星辰大海”
经过前面六章的“魔鬼训练”,你已经不再是一个对聚类感到迷茫的新手,而是一位手持“K值罗盘”、懂得如何勘察、诊断、建模和评估的“数据侦探”。
在本篇章的最后,我们将走出“案发现场”,去看看我们掌握的这门“手艺”,在波澜壮阔的真实世界中,究竟能掀起怎样的波澜。同时,我们也将仰望星空,看一看在K-Means之外,还有哪些更璀璨的“聚类星辰”等待我们去探索。
7.1 应用领域与场景:K-Means的真实世界“狩猎场”
K-Means算法以其高效、直观、可解释性强的特点,在商业和科研领域中扮演着不可或缺的角色。只要你需要对未标记的数据进行初步的探索性分组,K-Means都是你武器库中那把最锋利、最可靠的“开山斧”。
-
📈 商业智能:客户分群 (Customer Segmentation) - 最经典的应用!
- 场景: 一家电商公司拥有数百万用户的消费数据(如消费频率RFM、客单价、浏览品类等)。他们希望对用户进行分群,以实现精准营销。
- K-Means能做什么:
- 将用户的多维度消费行为作为特征输入。
- 使用K-Means将用户自动聚类成K个群体,例如:
- 簇1:高价值客户(高消费频率、高消费金额)
- 簇2:潜力新客(近期有消费、消费金额中等)
- 簇3:低价值/流失风险客户(消费频率低、许久未消费)
- 商业决策: 针对不同群组,制定不同的营销策略(如为高价值客户提供VIP服务,为潜力新客发放优惠券,向流失风险客户发送召回邮件)。
-
🎨 图像处理:图像分割与颜色量化 (Image Segmentation & Color Quantization)
- 场景: 我们想从一张复杂的图片中分离出主体,或者将一张拥有数百万种颜色的高清图片压缩成只有16种主色调的“复古”风格图。
- K-Means能做什么:
- 将图片中的每一个像素点看作一个数据样本,其特征就是它的RGB颜色值(一个三维向量)。
- 使用K-Means对所有像素点进行聚类(例如,
K=16
)。 - 聚类完成后,将同一簇内的所有像素点,都统一替换成该簇的质心颜色。
- 结果: 整张图片的颜色种类被“量化”到了16种,实现了压缩。同时,颜色相近的区域(如天空、草地)被划分到了同一个簇,实现了简单的图像分割。
-
📄 自然语言处理:文本聚类 (Document Clustering)
- 场景: 一家新闻门户网站,每小时都会收到成千上万篇来自世界各地的新闻稿。如何自动地将这些新闻稿按主题进行分类(如“体育”、“科技”、“财经”)?
- K-Means能做什么:
- 首先,需要通过文本表示技术(如TF-IDF或Word2Vec),将每一篇文章“翻译”成一个高维的数学向量。
- 然后,使用K-Means对这些文章向量进行聚类。
- 结果: 内容相似的文章(即向量空间中距离相近的文章)会被划分到同一个簇,从而自动实现了主题发现。
-
🔬 科研与生物信息学
- 基因表达数据分析: 根据基因在不同样本中的表达水平,对基因进行聚类,从而发现可能具有相似功能的“基因模块”。
- 物种分类: 根据生物的各种形态学特征,对其进行聚类,辅助物种的识别与分类。
💡 小瑞瑞的实战建议:
K-Means的强大之处在于它的普适性和作为基石的作用。在很多复杂的项目中,它往往是数据探索的第一步。通过K-Means得到的初步分群结果,可以为后续更复杂的监督学习模型(如为每个簇单独训练一个预测模型)提供极其宝贵的洞察和基础。
7.2 终章:你的分析工具箱,已装备“无监督”引擎
K-Means,以其优雅的迭代和直观的逻辑,为我们打开了“无监督学习”这片新大陆的大门。它教会我们,即使在没有“标准答案”的世界里,数据自身也蕴含着深刻的结构与秩序,等待着我们去发现。
现在,你不仅掌握了它的原理和实现,更拥有了一套科学的评估和应用方法论。这个强大的“无监督”引擎,必将让你的数据分析能力,从“解答已知问题”跃升到“探索未知世界”的全新高度。
但是,探索永无止境! K-Means为我们建立了坚实的基础,但在它之外,还有更广阔、更复杂的“星辰大海”等待着我们。
7.3 拓展与延申:超越K-Means的未来之路
当我们的“标准定焦镜头”K-Means面对以下“疑难杂案”时,我们就需要召唤更现代、更强大的“特种镜头”了:
-
高维数据的“诅咒”:
- 挑战: 当数据特征维度非常高时(如成千上万维),欧几里得距离的意义会逐渐失效(“维度灾难”),K-Means性能会急剧下降。
- 未来武器:
- 降维 + 聚类: 先使用主成分分析(PCA)或t-SNE等降维技术,将数据投影到低维空间,再进行K-Means聚类。
- 子空间聚类 (Subspace Clustering): 专门用于在高维数据中,发现存在于不同特征子空间中的簇。
-
海量数据的挑战:
- 挑战: 对于无法一次性读入内存的超大规模数据集,标准K-Means难以处理。
- 未来武器:
- Mini-Batch K-Means:
scikit-learn
中提供的变体,每次只使用一小部分数据(mini-batch)来更新质心,能够以较小的精度损失,实现对海量数据的在线聚类。 - 分布式计算框架: 在Spark等分布式计算平台上,有专门为大规模并行计算设计的K-Means实现(如
MLlib
中的K-Means)。
- Mini-Batch K-Means:
-
从“硬”到“软”的哲学思辨:
- 挑战: K-Means是一种硬聚类(Hard Clustering),它强制每个样本点必须且只能属于一个簇。但现实中,很多样本可能处于簇的边界,具有“模棱两可”的身份。
- 未来武器:
- 模糊C均值聚类 (Fuzzy C-Means, FCM): 一种软聚类(Soft Clustering)算法。它不直接为样本分配标签,而是为每个样本计算一个隶属于各个簇的“概率”或“隶属度”。
- 高斯混合模型 (Gaussian Mixture Model, GMM): 更强大的软聚类模型。它假设每个簇都服从一个高斯分布,并通过**期望最大化(EM)**算法,来求解每个样本属于各个高斯分布的概率。
💡 小瑞瑞的终极展望:
K-Means是你成为一名优秀数据科学家的“必修课”,它为你建立了最坚实的聚类分析根基。而上述这些更高级的模型,则是你的“选修课”和“进阶课”。只有深刻理解了K-Means的智慧与局限,你才能在未来的学习和实践中,更好地驾驭这些更强大的工具。
🏆 最后的最后,一个留给你的思考题,也是对全文的回响:
你认为,在进行K-Means聚类之前,对数据进行“标准化”(如StandardScaler)处理,是一个必要步骤吗?为什么?它会对聚类结果产生怎样的影响?
在评论区留下你的深度思考,让我们一起在探索数据的道路上,永不止步!
我是小瑞瑞,如果这篇“无监督探索之旅”让你对数据分析有了全新的认识,别忘了点赞👍、收藏⭐、加关注!我们下一篇,将在更精彩的世界里相遇!