来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注)
文章目录
概念
聚类是无监督学习,分类&预测是有监督学习。
输入数据集,输出聚类结果。输出结果是 K 组簇,每个簇是一组相似的对象。
距离度量
距离度量有很多方法:
Minkowski 距离:
D
i
j
=
(
∑
k
=
1
d
∣
x
i
k
−
x
j
k
∣
n
)
1
n
D_{ij} = (\sum_{k=1}^d|x_{ik}-x_{jk}|^n)^{\frac{1}{n}}
Dij=(∑k=1d∣xik−xjk∣n)n1
当 n=1 时,就是曼哈顿距离/绝对值(City-block)
D i j = ∑ k = 1 d ∣ x i k − x j k ∣ D_{ij} = \sum_{k=1}^d|x_{ik}-x_{jk}| Dij=∑k=1d∣xik−xjk∣
:::warning
考试请使用曼哈顿距离,不要使用欧式距离
:::
当 n=2 时,就是欧氏距离(Euclidean)
D i j = ( ∑ k = 1 d ∣ x i k − x j k ∣ 2 ) 1 2 D_{ij} = (\sum_{k=1}^d|x_{ik}-x_{jk}|^2)^{\frac{1}{2}} Dij=(∑k=1d∣xik−xjk∣2)21
当 n=∞ 时,就是切比雪夫距离(Chebyshev)
D i j = max k = 1 d ∣ x i k − x j k ∣ D_{ij} = \max_{k=1}^d|x_{ik}-x_{jk}| Dij=maxk=1d∣xik−xjk∣
Mahalanobis 距离:
D i j = ( x i − x j ) T S − 1 ( x i − x j ) D_{ij} = \sqrt{(x_i-x_j)^TS^{-1}(x_i-x_j)} Dij=(xi−xj)TS−1(xi−xj)
其中 S 是协方差矩阵, S i j = 1 n − 1 ∑ k = 1 n ( x k i − μ i ) ( x k j − μ j ) S_{ij}=\frac{1}{n-1}\sum_{k=1}^n(x_{ki}-\mu_i)(x_{kj}-\mu_j) Sij=n−11∑k=1n(xki−μi)(xkj−μj)
点对称距离
基于分割的聚类算法 K-Means&K-Medoids
一般把 K 值作为输入,作为目标聚类数。
K-Means 算法(K-均值算法)
- 首先选取 K 个点作为初始聚类中心
- 然后计算每个点到这 K 个点的距离,把每个点分配到距离最近的聚类中心
- 然后重新计算每个簇的中心点
a i = 1 ∣ C i ∣ ∑ x ∈ C i x a_i=\frac{1}{|C_i|}\sum_{x\in C_i}x ai=∣Ci∣1∑x∈Cix
- 重复这个过程直到聚类中心不再变化或者平均误差收敛
平均误差: E = ∑ i = 1 K ∑ x ∈ C i d ( x , a i ) E=\sum_{i=1}^K\sum_{x\in C_i}d(x,a_i) E=∑i=1K∑x∈Cid(x,ai)
优点:
- 算法的复杂度是 O ( t K n ) O(tKn) O(tKn),t 是迭代次数,n 是数据集大小。
缺点:
- K 值的选取不好确定
- 对噪声和离群点敏感,有较大的离群点时,聚类中心会被拉偏
- 对初始聚类中心的选择敏感,初始聚类中心不同,聚类结果也不同
- 不能发现非凸形状的簇,比如环形簇
K-Medoids 算法(K-中心点算法)
k-mediods 每次选取的质心,必须是样本点,
而 k-means 每次选取的质心可以是样本点之外的点,
就好比中位数和平均值的区别
K-Medoids 和 K-Means 方法类似,在选取聚类中心时,K-Medoids 选取的是样本点,而 K-Means 选取的是样本点之外的点。
- 首先选取 K 个点作为初始聚类中心
- 然后计算每个点到这 K 个点的距离,把每个点分配到距离最近的聚类中心
- 选取当前簇中所有其他点到该中心点的距离之和最小的点作为新的中心点
- 重复这个过程直到聚类中心不再变化
优点:
- 对噪声和离群点不敏感
缺点:
- 算法的复杂度是 O ( t K n 2 ) O(tKn^2) O(tKn2),t 是迭代次数,n 是数据集大小。复杂度偏大,难以处理大数据集
层次聚类算法
采用距离作为衡量标准,分为凝聚式(AGNES)和分裂式(DIANA)。
AGNES 算法
输入一个 K 值,作为目标聚类数。
把点和点集都视为簇,每次把距离最近的两个簇合并,直到聚类数为 K。
距离的计算方式有很多种,比如最短距离、最长距离、平均距离、中心距离等。
距离相同随便分,优先分离落单的点。
DIANA 算法
思想和 AGNES 相反,从一个簇开始,每次把距离最远的点分离出来,直到聚类数为 K。
首先把所有点作为一个簇
- 寻找直径最大的簇,作为待分裂的簇
直径: d i a m ( C i ) = max x , y ∈ C i d ( x , y ) diam(C_i)=\max_{x,y\in C_i}d(x,y) diam(Ci)=maxx,y∈Cid(x,y)
也可以选择相异度等其他标准来选择待分裂的簇
- 寻找直径最大的簇中,距离簇中所有其他点距离之和最大的点,作为分裂出来的簇(分裂出来的簇只有一个点)
- 在原来的簇中,寻找距离分裂出来的簇最近的点,如果这个点到新簇的距离小于到原来簇中任意点的距离,则把这个点加入新簇
- 重复 3 直到原来的簇中没有点可以加入新簇
- 重复 1-4 直到聚类数为 K
优点和缺点
优点:
- 不需要预先指定聚类数
- 可以发现任意形状的簇
- 可以发现离群点
- 对噪声和离群点不敏感
缺点:
- 算法的复杂度是 O ( n 2 ) O(n^2) O(n2),n 是数据集大小。复杂度偏大,难以处理大数据集
- 过程不可逆,一旦分裂就无法合并
BIRCH 算法
作为 AGNES 和 DIANA 的改进,BIRCH 算法把数据集先聚类成 CF 树,然后再从 CF 树中选取聚类中心。
距离度量
距离度量有很多方法
- 最短距离(单连接)
d m i n ( C i , C j ) = min x ∈ C i , y ∈ C j d ( x , y ) d_{min}(C_i,C_j)=\min_{x\in C_i,y\in C_j}d(x,y) dmin(Ci,Cj)=minx∈Ci,y∈Cjd(x,y)
- 最长距离(完全连接)
d m a x ( C i , C j ) = max x ∈ C i , y ∈ C j d ( x , y ) d_{max}(C_i,C_j)=\max_{x\in C_i,y\in C_j}d(x,y) dmax(Ci,Cj)=maxx∈Ci,y∈Cjd(x,y)
- 平均距离
d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ y ∈ C j d ( x , y ) d_{avg}(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum_{x\in C_i}\sum_{y\in C_j}d(x,y) davg(Ci,Cj)=∣Ci∣∣Cj∣1∑x∈Ci∑y∈Cjd(x,y)
- 中心距离(均值距离)
用簇的中心点来代表簇
d c e n ( C i , C j ) = d ( μ i , μ j ) d_{cen}(C_i,C_j)=d(\mu_i,\mu_j) dcen(Ci,Cj)=d(μi,μj)
密度聚类算法
基于密度的聚类算法的主要思想是:只要邻近区域的密度(对象或数据点的数目)超过某个阈值,就把它加到与之相近的聚类中。也就是说,对给定类中的每个数据点,在一个给定范围的区域中必须至少包含某个数目的点。
基于密度的聚类算法代表算法有:DBSCAN 算法、OPTICS 算法及 DENCLUE 算法等。
概念拓展
邻域数、直接密度可达、密度可达、密度相连的概念 | CSDN
基于密度的聚类算法常见 2 个参数:
ϵ \epsilon ϵ
邻域半径,表示一个点的邻域的大小
M i n P t s MinPts MinPts
邻域内最少点的个数,表示一个点的邻域内最少有多少个点
中心对象(核心对象):如果一个点的邻域内至少有 MinPts 个点,则这个点是一个中心对象。
直接密度可达:如果 A 在 B 的 ϵ \epsilon ϵ-邻域内,且 B 是一个中心对象,则 A 直接密度可达 B。
密度可达:A 虽然不在 B 的 ϵ \epsilon ϵ-邻域内,在 C 的 ϵ \epsilon ϵ-邻域内,且 C 是 B 的 ϵ \epsilon ϵ-邻域内的点,且 B 是一个中心对象,则 A 密度可达 B。
(密度可达的传递性)
密度相连:如果 A 和 B 都密度可达 C,则 A 和 B 密度相连。
DBSCAN 算法
- 首先选取一个点 P
- 如果 P 是一个中心对象(即满足邻域内至少有 MinPts 个点),则把 P 以及所有密度可达的点加入一个簇
- 如果 P 不是一个中心对象,则把 P 标记为噪声点
- 重复 1-3 直到所有点都被访问过
基于网格的聚类算法
基于模型的聚类算法
————————————————
版权声明:本文为 田园幻想乡 的原创文章,遵循 CC 4.0 BY-NA-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:http://truraly.fun/课程笔记/数据挖掘/【7】聚类分析.html