K-means++算法是对传统的K-means聚类算法的一种改进
,它解决了K-means算法的一个主要缺点
——对初始聚类中心选择的敏感性
。
K-means++通过一种更合理的方式来选择初始聚类中心
,使得算法更有可能找到全局最优解,而不是陷入局部最优。
K-means++算法流程:
- 随机选择第一个聚类中心:
- 从数据集中
随机选择一个样本点作为第一个聚类中心
。
- 计算距离并选择剩余的聚类中心:
- 对于数据集中的
每个点
,计算它到已选聚类中心的最短距离
。 - 选择下一个聚类中心 的
概率
与成正比
。这意味着那些距离现有聚类中心较远的点
有更大的机会被选为新的聚类中心。
- 重复上述过程:
- 直到选择了所有
公式:
在K-means++中,对于每一个未被选作聚类中心的点
,计算其到最近的聚类中心的距离
,定义为:
这里 表示向量的范数
,通常是欧几里得距离:
其中 和 分别是点
$x $ 和聚类中心
在第 维的坐标值, 是数据的维度。
概率选择新聚类中心:
选择下一个聚类中心的概率与距离平方成正比:
其中
- 代表
单个点
到其最近的已选质心
(centroid)的距离的平方
。这里的 是点 - 是指对数据集 中的
所有点
的距离平方
这意味着,如果一个点 到最近的聚类中心的距离较大
,那么它被选为下一个聚类中心的概率也较高。
通过这种方式,K-means++算法倾向于在数据集的不同区域
选择聚类中心,从而避免了
K-means算法可能产生的偏斜聚类中心的问题,提高了算法的稳定性和聚类质量。
python代码
这段代码实现了 K-means++ 中的质心初始化过程,下面是对每一部分的详细注释:
这里导入了必要的库 numpy
和 random
,并且定义了一个数据集 data
,它包含了六个二维数据点。
euclidean_distance
函数计算两个点 a
和 b
之间的欧几里得距离
。它先计算两个点坐标的差值,然后对这些差值的平方求和,最后取平方根得到最终的距离。
initialize_centers
函数接收数据集 data
和预期的质心数量 k
。首先,它随机选择数据集中的一个点作为第一个质心,并将其添加到 centers
列表中。
接下来的循环为剩下的 k-1
个质心选择位置。对于数据集中的每个点 x
,计算它到所有已选质心的最小距离。这些距离被存储在 dists
数组中。
计算每个点被选为下一个质心的概率
。这通过将每个点的距离平方除以所有点距离平方的总和来完成,确保概率之和等于 1。
cum_probs
是一个累积概率数组
,由 probs
的累积和构成。rand_prob
是一个介于 0 和 1 之间的随机数,将用于从累积概率分布中选择下一个质心。
使用 rand_prob
来决定下一个质心。遍历 cum_probs
数组直到找到第一个大于或等于 rand_prob
的元素,此时的索引 i
就对应着下一个被选中的质心。
函数返回选定的质心列表 centers
。
最后,设定 k
为 3,并调用 initialize_centers
函数来初始化三个质心。打印出初始化后的质心列表。
这个过程确保了质心的初始选择是分散的,而不是聚集在一起,
这可以提高 K-means 算法的性能和结果质量。