传统的K-Means算法对初始聚类中心的选择非常敏感,而K-Means++就是针对这一点来对K-Means进行改进。
K-Means++选择初始聚类中心的步骤:
- 从输入的数据点集合中随机选择一个点作为第一个聚类中心
- 对于数据集中的每一个点x,计算它与已选择的聚类中心中最近聚类中心的距离D(x)
- 依据一个有权重的概率分布选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
- 重复2-3,选出k个聚类中心
- 利用这k个初始的聚类中心来执行标准的k-means算法
第2步中,计算每个数据点与最近的聚类中心的距离,依次得到D(1)、D(2)、…、D(n)构成的集合D,其中n表示数据集的大小。
在D中,为了避免噪声,不能直接选取D(x)值最大的元素,而是依概率来选取较大的元素。
具体实现:
- 将D(x)相加得到s=sum(D(x))
- 取一个落在[0,s]中的随机值r,然后用r -= D(x),直到其<=0,此时的点就是下一个聚类中心。
直观理解:
把集合D中的每个元素D(x)想象为一根线L,线的长度就是元素的值。将这些线依次按照L(1)、L(2)、…、L(n)的顺序连接起来,组成长线L。L(1)、L(2)、…、L(n)称为L的子线。根据概率的相关知识,如果我们在L上随机选择一个点,那么这个点所在的子线很有可能是比较长的子线,而这个子线对应的数据点就可以作为聚类中心。