1

详解聚类算法Kmeans-重要参数init & random_state & n_init:初始质心怎么放...

 1 year ago
source link: https://blog.51cto.com/u_15767241/5978810
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

详解聚类算法Kmeans-重要参数init & random_state & n_init:初始质心怎么放更好【菜菜的sklearn课堂笔记】

精选 原创

视频作者:[菜菜TsaiTsai]
链接:[【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili]

在K-Means中有一个重要的环节,就是放置初始质心。如果有足够的时间,K-means一定会收敛,但Inertia可能收敛到局部最小值。是否能够收敛到真正的最小值很大程度上取决于质心的初始化。init就是用来帮助我们决定质心初始放置位置的参数。
初始质心放置的位置不同,聚类的结果很可能也会不一样,一个好的质心选择可以让K-Means避免更多的计算,让算法收敛稳定且更快。
在之前讲解初始质心的放置时,我们是使用”随机“的方法在样本点中抽取k个样本作为初始质心,这种方法显然不符合”稳定且更快“的需求。为此,我们可以使用random_state参数来控制每次生成的初始质心都在相同位置,甚至可以画学习曲线来确定最优的random_state是哪个整数。一个random_state对应一个质心随机初始化的随机数种子。如果不指定随机数种子,则sklearn中的K-means并不会只选择一个随机模式扔出结果,而会在每个随机数种子下运行多次,并使用结果最好的一个随机数种子来作为初始质心。我们可以使用参数n_init来选择,每个随机数种子下运行的次数。这个参数不常用到,默认10次,如果我们希望运行的结果更加精确,那我们可以增加这个参数n_init的值来增加每个随机数种子下运行的次数。
然而这种方法依然是基于随机性的。
为了优化选择初始质心的方法,2007年Arthur, David, and Sergei Vassilvitskii三人发表了论文“k-means++: The advantages of careful seeding”,他们开发了”k-means ++“初始化方案,使得初始质心(通常)彼此远离,以此来引导出比随机初始化更可靠的结果。在sklearn中,我们使用参数init ='k-means ++'来选择使用k-means 作为质心初始化的方案。通常来说,建议保留默认的"k-means"的方法。

KMeans(
    ['n_clusters=8', '*', "init='k-means++'", 'n_init=10', 'max_iter=300', 'tol=0.0001', "precompute_distances='deprecated'", 'verbose=0', 'random_state=None', 'copy_x=True', "n_jobs='deprecated'", "algorithm='auto'"],
)
# init:可输入"k-means++","random"或者一个n维数组。这是初始化质心的方法,默认"k-means++"。如果输入了n维数组,数组的形状应该是(n_clusters,n_features)并给出初始质心。
# random_state:控制每次质心随机初始化的随机数种子
# n_init:整数,默认10,使用不同的质心随机初始化的种子来运行k-means算法的次数。最终结果会是基于Inertia来计算的n_init次连续运行后的最佳输出
from sklearn.metrics import silhouette_samples,silhouette_score
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd

X,y = make_blobs(n_samples=50000,n_features=10,centers=5)

plus = KMeans(n_clusters=10,random_state=420).fit(X)
plus.n_iter_ # 迭代次数
# 一般而言KMeans++,也就是默认的init参数,运行速度快且迭代次数少
---
18

random = KMeans(n_clusters=10,init='random',random_state=420).fit(X)
random.n_iter_
---
23

这个笔记大可能不会再更新了,买新版的课了,感觉挺好的,推荐一下


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK