目录
文章目录
一、什么是聚类
1.1 聚类的定义
聚类(Clustering)
是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。
1.2 聚类和分类的区别
聚类(Clustering)
:是指把相似的数据划分到一起,具体划分的时候并不关心这一类的标签,目标就是把相似的数据聚合到一起,聚类是一种无监督学习(Unsupervised Learning)
方法。分类(Classification)
:是需要标注数据是某种具体的类型,通过训练数据集获得一个分类器,再通过分类器去预测未知数据的过程,分类是一种监督学习(Supervised Learning)
方法。
1.3 聚类的一般过程
- 数据准备:特征标准化和降维
- 特征选择:从最初的特征中选择最有效的特征,并将其存储在向量中
- 特征提取:通过对选择的特征进行转换形成新的突出特征
- 聚类:基于某种距离函数进行相似度度量,获取簇
- 聚类结果评估:分析聚类结果,如
SSE
等
1.4 数据对象间的相似度度量
对于数值型数据,可以使用下表中的相似度度量方法。
相似度度量准则 | 相似度度量函数 |
---|---|
Euclidean 距离 | d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d( x, y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} d(x,y)=∑i=1n(xi−yi)2 |
Manhattan 距离 | d ( x , y ) = ∑ i = 1 n ∥ x i − y i ∥ d(x, y)=\sum_{i=1}^{n}\left \|x_i-y_i \right\| d(x,y)=∑i=1n∥xi−yi∥ |
Chebyshev 距离 | d ( x , y ) = max i = 1 , 2 , … , n n ∥ x i − y i ∥ d( x, y)=\max_{i=1,2,…,n}^{n}\left\|x_i-y_i \right\| d(x,y)=maxi=1,2,…,nn∥xi−yi∥ |
Minkowski 距离 | d ( x , y ) = [ ∑ i = 1 n ( x i − y i ) p ] 1 p d( x, y)=[\sum_{i=1}^{n}(x_i-y_i)^p]^ {\frac{1}{p}} d(x,y)=[∑i=1n(xi−yi)p]p1 |
Minkowski
距离就是$ Lp
范
数
(
范数(
范数(p≥1$),而 Manhattan
距离、Euclidean
距离、Chebyshev
距离分别对应
p
=
1
,
2
,
∞
p=1,2,∞
p=1,2,∞时的情形。
1.5 cluster之间的相似度度量
除了需要衡量对象之间的距离之外,有些聚类算法(如层次聚类)还需要衡量cluster
之间的距离 ,假设
C
i
C_i
Ci和
C
j
C_j
Cj 为两个 cluster
,则前四种方法定义的
C
i
C_i
Ci和
C
j
C_j
Cj 之间的距离如下表所示:
相似度度量准则 | 相似度度量函数 |
---|---|
Single-link | D ( C i , C j ) = min x ⊆ C i , y ⊆ C j d ( x , y ) D(C_i,C_j)= \min_{x\subseteq C_i, y\subseteq C_j}d( x, y) D(Ci,Cj)=minx⊆Ci,y⊆Cjd(x,y) |
Complete-link | D ( C i , C j ) = max x ⊆ C i , y ⊆ C j d ( x , y ) D(C_i,C_j)= \max_{x\subseteq C_i, y\subseteq C_j}d( x, y) D(Ci,Cj)=maxx⊆Ci,y⊆Cjd(x,y) |
UPGMA | D ( C i , C j ) = 1 ∥ C i ∥ ∥ C j ∥ ∑ x ⊆ C i , y ⊆ C j d ( x , y ) D(C_i,C_j)= \frac{1}{\left\| C_i\right \|\left \| C_j\right \|}\sum_{x\subseteq C_i, y\subseteq C_j}d( x, y) D(Ci,Cj)=∥Ci∥∥Cj∥1∑x⊆Ci,y⊆Cjd(x,y) |
WPGMA | - |
Single-link
定义两个cluster
之间的距离为两个cluster
之间距离最近的两个点之间的距离,这种方法会在聚类的过程中产生链式效应
,即有可能会出现非常大的cluster
Complete-link
定义的是两个cluster
之间的距离为两个``cluster之间距离最远的两个点之间的距离,这种方法可以避免
链式效应`,对异常样本点(不符合数据集的整体分布的噪声点)却非常敏感,容易产生不合理的聚类UPGMA
正好是Single-link
和Complete-link
方法的折中,他定义两个cluster
之间的距离为两个cluster
之间所有点距离的平均值- 最后一种
WPGMA
方法计算的是两个cluster
之间两个对象之间的距离的加权平均值,加权的目的是为了使两个cluster
对距离的计算的影响在同一层次上,而不受cluster
大小的影响,具体公式和采用的权重方案有关。
二、数据聚类方法
数据聚类方法主要可以分为划分式聚类方法(Partition-based Methods)
、基于密度的聚类方法(Density-based methods)
、层次化聚类方法(Hierarchical Methods)
等。
2.1 划分式聚类方法
划分式聚类方法需要事先指定簇类的数目或者聚类中心,通过反复迭代,直至最后达到"簇内的点足够近,簇间的点足够远"的目标。经典的划分式聚类方法有k-means
及其变体k-means++
、bi-kmeans
、kernel k-means
等。
2.1.2 k-means算法
经典的k-means
算法的流程如下:
- 创建 k k k个点作为初始质心(通常是随机选择)
- 当任意一个点的簇分配结果发生改变时
- 对数据集中的每个数据点
- 对每个质心
- 计算质心与数据点之间的距离
- 将数据点分配到距其最近的簇
- 对每个簇,计算簇中所有点的均值并将均值作为质心
经典k-means
源代码,下左图是原始数据集,通过观察发现大致可以分为4类,所以取
k
=
4
k=4
k=4,测试数据效果如下右图所示。
看起来很顺利,但事情并非如此,我们考虑k-means
算法中最核心的部分,假设
x
i
(
i
=
1
,
2
,
…
,
n
)
x_i(i=1,2,…,n)
xi(i=1,2,…,n)是数据点,
μ
j
(
j
=
1
,
2
,
…
,
k
)
\mu_j(j=1,2,…,k)
μj(j=1,2,…,k)是初始化的数据中心,那么我们的目标函数可以写成
min
∑
i
=
1
n
min
j
=
1
,
2
,
.
.
.
,
k
∣
∣
x
i
−
μ
j
∣
∣
2
\min\sum_{i=1}^{n} \min \limits_{j=1,2,...,k}\left |\left | x_i -\mu_j\right | \right |^2
mini=1∑nj=1,2,...,kmin∣∣xi−μj∣∣2
这个函数是非凸优化函数,会收敛于局部最优解,可以参考证明过程。举个🌰,
μ
1
=
[
1
,
1
]
,
μ
2
=
[
−
1
,
−
1
]
\mu_1=\left [ 1,1\right ] ,\mu_2=\left [ -1,-1\right ]
μ1=[1,1],μ2=[−1,−1],则
z
=
min
j
=
1
,
2
∣
∣
x
i
−
μ
j
∣
∣
2
z=\min \limits_{j=1,2}\left |\left | x_i -\mu_j\right | \right |^2
z=j=1,2min∣∣xi−μj∣∣2
该函数的曲线如下图所示
可以发现该函数有两个局部最优点,当时初始质心点取值不同的时候,最终的聚类效果也不一样,接下来我们看一个具体的实例。
在这个例子当中,下方的数据应该归为一类,而上方的数据应该归为两类,这是由于初始质心点选取的不合理造成的误分。而 k k k值的选取对结果的影响也非常大,同样取上图中数据集,取 k = 2 , 3 , 4 k=2,3,4 k=2,3,4,可以得到下面的聚类结果:
一般来说,经典k-means
算法有以下几个特点:
- 需要提前确定 k k k值
- 对初始质心点敏感
- 对异常数据敏感
2.1.2 k-means++算法
k-means++
是针对k-means
中初始质心点选取的优化算法。该算法的流程和k-means
类似,改变的地方只有初始质心的选取,该部分的算法流程如下
- 随机选取一个数据点作为初始的聚类中心
- 当聚类中心数量小于 k k k
- 计算每个数据点与当前已有聚类中心的最短距离,用 D ( x ) D(x) D(x)表示,这个值越大,表示被选取为下一个聚类中心的概率越大,最后使用轮盘法选取下一个聚类中心
k-means++
源代码,使用k-means++
对上述数据做聚类处理,得到的结果如下
2.1.3 bi-kmeans算法
一种度量聚类效果的指标是SSE(Sum of Squared Error)
,他表示聚类后的簇离该簇的聚类中心的平方和,SSE
越小,表示聚类效果越好。 bi-kmeans
是针对kmeans
算法会陷入局部最优的缺陷进行的改进算法。该算法基于SSE最小化的原理,首先将所有的数据点视为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否能最大程度的降低SSE
的值。
该算法的流程如下:
- 将所有点视为一个簇
- 当簇的个数小于 k k k时
- 对每一个簇
- 计算总误差
- 在给定的簇上面进行
k-means
聚类( k = 2 k=2 k=2)- 计算将该簇一分为二之后的总误差
- 选取使得误差最小的那个簇进行划分操作
bi-kmeans
算法源代码,利用bi-kmeans
算法处理上节中的数据得到的结果如下图所示。
这是一个全局最优的方法,所以每次计算出来的SSE
值肯定也是一样的,我们和前面的k-means
、k-means++
比较一下计算出来的SSE
值
序号 | k-means | k-means++ | bi-kmeans |
---|---|---|---|
1 | 2112 | 120 | 106 |
2 | 388 | 125 | 106 |
3 | 824 | 127 | 106 |
agv | 1108 | 124 | 106 |
可以看到,k-means
每次计算出来的SSE
都较大且不太稳定,k-means++
计算出来的SSE
较稳定并且数值较小,而bi-kmeans
每次计算出来的SSE
都一样(因为是全局最优解)并且计算的SSE
都较小,说明聚类的效果也最好。
2.2 基于密度的方法
k-means
算法对于凸性数据具有良好的效果,能够根据距离来讲数据分为球状类的簇,但对于非凸形状的数据点,就无能为力了,当k-means
算法在环形数据的聚类时,我们看看会发生什么情况。
从上图可以看到,kmeans
聚类产生了错误的结果,这个时候就需要用到基于密度的聚类方法了,该方法需要定义两个参数
ε
\varepsilon
ε和
M
M
M,分别表示密度的邻域半径和邻域密度阈值。DBSCAN
就是其中的典型。
2.2.1 DBSCAN算法
首先介绍几个概念,考虑集合 X = { x ( 1 ) , x ( 2 ) , . . . , x ( n ) } X=\left \{x^{(1)},x^{(2)},...,x^{(n)}\right \} X={x(1),x(2),...,x(n)}, ε \varepsilon ε表示定义密度的邻域半径,设聚类的邻域密度阈值为 M M M,有以下定义:
- ε \varepsilon ε邻域( ε \varepsilon ε-neighborhood)
N ε ( x ) = { y ∈ X ∣ d ( x , y ) < ε } N_{\varepsilon }(x)=\left \{y\in X|d(x, y) < \varepsilon \right \} Nε(x)={y∈X∣d(x,y)<ε}
-
密度(desity)
x x x的密度为
ρ ( x ) = ∣ N ε ( x ) ∣ \rho (x)=\left | N_{\varepsilon }(x)\right | ρ(x)=∣Nε(x)∣ -
核心点(core-point)
设 x ∈ X x\in X x∈X,若 ρ ( x ) ≥ M \rho (x) \geq M ρ(x)≥M,则称 x x x为 X X X的核心点,记 X X X中所有核心点构成的集合为 X c X_c Xc,记所有非核心点构成的集合为 X n c X_{nc} Xnc。
- 边界点(border-point)
若
x
∈
X
n
c
x\in X_{nc}
x∈Xnc,且
∃
y
∈
X
\exists y\in X
∃y∈X,满足
y
∈
N
ε
(
x
)
∩
X
c
y\in N_{\varepsilon }(x) \cap X_c
y∈Nε(x)∩Xc
即
x
x
x的
ε
\varepsilon
ε邻域中存在核心点,则称
x
x
x为
X
X
X的边界点,记
X
X
X中所有的边界点构成的集合为
X
b
d
X_{bd}
Xbd。
此外,边界点也可以这么定义:若 x ∈ X n c x\in X_{nc} x∈Xnc,且 x x x落在某个核心点的 ε \varepsilon ε邻域内,则称 x x x为 X X X的一个边界点,一个边界点可能同时落入一个或多个核心点的 ε \varepsilon ε邻域。
- 噪声点(noise-point)
若
x
x
x满足
x
∈
X
,
x
∉
X
c
并
且
x
∉
X
b
d
x\in X,x \notin X_{c}并且 x \notin X_{bd}
x∈X,x∈/Xc并且x∈/Xbd
则称
x
x
x为噪声点。
如下图所示,设 M = 3 M=3 M=3,则A为核心点,B、C是边界点,而N是噪声点。
该算法的流程如下:
- 标记所有对象为unvisited
- 当有标记对象时
- 随机选取一个unvisited对象 p p p
- 标记 p p p为visited
- 如果 p p p的$\varepsilon 邻 域 内 至 少 有 邻域内至少有 邻域内至少有M$个对象,则
- 创建一个新的簇 C C C,并把 p p p放入 C C C中
- 设 N N N是 p p p的$\varepsilon 邻 域 内 的 集 合 , 对 邻域内的集合,对 邻域内的集合,对N 中 的 每 个 点 中的每个点 中的每个点p’$
- 如果点 p ′ p' p′是unvisited
- 标记 p ′ p' p′为visited
- 如果 p ′ p' p′的$\varepsilon 邻 域 至 少 有 邻域至少有 邻域至少有M 个 对 象 , 则 把 这 些 点 添 加 到 个对象,则把这些点添加到 个对象,则把这些点添加到N$
- 如果 p ′ p' p′还不是任何簇的成员,则把 p ′ p' p′添加到 C C C
- 输出 C C C
- 否则标记 p p p为噪声
构建
ε
\varepsilon
ε邻域的过程可以使用kd-tree
进行优化,循环过程可以使用Numba、Cython、C
进行优化,DBSCAN
的源代码,使用该节一开始提到的数据集,聚类效果如下
聚类的过程示意图
当设置不同的
ε
\varepsilon
ε时,会产生不同的结果,如下图所示
当设置不同的
M
M
M时,会产生不同的结果,如下图所示
一般来说,DBSCAN
算法有以下几个特点:
- 需要提前确定 ε \varepsilon ε和 M M M值
- 不需要提前设置聚类的个数
- 对初值选取敏感,对噪声不敏感
- 对密度不均的数据聚合效果不好
2.2.2 OPTICS算法
在DBSCAN
算法中,使用了统一的
ε
\varepsilon
ε值,当数据密度不均匀的时候,如果设置了较小的
ε
\varepsilon
ε值,则较稀疏的cluster
中的节点密度会小于
M
M
M,会被认为是边界点而不被用于进一步的扩展;如果设置了较大的
ε
\varepsilon
ε值,则密度较大且离的比较近的cluster
容易被划分为同一个cluster
,如下图所示。
- 如果设置的
ε
\varepsilon
ε较大,将会获得A,B,C这3个
cluster
- 如果设置的
ε
\varepsilon
ε较小,将会只获得C1、C2、C3这3个
cluster
对于密度不均的数据选取一个合适的 ε \varepsilon ε是很困难的,对于高维数据,由于维度灾难(Curse of dimensionality), ε \varepsilon ε的选取将变得更加困难。
怎样解决DBSCAN
遗留下的问题呢?
The basic idea to overcome these problems is to run an algorithm which produces a special order of the database with respect to its density-based clustering structure containing the information about every clustering level of the data set (up to a “generating distance” ε \varepsilon ε), and is very easy to analyze.
即能够提出一种算法,使得基于密度的聚类结构能够呈现出一种特殊的顺序,该顺序所对应的聚类结构包含了每个层级的聚类的信息,并且便于分析。
OPTICS(Ordering Points To Identify the Clustering Structure, OPTICS)
实际上是DBSCAN
算法的一种有效扩展,主要解决对输入参数敏感的问题。即选取有限个邻域参数
ε
i
(
0
≤
ε
i
≤
ε
)
\varepsilon _i( 0 \leq\varepsilon_{i} \leq \varepsilon)
εi(0≤εi≤ε) 进行聚类,这样就能得到不同邻域参数下的聚类结果。
在介绍OPTICS
算法之前,再扩展几个概念。
- 核心距离(core-distance)
样本
x
∈
X
x∈X
x∈X,对于给定的
ε
\varepsilon
ε和
M
M
M,使得
x
x
x成为核心点的最小邻域半径称为
x
x
x的核心距离,其数学表达如下
c
d
(
x
)
=
{
U
N
D
E
F
I
N
E
D
,
∣
N
ε
(
x
)
∣
<
M
d
(
x
,
N
ε
M
(
x
)
)
,
∣
N
ε
(
x
)
∣
⩾
M
cd(x)=\left\{\begin{matrix} UNDEFINED, \left | N_{\varepsilon }(x)\right |< M\\ d(x,N_{\varepsilon }^{M}(x)), \left | N_{\varepsilon }(x)\right | \geqslant M \end{matrix}\right.
cd(x)={UNDEFINED,∣Nε(x)∣<Md(x,NεM(x)),∣Nε(x)∣⩾M
其中, N ε i ( x ) N_{\varepsilon }^{i}(x) Nεi(x)表示在集合 N ε ( x ) N_{\varepsilon }(x) Nε(x)中与节点 x x x第 i i i近邻的节点,如 N ε 1 ( x ) N_{\varepsilon }^{1}(x) Nε1(x)表示 N ε ( x ) N_{\varepsilon }(x) Nε(x)中与 x x x最近的节点,如果 x x x为核心点,则必然会有 c d ( x ) ≤ ε cd(x) \leq\varepsilon cd(x)≤ε。
- 可达距离(reachability-distance)
设
x
,
y
∈
X
x,y∈X
x,y∈X,对于给定的参数
ε
和
\varepsilon和
ε和
M
M
M,
y
y
y关于
x
x
x的可达距离定义为
r
d
(
y
,
x
)
=
{
U
N
D
E
F
I
N
E
D
,
∣
N
ε
(
x
)
∣
<
M
max
{
c
d
(
x
)
,
d
(
x
,
y
)
}
,
∣
N
ε
(
x
)
∣
⩾
M
rd(y,x)=\left\{\begin{matrix} UNDEFINED, \left | N_{\varepsilon }(x)\right |< M\\ \max{\{cd(x),d(x,y)\}}, \left| N_{\varepsilon }(x)\right | \geqslant M \end{matrix}\right.
rd(y,x)={UNDEFINED,∣Nε(x)∣<Mmax{cd(x),d(x,y)},∣Nε(x)∣⩾M
特别地,当
x
x
x为核心点时,可以按照下式来理解
r
d
(
x
,
y
)
rd(x,y)
rd(x,y)的含义
r
d
(
x
,
y
)
=
min
{
η
:
y
∈
N
η
(
x
)
并
且
∣
N
η
(
x
)
∣
≥
M
}
rd(x,y)=\min\{\eta:y \in N_{\eta}(x) 并且 \left|N_{\eta}(x)\right| \geq M\}
rd(x,y)=min{η:y∈Nη(x)并且∣Nη(x)∣≥M}
即
r
d
(
x
,
y
)
rd(x,y)
rd(x,y)表示使得**“
x
x
x为核心点"且"
y
y
y从
x
x
x直接密度可达”**同时成立的最小邻域半径。
可达距离的意义在于衡量 y y y所在的密度,密度越大,他从相邻节点直接密度可达的距离越小,如果聚类时想要朝着数据尽量稠密的空间进行扩张,那么可达距离最小是最佳的选择。
举例,下图中假设 M = 3 M=3 M=3,半径是 ε ε ε。那么 P P P点的核心距离是 d ( 1 , P ) d(1,P) d(1,P),点2的可达距离是 d ( 1 , P ) d(1,P) d(1,P),点3的可达距离也是 d ( 1 , P ) d(1,P) d(1,P),点4的可达距离则是 d ( 4 , P ) d(4,P) d(4,P)的距离。
OPTICS
源代码,算法流程如下:
- 标记所有对象为unvisited,初始化order_list为空
- 当有标记对象时
- 随机选取一个unvisited对象 i i i
- 标记 i i i为visited,插入结果序列order_list中
- 如果 i i i的 ε \varepsilon ε邻域内至少有 M M M个对象,则
- 初始化seed_list种子列表
- 调用insert_list(),将邻域对象中未被访问的节点按照可达距离插入队列seeld_list中
- 当seed_list列表不为空
- 按照可达距离升序取出seed_list中第一个元素 j j j
- 标记 j j j为visited,插入结果序列order_list中
- 如果 j j j的 ε \varepsilon ε邻域内至少有 M M M个对象,则
- 调用insert_list(),将邻域对象中未被访问的节点按照可达距离插入队列seeld_list中
算法中有一个很重要的insert_list()函数,这个函数如下:
- 对 i i i中所有的邻域点 k k k
- 如果 k k k未被访问过
- 计算 r d ( k , i ) rd(k,i) rd(k,i)
- 如果 r k = U N D E F I N E D r_k=UNDEFINED rk=UNDEFINED
- r k = r d ( k , i ) r_k=rd(k,i) rk=rd(k,i)
- 将节点 k k k按照可达距离插入seed_list中
- 否则
- 如果 r d ( k , i ) < r k rd(k,i)<r_k rd(k,i)<rk
- 更新 r k r_k rk的值,并按照可达距离重新插入seed_list中
该算法最终获取知识是一个输出序列,该序列按照密度不同将相近密度的点聚合在一起,而不是输出该点所属的具体类别,如果要获取该点所属的类型,需要再设置一个参数 ε ′ ( ε ′ ≤ ε ) \varepsilon'(\varepsilon' \leq \varepsilon) ε′(ε′≤ε)提取出具体的类别。这里我们举一个例子就知道是怎么回事了。
随机生成三组密度不均的数据,我们使用DBSCAN
和OPTICS
来看一下效果。
OPTICS
算法输出序列的过程:
可见,OPTICS
第一步生成的输出序列较好的保留了各个不同密度的簇的特征,根据输出序列的可达距离图,再设定一个合理的
ε
′
\varepsilon'
ε′,便可以获得较好的聚类效果。
2.3 层次化聚类方法
前面介绍的几种算法确实可以在较小的复杂度内获取较好的结果,但是这几种算法却存在一个链式效应
的现象,比如:A与B相似,B与C相似,那么在聚类的时候便会将A、B、C聚合到一起,但是如果A与C不相似,就会造成聚类误差,严重的时候这个误差可以一直传递下去。为了降低链式效应
,这时候层次聚类就该发挥作用了。
层次聚类算法 (hierarchical clustering) 将数据集划分为一层一层的 clusters
,后面一层生成的 clusters
基于前面一层的结果。层次聚类算法一般分为两类:
- Agglomerative 层次聚类:又称自底向上(bottom-up)的层次聚类,每一个对象最开始都是一个
cluster
,每次按一定的准则将最相近的两个cluster
合并生成一个新的cluster
,如此往复,直至最终所有的对象都属于一个cluster
。这里主要关注此类算法。 - Divisive 层次聚类: 又称自顶向下(top-down)的层次聚类,最开始所有的对象均属于一个
cluster
,每次按一定的准则将某个cluster
划分为多个cluster
,如此往复,直至每个对象均是一个cluster
。
另外,需指出的是,层次聚类算法是一种贪心算法(greedy algorithm),因其每一次合并或划分都是基于某种局部最优的选择。
2.3.1 Agglomerative算法
给定数据集
X
=
{
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
n
)
}
X=\left \{x^{(1)},x^{(2)},...,x^{(n)}\right \}
X={x(1),x(2),...,x(n)},Agglomerative
层次聚类最简单的实现方法分为以下几步:
- 初始时每个样本为一个
cluster
,计算距离矩阵 D D D,其中元素 D i j D_{ij} Dij为样本点 D i D_i Di和 D j D_j Dj 之间的距离;- 遍历距离矩阵 D D D,找出其中的最小距离(对角线上的除外),并由此得到拥有最小距离的两个
cluster
的编号,将这两个cluster
合并为一个新的cluster
并依据cluster
距离度量方法更新距离矩阵 D D D(删除这两个cluster
对应的行和列,并把由新cluster
所算出来的距离向量插入 D D D中),存储本次合并的相关信息;- 重复 2 的过程,直至最终只剩下一个
cluster
。
Agglomerative
算法源代码,可以看到,该 算法的时间复杂度为
O
(
n
3
)
O(n^3)
O(n3) (由于每次合并两个 cluster
时都要遍历大小为
O
(
n
2
)
O(n^2)
O(n2)的距离矩阵来搜索最小距离,而这样的操作需要进行
n
−
1
n−1
n−1 次),空间复杂度为
O
(
n
2
)
O(n^2)
O(n2) (由于要存储距离矩阵)。
上图中分别使用了层次聚类中4个不同的cluster
度量方法,可以看到,使用single-link
确实会造成一定的链式效应,而使用complete-link
则完全不会产生这种现象,使用average-link
和ward-link
则介于两者之间。
2.4 聚类方法比较
算法类型 | 适合的数据类型 | 抗噪点性能 | 聚类形状 | 算法效率 |
---|---|---|---|---|
kmeans | 数值型 | 较差 | 球形 | 很高 |
k-means++ | 数值型 | 一般 | 球形 | 较高 |
bi-kmeans | 数值型 | 一般 | 球形 | 较高 |
DBSCAN | 数值型 | 较好 | 任意形状 | 一般 |
OPTICS | 数值型 | 较好 | 任意形状 | 一般 |
Ag glomerative | 混合型 | 较好 | 任意形状 | 较差 |
三、参考文献
[1] 李航.统计学习方法
[2] Peter Harrington.Machine Learning in Action/李锐.机器学习实战
[3] https://www.zhihu.com/question/34554321
[4] T. Soni Madhulatha.AN OVERVIEW ON CLUSTERING METHODS
[5] https://zhuanlan.zhihu.com/p/32375430
[6] http://heathcliff.me/聚类分析(一):层次聚类算法
[7] https://www.cnblogs.com/tiaozistudy/p/dbscan_algorithm.html
[8] https://blog.csdn.net/itplus/article/details/10089323
[9] Mihael Ankerst.OPTICS: ordering points to identify the clustering structure