在无监督算法中,用于训练的数据不需要标签。聚类算法就属于无监督算法的一种。聚类算法可以分为两大类:
目标:给定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,,,n,xi⊆Rd;给定k个聚类中心, k ⊂ n k \subset n k⊂n。
直观理解:寻找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=1∑nj=1,2,,,kmin∣∣xi−μj∣∣2
在k-means算法中,我们使用二范数来计算数据与中心的距离(L2距离)。所以是在欧式空间中进行分割。
算法过程:
在空间中任意选择K个点,作为每个类别的中心点。
将每一个点分配至距离其最近的中心点,形成k个类别。
重新计算每个类别的中心点,计算方式很简单,如下面公式所示,当前类别中所有数据点的质心(算术平均值)
μ ∗ = 1 t ∑ i = 1 t x i \mu^*=\frac{1}{t}\sum_{i=1}^{t}x_i μ∗=t1i=1∑txi
终止条件:类别中心点的位置不再变化。
需要注意的是,k-means算法并不能够取得这个问题的全局最优解,只能取得局部最优解。
K-means算法有如下两个缺点:
针对以上两个缺点,有了如下的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 L1距离:∣x1−y1∣+∣x2−y2∣+∣x3−y3∣L2距离:(x1−y1)2+(x2−y2)2+(x3−y3)2
K-medoids算法的过程:
在数据集中随机选择k个点作为类别中心点。
将每一个数据点分配至距离最近的中心点(L1距离函数)
对于每个类别,重新确定类别中心点。过程是这样的:分别计算类别中的每一个点到其它所有点的L1距离,然后对这些距离求和。找到到所有其它点距离之和最小的点作为类别中心点。
层次聚类算法最大的特点就是:类别与类别之间存在嵌套关系,一个数据可以同时属于多个类别。
算法构造了一颗二叉树。
二叉树的叶子节点代表数据。
二叉树的每一个内部节点代表一个类别。
初始化:算法将每个数据看作一个类别。然后开始迭代
在这种算法中,假设一共有n个数据点,那么就需要进行n-1次合并操作。因为每次合并都会减少一个类别。
核心问题:如何计算两个类别之间的距离?因为不同类别中样本点的个数很有可能是不同的。
single-linkage算法:取两个类别中距离最近的两个点之间的距离作为两个类别之间的距离。
complete-linkage算法:取两个类别中距离最远的两个点之间的距离作为两个类别之间的距离。
从距离的计算方法中,就可以看出层次聚类算法的复杂度非常高。假设两个类别中均有n个数据点,那么每次进行类别合并时就需要计算 n ∗ n n*n n∗n个距离,然后整个层次聚类过程需要进行n-1次聚类,所以算法复杂度为 O ( n 3 ) O(n^3) O(n3),这种聚类方法不适合大数据量的聚类。