Kmeans中k值的相关理论

Kmeans算法作为机器学习十大算法之一,它的流程相信不用多说,这里说下它的缺点:

1.需要提前给定k值

2.对初始聚类中心的选取有很大的依赖性

3.如果长时间不能收敛,计算时间会很长。

而对于初始聚类中心的选择,《大数据-互联网大规模数据挖掘》这本书里有相关的策略,主要提到了2点;

1 尽量选择较远的点作为聚类中心:首先随机选一个点,然后选距离这个点最远的点作为第二个聚类中心,然后再选一个点,距离已经选的2个点最近距离最远,选第n个点时,要选择与前面n-1个点最近距离最远的那个点,一直到选了k个点为止。

2 需要利用层次聚类或者Canopy算法先找到较好的聚类中心,在此基础上在进行聚类。

其实说了很多发现,就算第一种策略去找较好的初始聚类中心,也需要提前知道k的值,而对于k的值,这本书中提到了一个比较好解决办法,首先它给的一个结论是:给定一个合适的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升。下面给图:

Kmeans中k值的相关理论_第1张图片

图中显然可以看到聚成五类比较理想,但是如果硬要聚成2到7类的话,结果如图所示,而相对应的平均半径变化如下:

Kmeans中k值的相关理论_第2张图片

虽然不知道这个结论的由来,但是这也为寻找一个较好的k值提供了一个方法:按照k=1,2,4,8....进行聚类,而对于找最优的k,可以采用二分的手段来进行,比如我知道k的范围在[l,r],那么我取mid=(l+r)/2,如果[mid,r]这段区间指标变化不大,那么在[l,mid]继续二分,否则如果[mid,r]之前存在了变化很大的区间,那么在[mid,r]区间进行二分。但是这里存在一个问题,就是如何衡量变化大不大,这可能需要定义出与数据集相关的公式才可以实现。




你可能感兴趣的:(kmeans)