sklearn.KMeans解析

文章目录

  • sklearn版本
  • sklearn.KMeans使用实例
  • 实例1 Iris,鸢尾花数据集(UC Irvine Machine Learning Repository)
  • 实例2 RandomData,在二维坐标轴排列成一条直线的随机数据
  • sklearn.KMeans解析
  • KMeans类
  • 构造函数__init__(),调用格式iris_kmeans = KMeans(n_clusters=3)
  • iris_kmeans.fit(X)
  • _kmeans_single_elkan(X,tol= self.tol,random_state=seed)
  • elkan_iter(X,centers,centers_new,labels,center_shift,update_centers=True/False)
  • predict(X)
  • 参考

sklearn版本

  • scikit-learn 0.23.2

sklearn.KMeans使用实例

  • 实例1 Iris,鸢尾花数据集(UC Irvine Machine Learning Repository)

    Iris可以从sklearn包内部导入,常常用作分类的训练数据集。这里为了方便展示聚类效果(二维在平面图中效果明显),选取Iris的前两个维度作为聚类依据。代码参见Iris_KMeans.py。左图为全部数据点,右图为KMeans聚类(n_cluseters=3,Iris数据集本就采集自3种鸢尾花)结果,不同颜色代表不同簇。
    sklearn.KMeans解析_第1张图片sklearn.KMeans解析_第2张图片
  • 实例2 RandomData,在二维坐标轴排列成一条直线的随机数据

    这一个例子主要展现不同簇数量(n_cluseters)对聚类效果的影响。为此首先用make_blobs生成属于4个簇的随机点,最后用Calinski-Harabasz Index评估方式为不同簇数量的聚类打分,代码参见RandomData_KMeans.py。最左图为全部数据点。剩余三张图分别为簇数量为3、4、5的KMeans聚类结果。显然n_cluseters=4时效果是最好的。
    sklearn.KMeans解析_第3张图片sklearn.KMeans解析_第4张图片sklearn.KMeans解析_第5张图片sklearn.KMeans解析_第6张图片

sklearn.KMeans解析

sklearn中包括KMeans和MiniBatchKMeans两种k-means聚类,后者对大规模数据集进行采样后执行k-means,避免计算量过大。本节分析sklearn.KMeans中的主要函数。

  • KMeans类

    导入方法:from sklearn.cluster import KMeans
    描述: 构造一个KMeans聚类,其函数用于完成聚类。待初始化参数参见构造函数。
    待计算参数(计算完成后,聚类完成):
    self.cluster_centers		#KMeans聚类簇中心
    self.labels_				#KMeans聚类簇标签(训练后,每条数据所属簇)
    self.interia_				#训练数据所有样本到所属簇中心距离的平方和
    self.n_iter_				#训练迭代次数
    
  • 构造函数__init__(),调用格式iris_kmeans = KMeans(n_clusters=3)

    描述: KMeans类构造函数。调用格式中传入一个参数值,其他值取默认。
    主要代码(__init__):

    self.n_clusters = n_clusters	#簇(中心)数量
    self.init = init				#初始化簇中心的方式,默认‘k-means++’
    self.max_iter = max_iter		#单次执行KMeans最多迭代次数。默认300
    self.tol = tol					#连续两次迭代中簇中心的容差,用来判断收敛
    self.n_init = n_init			#不同初始簇中心执行KMeans的次数。输出结果
    								#是其中最好的一次(防止局部最优)。默认10。
    self.algorithm = algorithm		#迭代算法选择,默认‘elkan’
    
  • iris_kmeans.fit(X)

    描述: KMeans类训练函数。
    输入: X-训练数据。返回:self(KMeans对象)。
    按照输入参数和默认参数,主要执行以下步骤:
    1.重新计算依赖训练数据的容差self.tol
    2.生成self.n_init个随机种子seeds,每次执行中1个seed用来初始化簇中心。
    3.执行self.n_init_kmeans_single_elkan(X,self.tol,seed),每次执行都是单独执行一次KMeans算法,每次执行返回聚类结果,包括labels, inertia, centers, n_iter_,如果inertia(目前已返回的最小值),认为刚刚执行的这次聚类效果最好。best_labels = labels, best_centers = centers.copy(), best_inertia = inertia, best_n_iter = n_iter_
    4.self.cluster_centers_ = best_centers, self.labels_ = best_labels, self.inertia_ = best_inertia, self.n_iter_ = best_n_iter。返回self

  • _kmeans_single_elkan(X,tol= self.tol,random_state=seed)

    描述: 完整的KMeans算法,同时根据三角形边的关系加快距离判断。
    输入: 除输入参数外其他均为默认。返回:labels, inertia, centers, n_iter_
    主要执行以下步骤:
    1.根据seed,用'k-means++' 方法初始化self.n_clusters个簇中心centers
    2.创建centers_new, labels, labels_old, center_shift(表示簇中心的位置差异)等变量。
    3.当迭代次数小于self.max_iter时,循环执行elkan_iter(X,centers,centers_new,labels,center_shift,True),每次迭代elkan_iter更新labelscenters_newcenter_shift。一次迭代完成后若labelslabels_old完全一致,则认为严格收敛,跳出循环;否则根据center_shift计算center_shift_tot,若center_shift_tot <= self.tol,则认为近似收敛,跳出循环;若仍未跳出循环,centers=centers_new, labels_old = labels,继续循环。
    4.循环结束后,若不是严格收敛,调用elkan_iter(X,centers,labels,False) 更新labels,因为未严格收敛的情况下,labels可能有变化。
    5.根据最终的labelscenters计算inertia。返回labels, inertia, centers, n_iter_(当前迭代次数+1) 。

  • elkan_iter(X,centers,centers_new,labels,center_shift,update_centers=True/False)

    描述: KMeans算法的一次迭代过程,若update_centers=True,更新labels后,重新计算centers位置(centers_new);若update_centers=False,该算法只更新labels,因此该函数也被用于根据已训练聚类预测测试数据的簇标签。
    返回: 不取返回值,但修改参数centers_new, labels, center_shift
    主要执行以下步骤:
    1.根据Xcenters,判断每一个样本是否有更接近的簇中心,若有,更新labels
    2.若update_centers=True,根据labels(即样本归属情况),重新计算簇中心,存在centers_new中。
    3.若update_centers=True,更新center_shift

  • predict(X)

    #描述: KMeans类预测函数,根据训练的聚类self,计算X的簇标签
    #输入: 测试数据X。返回:X的簇标签labels
    #主要执行以下步骤:
    1.调用多层函数,通过lloyd_iter(X,self.cluster_centers,False) 计算X的簇标签labelslloyd_iterelkan_iter作用相同,计算方式不同,当update_centers=False时,只更新X的簇标签(labels)。
    2.返回labels

参考

K-Means聚类算法原理
作者:刘建平Pinard
用scikit-learn学习K-Means聚类
作者:刘建平Pinard

时间关系,文章中有很多东西一笔带过,逻辑可能有点小bug。但这部分代码我看得比较细,欢迎批评指正、交流讨论。
还有同系列文章哈哈哈:
sklearn.DBSCAN解析

你可能感兴趣的:(数据挖掘,kmeans算法,数据挖掘,python,聚类,聚类算法)