K-Means 聚类算法可视化实现解析

K-Means 是一种经典的无监督学习聚类算法,广泛应用于数据挖掘、图像分割、市场细分和模式识别等领域。本项目通过 EGE 图形库实现了 K-Means 算法的完整可视化演示,展示了从随机初始化到迭代收敛的全过程。用户可以动态调整簇数量、生成不同分布的数据集,并观察算法如何逐步将数据点分组。

本次代码就在文章末尾, 可滑到底部查看。

K-Means 算法原理

K-Means 算法的目标是将 n 个数据点划分为 K 个簇,使得每个簇内的数据点尽可能相似,不同簇之间的数据点尽可能不同。

算法流程

  1. 初始化:选择 K 个点作为初始聚类中心
  2. 分配:将每个数据点分配给距离最近的聚类中心
  3. 更新:重新计算每个簇的中心点(簇内所有点的均值)
  4. 迭代:重复步骤 2 和 3,直到中心点不再移动或移动距离小于阈值

数学表达

目标函数(最小化簇内平方和):

J = \sum_{i=1}^{K} \sum_{x \in C_i} |x - \mu_i|^2

其中:

  • C_i 是第 i 个簇
  • \mu_i 是第 i 个簇的中心点
  • |x - \mu_i| 是欧几里得距离

更新公式

\mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x

项目特性

  • K-Means++ 初始化:使用改进的初始化策略,提升收敛速度和结果质量
  • 可视化迭代过程:实时显示数据点的簇分配和中心点移动轨迹
  • 动态参数调整:支持调整簇数量 K(2-10)和动画速度
  • 多样数据生成:使用高斯分布生成具有自然簇结构的数据集
  • 自动演示模式:自动迭代直到收敛
  • 统计信息显示:显示迭代次数、各簇点数、中心点移动距离等

核心算法实现

K-Means++ 初始化

传统 K-Means 随机选择初始中心点,容易陷入局部最优。K-Means++ 通过改进初始化策略显著提升性能。

K-Means++ 优势

  • 选择概率与距离平方成正比,倾向于选择远离已有中心点的点
  • 初始中心点分布更均匀,避免聚集在同一区域
  • 通常能更快收敛且结果更优

迭代过程

算法关键点

  • 使用距离平方而非距离,避免开方运算,提升性能
  • 统计每个簇的点数和坐标和,然后计算均值
  • 通过中心点移动距离判断收敛

收敛判定

当所有中心点的移动距离都小于阈值(如 0.5 像素)时,认为算法已收敛。

数据生成策略

高斯分布生成

数据特点

  • 使用正态分布生成簇状数据,模拟真实场景
  • 添加 10% 的噪声点,测试算法的鲁棒性
  • 确保数据点在画布范围内

可视化设计

数据点绘制

每个簇使用不同颜色,便于区分。

中心点绘制

中心点使用十字星标记,外圈颜色对应簇颜色,内圈白色,易于识别。

移动轨迹

使用虚线连接中心点的前后位置,展示移动轨迹。

性能优化

1. 避免开方运算

在分配步骤中,只需比较距离大小,使用距离平方即可,避免大量开方运算。

2. 数据结构优化

将簇分配结果直接存储在点结构中,避免使用额外的映射表。

3. 向量预分配

预先分配固定大小的向量,避免动态扩容。

算法复杂度分析

时间复杂度

  • 单次迭代O(n \cdot K)
    • 分配步骤:遍历 n 个点,每个点与 K 个中心点比较
    • 更新步骤:O(n),遍历所有点统计
  • 总时间复杂度O(t \cdot n \cdot K)
    • t 是迭代次数(通常很小,10-30 次)

空间复杂度

  • 数据点存储O(n)
  • 中心点存储O(K)
  • 辅助数组O(K)
  • 总空间复杂度O(n + K)

K-Means 的局限性

  1. 需要预先指定 K:需要事先知道簇的数量
  2. 对初始值敏感:不同初始化可能导致不同结果(K-Means++ 可缓解)
  3. 假设簇为凸形:对非凸形簇效果不佳
  4. 对离群点敏感:离群点会影响中心点位置
  5. 局部最优:可能陷入局部最优解

改进方向

  1. 肘部法则(Elbow Method):自动确定最优 K 值
  2. 轮廓系数(Silhouette Coefficient):评估聚类质量
  3. K-Medoids:使用实际数据点作为中心,对离群点更鲁棒
  4. Fuzzy C-Means:软聚类,允许点属于多个簇
  5. DBSCAN:基于密度的聚类,不需要预先指定 K

操作指南

  • S / 空格 / 回车:执行一次迭代
  • R:重置算法(保留数据点)
  • G:重新生成数据点
  • + / =:增加簇数量 K
  • – / _:减少簇数量 K
  • A:切换自动演示模式
  • ↑ / ↓:调整动画速度
  • ESC:退出程序

实际应用

K-Means 算法在多个领域有广泛应用:

  1. 图像分割:将像素按颜色聚类,实现图像压缩
  2. 市场细分:根据客户特征将客户分组
  3. 文档分类:将文档按主题聚类
  4. 异常检测:识别不属于任何簇的离群点
  5. 推荐系统:将用户或物品聚类,进行协同过滤

技术亮点

  1. K-Means++ 初始化:显著提升算法性能和结果质量
  2. 高斯分布数据生成:生成具有自然簇结构的测试数据
  3. 实时可视化:动态展示每次迭代的变化过程
  4. 性能优化:避免不必要的开方运算,使用距离平方
  5. 交互体验:支持参数调整、自动演示、速度控制

这个项目不仅展示了 K-Means 算法的工作原理,还通过可视化让抽象的数学概念变得直观易懂,是学习机器学习和数据挖掘的优秀案例。通过调整 K 值和观察不同数据分布,可以深入理解聚类算法的特性和局限性。

下面是完整代码:

 

文章分类 范例 标签: , , ,