sklearn机器学习:K-Means初始质心怎么放

重要参数init & random_state & n_init

在K-Means中有一个重要的环节,就是放置初始质心。

init

如果有足够的时间,K-means一定会收敛,但Inertia可能收敛到局部最小值。是否能够收敛到真正的最小值很大程度上取决于质心的初始化。init就
是用来帮助我们决定初始化方式的参数。

random_state

初始质心放置的位置不同,聚类的结果很可能也会不一样,一个好的质心选择可以让K-Means避免更多的计算,让算法收敛稳定且更快。在之前讲解初始质心的放置时,我们是使用”随机“的方法在样本点中抽取k个样本作为初始质心,这种方法显然不符合”稳定且更快“的需求。为此,我们可以使用
random_state参数来控制每次生成的初始质心都在相同位置,甚至可以画学习曲线来确定最优的random_state是哪个整数。

n_init

一个random_state对应一个质心随机初始化的随机数种子。如果不指定随机数种子,则sklearn中的KMeans并不会只选择一个随机模式扔出结果,而会在每个随机数种子下运行多次,并使用结果最好的一个随机数种子来作为初始质心。我们可以使用参数n_init来选择,每个随机数种子下运行的次数。这个参数不常用到,默认10次,如果我们希望运行的结果更加精确,可以增加这个参数n_init的值来增加每个随机数种子下运行的次数。
然而这种方法依然是基于随机性的。
为了优化选择初始质心的方法,2007年Arthur, David, and Sergei Vassilvitskii三人发表了论文“kmeans++:The advantages of careful seeding”,他们开发了”k-means ++“初始化方案,使得初始质心(通常)彼此远离,以此来引导出比随机初始化更可靠的结果。在sklearn中,我们使用参数**init =‘kmeans++’**来选择使用k-means ++作为质心初始化的方案。通常来说,建议保留默认的"kmeans++"的方法。

参数说明

**init:**可输入"k-means++",“random"或者一个n维数组初始化质心的方法,默认"k-means++”。
输入"k-means++":一种为K均值聚类选择初始聚类中心的聪明的办法,以加速收敛;
如果输入了n维数组,数组的形状应该是(n_clusters,n_features)并给出初始质心;
random_state:控制每次质心随机初始化的随机数种子
n_init:整数,默认10
使用不同的质心随机初始化的种子来运行k-means算法的次数。最终结果会是基于Inertia来计算的n_init次连续运行后的最佳输出。
继续用我们在博文《sklearn机器学习:K-Means》中建立的各向同性高斯团簇的数据点集

#init:默认"k-means++"
plus = KMeans(n_clusters = 10).fit(X)
plus.n_iter_
13
random = KMeans(n_clusters = 10,init="random",random_state=420).fit(X)
random.n_iter_
19

可见,k-means++可以加速收敛。

你可能感兴趣的:(机器学习,算法,Python,机器学习,算法,Python,k-means++)