交互式图论学习
交互式图论学习
Guest User
Using app without sign in
交互式K-Means聚类工具
将城市分组到完全分离的地理区域中。
选择算法并生成步骤以开始可视化
K-means 聚类将点划分为 k 组,把每个点分配到最近的簇心,并把每个簇心移到其所分配点的均值处。用于物流网络时,它把顾客分组为服务区域或候选仓库区。
Lloyd 算法在两步间交替直到稳定:把每个点分配到最近的质心,然后把每个质心重算为其点的平均值。每次迭代花费 O(nk) 次距离计算,且目标(平方距离之和)从不增大。初始化很重要:k-means++ 以概率方式分散初始质心,产生可证明更优的期望结果。肘部法或轮廓系数指导 k 的选择。
在供应链设计中,k-means 在精确优化之前先创建配送区域并把候选仓库定位在簇心。在物流之外,它驱动客户细分、图像压缩、异常检测基线以及机器学习流水线中的向量量化。
两个步骤交替进行,直到不再发生任何变化:把每个点分配给最近的质心,然后把每个质心移动到分配给它的那些点的平均位置。
K均值(点集, k):
初始化 k 个质心(随机,或用 k-means++)
重复直到分配不再改变:
// 分配步骤
对每个点 p:
簇[p] = 使 距离(p, c) 最小的那个 c
// 更新步骤
对每个质心 c:
c = 所有满足 簇[p] == c 的点的均值
返回 簇划分与质心每一步都会让簇内平方和下降或保持不变,而可能的分配方案只有有限多种,因此算法总会终止。它不保证的是终止在全局最优:它收敛到的是一个局部极小,而那完全取决于初始化,这也正是实践中必须加以处理的局限。
把四个点聚成两簇,并刻意从一个糟糕的初始化出发,让两个质心都落在同一个真实簇里。
示例图: 点位于 (1,1)、(2,1)、(8,8) 和 (9,8)。初始质心被放在 (1,1) 与 (2,1),也就是都落在左下那一簇中。
两轮之内即告收敛,簇内平方和从 61.333 降到 1.0。请注意算法从一个刻意设计的糟糕初始化中恢复了过来,当时两个质心都落在同一个真实簇内。这一点并没有保证:换一批数据,这样的初始化就可能把你困在某个局部极小里。这正是 k-means++ 要把初始质心选得彼此远离的原因,也是值得用不同初始化多跑几次的原因。
时间: O(n · k · i · d) · 空间: O(n + k·d)
每一轮都要把 n 个点与 k 个质心在 d 维空间中逐一比较,即 O(n 乘以 k 乘以 d),而更新步骤再把这些点扫一遍,代价相同。若迭代 i 轮,总计为 O(n 乘以 k 乘以 i 乘以 d)。实践中 i 通常很小,数十量级,尽管最坏情况下它可以超多项式地增长。空间是每个点一个簇标号再加上 k 个质心。按平方和意义求最优聚类即便在 k 等于 2 时也是 NP 困难的,因此被普遍使用的 Lloyd 算法只是一个启发式:实践中又快又好,但没有最优性保证。
根据你预期簇的形状,以及是否事先知道 k 来选择。
| 替代算法 | 以下情况更合适 | 代价 |
|---|---|---|
| 配合 k-means++ 的 K-均值 | 默认选择。簇大致呈球形且规模相近,且 k 已知。 | O(n · k · i · d) |
| DBSCAN | 簇的形状任意或数据中有噪声,而且事先不知道 k。 | 借助索引可达 O(n log n) |
| 层次聚类 | 你想要一棵树状图,并在看清结构之后再决定簇的数目。 | O(n^2 log n) |
| K-中心点(PAM) | 簇中心必须是真实的数据点,或者存在会扭曲均值的离群点。 | O(k·(n-k)^2) |
| 高斯混合模型 | 你想要软归属和椭圆形的簇,而不是硬性归属和球形簇。 | O(n · k · i · d^2) |
相关算法: 设施选址, 车队调度 (mTSP)