机器学习读书笔记03 聚类(K-Means)

聚类的定义

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

K-Means

K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。
K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。

K-Means算法过程

  • 从N个文档随机选取K个文档作为质心
  • 对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类
  • 重新计算已经得到的各个类的质心
  • 迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束

具体如下:
输入:k, data[n];

1 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1];
2 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;
3 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数;
4 重复(2)(3),直到所有c[i]值的变化小于给定阈值。

k-means 算法缺点

  • 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。
  • 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。

sklearn中的KMeans

在sklearn中处理kmeans聚类问题,用到的是 sklearn.cluster.KMeans 这个类。
参数:

  • n_clusters:整形,缺省值=8, 生成的聚类数,即产生的质心(centroids)数。
  • max_iter:整形,缺省值=300, 执行一次k-means算法所进行的最大迭代数。
  • n_init:整形,缺省值=10, 用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • init:有三个可选值:'k-means++', 'random',或者传递一个ndarray向量。此参数指定初始化方法,默认值为'k-means++'。

1 ‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛,参见 k_init 的解释获取更多信息。
2 ‘random’ 随机从训练数据中选取初始质心。
3 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

  • precompute_distances:三个可选值,‘auto’,True 或者 False。预计算距离,计算速度更快但占用更多内存。

1 ‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
2 True:总是预先计算距离。
3 False:永远不预先计算距离。

  • tol:float形,默认值= 1e-4, 与inertia结合来确定收敛条件。
  • n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。

1 若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
2 若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

  • random_state:整形或 numpy.RandomState 类型,可选, 用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
  • verbose:整形,默认值=0
  • Verbosity mode
  • copy_x:布尔型,默认值=True, 当我们precomputing distances时,将数据中心化会得到更准确的结果。

1 如果把此参数值设为True,则原始数据不会被改变。
2 如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

属性:

  • cluster_centers_:向量,[n_clusters, n_features]
  • Coordinates of cluster centers (每个簇中心的坐标??)
  • Labels_:每个点的分类
  • inertia_:float形,每个点到其簇的质心的距离之和。

sklearn官网示例

from sklearn.cluster import KMeans
import numpy as np

X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)

kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)

kmeans.cluster_centers_
array([[ 1.,  2.], [ 4.,  2.]])

参考

原文地址:https://www.cnblogs.com/chrisma/p/7016008.html