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

时间:2022-12-29 22:53:56

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

init

在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

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