9.1、聚类任务
聚类属于无监督学习任务,其训练样本的标记信息是未知的。聚类是试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个簇。需要注意的是,聚类仅仅是自动形成簇结构,而对于簇所对应的含义和概念需要人为定义。
具体来说,假定样本集为 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm}包含有 m m m个无标记的样本,每个样本 x i = ( x i 1 , x i 2 , . . . , x i n ) x_i=(x_{i1},x_{i2},...,x_{in}) xi=(xi1,xi2,...,xin)包含有 n n n个属性。则聚类算法是把样本集 D D D划分为 k k k个不相交的簇 { C l ∣ l = 1 , 2 , 3 , . . . , k } \{C_l \mid l=1,2,3,...,k \} {Cl∣l=1,2,3,...,k},不相交则代表 C l 1 ⋂ l 1 ≠ l 2 C l 2 = ∅ C_{l1}\bigcap_{l1\neq l2}C_{l2}=\emptyset Cl1⋂l1=l2Cl2=∅且 D = ⋃ l = 1 k C l D=\bigcup_{l=1}^k C_l D=⋃l=1kCl。划分完成之后则可以为每个簇加上簇标记,即用 λ j ∈ { 1 , 2 , . . . , k } \lambda_j \in \{1,2,...,k\} λj∈{1,2,...,k}来表示样本 x j x_j xj的簇标记(属于哪一个簇),即 x j ∈ C λ j x_j\in C_{\lambda_j} xj∈Cλj。
9.2、性能度量
与监督学习类似,在聚类中也需要有指标来衡量性能的好坏,同时有了度量的性能指标,还可以直接作为聚类过程要优化的目标,从而达到更好的聚类效果。
直观上来说,聚类所形成的的簇总希望能够满足同一簇的样本尽可能相似(距离更小),不同簇的样本尽可能不相似(距离更大),即可以量化出两个指标:簇内相似度和簇间相似度。
聚类的性能度量大致可以分为两大类,一类是具有一个参考模型,可直接将聚类生成的模型与参考模型进行相比,称为外部指标;另一类是直接考察聚类结构而不利用任何参考模型,称为内部指标。
1、外部指标
集合SS包含了在C中属于相同簇,在 C ∗ C^* C∗也属于相同簇的样本,其他也以此类推。由于每个样本对 ( x i , x j ) ( i < j ) (x_i,x_j)(i<j) (xi,xj)(i<j)仅能出现在一个集合中,因此则有 a + b + c + d = m ( m − 1 ) 2 a+b+c+d=\frac{m(m-1)}{2} a+b+c+d=2m(m−1) 成立。因此可导出以下指标:
- Jaccard系数(JC): J C = a a + b + c JC=\frac{a}{a+b+c} JC=a+b+ca
- FM指数: F M I = a a + b ⋅ a a + c FMI=\sqrt{\frac{a}{a+b}·\frac{a}{a+c}} FMI=a+ba⋅a+ca
- Rand指数: R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m−1)2(a+d)
显然,上述性能度量指标的结果均在[0,1]之间,且值越大代表聚类给出的模型与参考模型越接近,即效果越好。
2、内部指标
可导出如下指标:
显然,DBI的值越小代表越好,DI的值则越大越好
9.3、距离计算
在上文分析中距离的计算函数 d i s t ( ⋅ , ⋅ ) dist(·,·) dist(⋅,⋅),其满足以下条件:
- 非负性: d i s t ( x i , x j ) ≥ 0 dist(x_i,x_j)\geq 0 dist(xi,xj)≥0
- 同一性: d i s t ( x i , x j ) = 0 dist(x_i,x_j) = 0 dist(xi,xj)=0当且仅当 x i = x j x_i=x_j xi=xj
- 对称性: d i s t ( x i , x j ) = d i s t ( x j , x i ) dist(x_i,x_j)=dist(x_j,x_i) dist(xi,xj)=dist(xj,xi)
- 直递性: d i s t ( x i , x j ) ≤ d i s t ( x i , x k ) + d i s t ( x k , x j ) dist(x_i,x_j) \leq dist(x_i,x_k) + dist(x_k,x_j) dist(xi,xj)≤dist(xi,xk)+dist(xk,xj)
补充另一种情况:
- 当 p = ∞ p=\infty p=∞,则闵科夫斯基距离为 d i s t ( x i , x j ) = m a x l ∣ x i l − x j l ∣ dist(x_i,x_j)=max_l\lvert x_{il}-x_{jl} \rvert dist(xi,xj)=maxl∣xil−xjl∣,即各个属性距离的最大值。证明过程如下:
上述的距离计算中,还未考虑一些特殊的属性。因为在离散属性中可分为两种:
- 有序属性,例如取值只能为 { 1 , 2 , 3 } \{1,2,3\} {1,2,3}的属性,同样可以利用上述分析的距离计算公式计算
- 无序属性:若取值为 { 男学生、女学生 } \{男学生、女学生\} {男学生、女学生}的属性,便无法用上述分析的距离计算公式计算
那么对于无序属性可利用以下方法处理:
9.4、原型聚类
原型指的是样本空间中具有代表性的点,该点可以存在我们的数据集中也可以不存在,原型聚类就是假设聚类结构能够通过一组原型(一组点)来刻画,也就是用一组点来代表各个聚类所划分出来的类的中心。
9.4.1、k均值算法
k均值算法很容易理解,其算法流程如下:
用比较简单的文字描述为:
- 用户指定要划分为k个类,就先随机初始化k个点为初始聚类中心
- 计算每一个数据集的点到每一个聚类中心的距离,并将每一个样本点归类到最近的聚类中心所在的类
- 每个样本点都归类完成后重新计算每个类的聚类中心,即用每个类中的所有样本点求均值
- 再次计算每个样本点到每个聚类中心的距离,再将其归到最近的聚类中心所在的类中
- 重复上一步直到没有样本点的归属发生变化即可。
9.4.2、学习向量量化
这个算法与其他的聚类算法最大的不同在于,它需要数据集是带有类别标记的。其算法流程如下:
其关键在于对各个原型向量预设类别标记(人为设置),然后对每一个样本点,比较其的标记最近的原型向量的标记是否相同,来修正原型向量,如果相同的话,7的修正公式将使得新的原型向量更加接近于 x j x_j xj,反之则更加远离。
训练完毕后,对于新的数据点,只需要计算它与每一个原型向量的距离,选出最接近的那个原型向量,以其标记作为新数据点的标记即可。
9.4.3、高斯混合聚类
高斯混合聚类的最大特点在于其采用概率模型来表达聚类模型,也就是它对每一个样本属于哪一个类都计算出来一个概率,而样本的真正归属类就是最大概率的那一个
首先需要先了解多元高斯分布的定义,其概率密度函数为:
p
(
x
)
=
1
(
2
π
)
n
2
∣
Σ
∣
1
2
e
x
p
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
p(x)=\frac{1}{(2\pi )^{\frac{n}{2}} \lvert \Sigma \rvert^{\frac{1}{2}}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))
p(x)=(2π)2n∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
其中,
μ
\mu
μ为n维均值向量,
Σ
\Sigma
Σ为
n
×
n
n\times n
n×n的协方差矩阵,因此高斯分布完全由这两个参数确定,就可以写成
p
(
x
∣
μ
,
Σ
)
p(x\mid \mu,\Sigma)
p(x∣μ,Σ)。
因此,对于高斯混合分布的定义为:
p
M
(
x
)
=
∑
i
=
1
k
α
i
⋅
p
(
x
∣
μ
i
,
Σ
i
)
∑
i
=
1
k
α
i
=
1
p_M(x)=\sum_{i=1}^{k}\alpha _i·p(x\mid \mu_i,\Sigma_i)\\\sum_{i=1}^{k}\alpha_i=1
pM(x)=i=1∑kαi⋅p(x∣μi,Σi)i=1∑kαi=1
高斯混合聚类的关键思想在于我们假定数据集的生成过程是由高斯混合分布给出的,即已知了高斯混合分布的各个参数及权重系数,首先根据
α
1
,
.
.
.
,
α
k
\alpha_1,...,\alpha_k
α1,...,αk定义的先验分布(也就是各个高斯分布出现的可能概率)选择高斯混合成分(也就是选择哪一个高斯分布),然后根据选择的高斯分布的概率函数(例如选择到
p
(
x
∣
μ
i
,
Σ
i
)
p(x\mid \mu_i,\Sigma_i)
p(x∣μi,Σi))来进行采样得到一个样本。那么上述过程循环
m
m
m次,就得到我们的数据集
D
D
D了。
但现在的情况是我们拥有数据集
D
D
D,而不知道生成数据集
D
D
D的高斯混合分布的具体各个参数,那么可以转换一下思路,假设每一个观测变量
x
i
x_i
xi(也就是样本)都有一个对应的隐变量
z
i
z_i
zi,这个
z
i
z_i
zi的取值范围为
z
i
∈
{
1
,
2
,
3
,
.
.
.
k
}
z_i\in\{1,2,3,...k\}
zi∈{1,2,3,...k},代表观测变量
x
i
x_i
xi是由哪一个高斯混合成分生成的,那么也就是说,
z
i
z_i
zi的先验概率
P
(
z
i
=
j
)
P(z_i=j)
P(zi=j)对应于
α
j
\alpha_j
αj,但是并不知道这先验概率的值,因此需要用后验概率来替代先验概率,后验概率的计算公式如下:
p
M
(
z
j
=
i
∣
x
j
)
=
P
(
z
j
=
i
)
⋅
p
M
(
x
j
∣
z
j
=
i
)
p
M
(
x
j
)
=
α
i
⋅
p
(
x
j
∣
μ
i
,
Σ
i
)
∑
l
=
1
k
α
l
⋅
p
(
x
j
∣
μ
l
,
Σ
l
)
p_M(z_j=i \mid x_j)=\frac{P(z_j=i)·p_M(x_j\mid z_j=i)}{p_M(x_j)}\\=\frac{\alpha_i·p(x_j\mid\mu_i,\Sigma_i)}{\sum_{l=1}^{k}\alpha_l·p(x_j \mid \mu_l,\Sigma_l)}
pM(zj=i∣xj)=pM(xj)P(zj=i)⋅pM(xj∣zj=i)=∑l=1kαl⋅p(xj∣μl,Σl)αi⋅p(xj∣μi,Σi)
那么,如果我们可以学习得到各个高斯混合模型的参数,那么就可以求得到
x
j
x_j
xj样本对应的
z
j
z_j
zj隐变量属于每一个高斯分布的概率(也就是
x
j
x_j
xj样本是由每一个高斯分布生成的概率),它属于概率最大的那个高斯分布生成的,它的簇标记也就是对应高斯分布的簇标记。
另外,当高斯分布已知时,高斯混合聚类将样本集
D
D
D划分为k个簇
C
=
{
C
1
,
C
2
,
.
.
.
C
k
}
C=\{C_1,C_2,...C_k\}
C={C1,C2,...Ck},每个样本
x
j
x_j
xj的簇标记为:
λ
j
=
a
r
g
m
a
x
i
∈
{
1
,
2
,
.
.
.
k
}
p
M
(
z
j
=
i
∣
x
j
)
=
a
r
g
m
a
x
i
∈
{
1
,
2
,
.
.
.
k
}
γ
j
i
\lambda_j={argmax}_{i\in\{1,2,...k\}}p_M(z_j=i\mid x_j)\\={argmax}_{i\in\{1,2,...k\}}\gamma_{ji}
λj=argmaxi∈{1,2,...k}pM(zj=i∣xj)=argmaxi∈{1,2,...k}γji
那么下面的问题就是如何求解对应参数,实际做法是运用EM算法来求解的,具体的求解公式为:
μ
i
=
∑
j
=
1
m
γ
j
i
x
j
∑
j
=
1
m
γ
j
i
Σ
i
=
∑
j
=
1
m
γ
j
i
(
x
j
−
μ
i
)
(
x
j
−
μ
i
)
T
∑
j
=
1
m
γ
j
i
α
i
=
1
m
∑
j
=
1
m
γ
j
i
\mu_i=\frac{\sum_{j=1}^{m}\gamma_{ji}x_j}{\sum_{j=1}^{m}\gamma_{ji}}\\\Sigma_i=\frac{\sum_{j=1}^m \gamma_{ji}(x_j - \mu_i)(x_j-\mu_i)^T}{\sum_{j=1}^m \gamma_{ji}}\\\alpha_i=\frac{1}{m}\sum_{j=1}^m \gamma_{ji}
μi=∑j=1mγji∑j=1mγjixjΣi=∑j=1mγji∑j=1mγji(xj−μi)(xj−μi)Tαi=m1j=1∑mγji
高斯混合聚类算法的具体算法描述如下:
9.5、密度聚类(DBSCAN)
密度聚类算法相对比较简单,书本讲解得非常细致,具体如下:
DBSCAN算法的流程优点像广度优先搜索,就是从起始点出发遍历其邻域中的点,然后再从其邻域点出发继续遍历邻域点的邻域点。
9.6、层次聚类
层次聚类的思想是自底向上的聚合策略,简单来说就是选择一个度量距离的方法,然后初始化将每一个样本点看成单独一个簇,计算两两簇之间的距离,将距离最小的两个簇合并成新簇,再计算两两距离,再合并距离最小的两簇,以此类推直到簇满足数目要求。其中主要有三种度量簇之间距离的方式:
具体算法描述如下: