课程
988 字
约 3 分钟
大三上
实验九 问题讨论
机器学习与数据挖掘labs/lab11·更新于 2026-09-15
实验九 问题讨论
实验收获
- 深入理解 K-Means 算法原理:通过亲手实现
kMeansInitCentroids(初始化)、findClosestCentroids(簇分配)和computeCentroids(中心更新)三个核心函数,深刻理解了 K-Means 算法“期望-最大化”(EM)的迭代思想。 - 提升 Numpy 向量化编程能力:在计算样本点到中心点的距离时,应用了 Numpy 的广播机制(Broadcasting),避免了多重循环,提高了代码的运行效率和简洁度。
- 数据聚类分析:直观地看到了不同初始中心点对最终聚类结果可能产生的影响(局部最优解问题),虽然本实验数据较简单,但原理相通。
遇到的问题
- 模板代码缩进错误:在提供的代码模板中,
computeCentroids函数内部的return centroids语句缩进位置不对(在for循环内部或外层逻辑混乱),导致函数逻辑错误。 - 距离计算的维度处理:在实现
findClosestCentroids时,最初对于如何一次性计算一个样本点到所有 个中心点的距离并在特定轴上求和(axis=1)稍感困惑。 - 空簇的处理:理论上 K-Means 可能会出现某个中心点在这个迭代中没有被分配任何样本的情况。
解决问题的思路路径
- 修复缩进:阅读代码逻辑,确认
return语句应当在for循环结束后执行,因此手动调整了缩进,使其属于函数体而非循环体。 - 查阅文档与调试:查阅 Numpy 文档,利用
(X[i] - centroids) ** 2的广播特性先计算差值的平方,再用np.sum(..., axis=1)对特征维度求和得到距离(平方),最后使用np.argmin获取最近中心的索引。 - 逻辑检查:虽然本数据集简单未出现空簇,但在
computeCentroids重写逻辑中,我们通过set(idx)动态获取存在的簇索引,确保了计算的鲁棒性(或者严格按照 值遍历,若为空则维持原位或随机重置,本实验采用模板逻辑按 遍历即可得到正确结果)。













