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 值和观察不同数据分布,可以深入理解聚类算法的特性和局限性。

下面是完整代码:

 

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