机器学习算法系列(六):聚类算法(K-means,K-medoids,层次聚类)

一:聚类算法介绍

在无监督算法中,用于训练的数据不需要标签。聚类算法就属于无监督算法的一种。聚类算法可以分为两大类:

  • 分割型聚类(每个样本点只能在一个类别中)
    • k-means/k-medoids聚类
  • 层次型聚类
    • 树状的数据结构,每一层是一种分类方法。

二:聚类算法的应用

  • 图像压缩
    • 相近的样本在一个类别中,距离较远的样本在不同类别中。每个类别中只存储一个代表样本。
  • 图像分割
    • 对数据进行聚类,把同一个类别中的数据点分割成一块。
  • 数据层次化组织
    • 对数据按照不同的力度进行聚类划分。
    • 每个内部节点代表了不同的类,每个叶子节点代表了不同的数据。

三:K-means算法

目标:给定n个数据点,自动地通过无监督的方法把这n个数据点分为k类。

数学表达:给定数据点 X = { x i } , i = 1 , 2 , 3 , , , n , x i ⊆ R d X=\{x_i\},i = 1,2,3,,,n,x_i \subseteq R^d X={xi},i=1,2,3,,,nxiRd;给定k个聚类中心, k ⊂ n k \subset n kn

直观理解:寻找k个中心,使得数据到中心的距离最小,然后将数据点分配到距离最近的聚类中心。
min ⁡ μ 1 , μ 2 , , , μ n ∑ i = 1 n min ⁡ j = 1 , 2 , , , k ∣ ∣ x i − μ j ∣ ∣ 2 \min_{\mu_1,\mu_2,,,\mu_n} \sum_{i=1}^{n}\min_{j=1,2,,,k}||x_i-\mu_j||^2 μ1,μ2,,,μnmini=1nj=1,2,,,kminxiμj2
在k-means算法中,我们使用
二范数
来计算数据与中心的距离(L2距离)。所以是在欧式空间中进行分割。

算法过程:

  1. 在空间中任意选择K个点,作为每个类别的中心点。

  2. 将每一个点分配至距离其最近的中心点,形成k个类别。

  3. 重新计算每个类别的中心点,计算方式很简单,如下面公式所示,当前类别中所有数据点的质心(算术平均值)
    μ ∗ = 1 t ∑ i = 1 t x i \mu^*=\frac{1}{t}\sum_{i=1}^{t}x_i μ=t1i=1txi

  4. 终止条件:类别中心点的位置不再变化。

需要注意的是,k-means算法并不能够取得这个问题的全局最优解,只能取得局部最优解。

四:K-medoids算法

K-means算法有如下两个缺点:

  • 由于聚类中心是质心(即对所有点求平均得到聚类中心点),因此该中心点很有可能不是数据集中的一个点,也就是说聚类中心很有可能不存在具体的物理意义。
  • K-means算法使用了L2距离函数,容易受到噪声数据的影响。在L2的计算方法中,存在着平方项,这会放大噪声数据对类别中心点的影响,会将类别中心点拉偏。

针对以上两个缺点,有了如下的K-medoids算法,该算法有如下两点需要注意:

  • 限制聚类中心必须来自数据点。

  • 使用L1距离函数。

    对于两个点 A ( x 1 , x 2 , x 3 ) , B ( y 1 , y 2 , y 3 ) A(x_1,x_2,x_3),B(y_1,y_2,y_3) A(x1,x2,x3),B(y1,y2,y3)

L 1 距 离 : ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ + ∣ x 3 − y 3 ∣ L 2 距 离 : ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ( x 3 − y 3 ) 2 L1距离:|x_1-y_1|+|x_2-y_2|+|x_3-y_3|\\ L2距离:(x_1-y_1)^2+(x_2-y_2)^2+(x_3-y_3)^2 L1x1y1+x2y2+x3y3L2:(x1y1)2+(x2y2)2+(x3y3)2

K-medoids算法的过程:

  1. 在数据集中随机选择k个点作为类别中心点。

  2. 将每一个数据点分配至距离最近的中心点(L1距离函数)

  3. 对于每个类别,重新确定类别中心点。过程是这样的:分别计算类别中的每一个点到其它所有点的L1距离,然后对这些距离求和。找到到所有其它点距离之和最小的点作为类别中心点。

五:K-means与K-medoids的区别

  1. 距离的计算方式不同:K-means使用L2距离;K-medoids使用L1距离。
  2. 算法鲁棒性不同:K-means受噪声点影响较大,鲁棒性较差;而K-medoids算法鲁棒性更好,受噪声点影响较小。
  3. 中心点的选取方法不同:K-means算法选择质心(所有点的坐标求和取平均)作为类别中心点,这样中心点有可能不在数据集内,而使得中心点没有具体的物理意义。K-medois算法选择类别中离所有其它点距离最近(L1距离)的点作为中心点,只是计算更加复杂。
  4. 两者都受初始点的影响。最终得到的都是一个局部最优解。在实际使用时,通常重复多次,每次选取不同的初始点,以此来避免单次实验的偶然性。

六:层次聚类算法

层次聚类算法最大的特点就是:类别与类别之间存在嵌套关系,一个数据可以同时属于多个类别。

  • 算法构造了一颗二叉树。

  • 二叉树的叶子节点代表数据。

  • 二叉树的每一个内部节点代表一个类别。

6.1 算法过程

初始化:算法将每个数据看作一个类别。然后开始迭代

  • 选择距离最近的两个类进行合并。
  • 将合并之后的两个类从现有类中删除。
  • 将合并之后的类加入到现有类别中,重复第一步。
  • 直到所有点被合并成一个类别。

在这种算法中,假设一共有n个数据点,那么就需要进行n-1次合并操作。因为每次合并都会减少一个类别。

核心问题:如何计算两个类别之间的距离?因为不同类别中样本点的个数很有可能是不同的。

single-linkage算法:取两个类别中距离最近的两个点之间的距离作为两个类别之间的距离。

complete-linkage算法:取两个类别中距离最远的两个点之间的距离作为两个类别之间的距离。

从距离的计算方法中,就可以看出层次聚类算法的复杂度非常高。假设两个类别中均有n个数据点,那么每次进行类别合并时就需要计算 n ∗ n n*n nn个距离,然后整个层次聚类过程需要进行n-1次聚类,所以算法复杂度为 O ( n 3 ) O(n^3) O(n3),这种聚类方法不适合大数据量的聚类。

你可能感兴趣的:(机器学习系列)