视频加载失败

课程

988 字
约 3 分钟

实验九 问题讨论

机器学习与数据挖掘labs/lab11·更新于 2026-09-15

实验九 问题讨论

实验收获

  1. 深入理解 K-Means 算法原理:通过亲手实现 kMeansInitCentroids(初始化)、findClosestCentroids(簇分配)和 computeCentroids(中心更新)三个核心函数,深刻理解了 K-Means 算法“期望-最大化”(EM)的迭代思想。
  2. 提升 Numpy 向量化编程能力:在计算样本点到中心点的距离时,应用了 Numpy 的广播机制(Broadcasting),避免了多重循环,提高了代码的运行效率和简洁度。
  3. 数据聚类分析:直观地看到了不同初始中心点对最终聚类结果可能产生的影响(局部最优解问题),虽然本实验数据较简单,但原理相通。

遇到的问题

  1. 模板代码缩进错误:在提供的代码模板中,computeCentroids 函数内部的 return centroids 语句缩进位置不对(在 for 循环内部或外层逻辑混乱),导致函数逻辑错误。
  2. 距离计算的维度处理:在实现 findClosestCentroids 时,最初对于如何一次性计算一个样本点到所有 KK 个中心点的距离并在特定轴上求和(axis=1)稍感困惑。
  3. 空簇的处理:理论上 K-Means 可能会出现某个中心点在这个迭代中没有被分配任何样本的情况。

解决问题的思路路径

  1. 修复缩进:阅读代码逻辑,确认 return 语句应当在 for 循环结束后执行,因此手动调整了缩进,使其属于函数体而非循环体。
  2. 查阅文档与调试:查阅 Numpy 文档,利用 (X[i] - centroids) ** 2 的广播特性先计算差值的平方,再用 np.sum(..., axis=1) 对特征维度求和得到距离(平方),最后使用 np.argmin 获取最近中心的索引。
  3. 逻辑检查:虽然本数据集简单未出现空簇,但在 computeCentroids 重写逻辑中,我们通过 set(idx) 动态获取存在的簇索引,确保了计算的鲁棒性(或者严格按照 KK 值遍历,若为空则维持原位或随机重置,本实验采用模板逻辑按 KK 遍历即可得到正确结果)。
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录