概述
机器学习里面的聚类是无监督的学习问题,它的目标是为了感知样本间的相似度进行类别归纳。它可以用于潜在类别的预测以及数据压缩上去。潜在类别预测,比如说可以基于通过某些常听的音乐而将用户进行不同的分类。数据压缩则是指将样本进行归类后,就可以用比较少的的One-hot向量来代替原来的特别长的向量。
聚类,既可以作为一个单独的过程,也可以作为其他机器学习任务的预处理模块。
其实,在深度学习里面就十分流行这种先给样本聚类 压缩数据,然后把在压缩后的特征向量丢到网络去训练,这其实就是深度学习里面的“表示学习”的最初想法。基于这类的深度学习模型如 受限的玻尔兹曼机等。
当然,本章我们介绍的都是传统机器学习使用的聚类方法。
聚类算法的种类
聚类算法主要有:
- 序贯法
- 层次分析法
- 基于损失函数最优化的:K-means,概率聚类
- 基于密度的聚类
- 其他特殊聚类方法:基因聚类算法,分治限界聚类算法;子空间聚类算法;基于核的聚类方法。
聚类问题的表述
给定一个包含
N
N
N个样本的样本集
X
=
{
x
1
,
x
2
,
…
,
x
M
}
X=\{x_{1},x_{2},\dots,x_{M}\}
X={x1,x2,…,xM},要给对这这N个样本给定一个划分方式,将这些样本划分为m类
C
1
,
C
2
,
C
3
,
…
,
C
m
C_{1},C_{2},C_{3},\dots,C_{m}
C1,C2,C3,…,Cm,使得满足:
虽然 聚类看起来是很棒的,可以进行“物以类分,人以类聚”,但是聚类确守很多方面的影响。
例如:
1.属性选择不同,导致不同的结果
2.相似度度量不同,导致不同的结果
3.聚类的方法不同,导致不同的结果
更要命的是,聚类其实没有啥好的评判标准的,尤其是对于那些本来就没有正确结果的数据来说。这是为什么呢? 因为就算是人给样本聚类,也是基于某个方面的聚类,而机器学习得到的聚类可能是基于另外一种角度来聚类,咋一眼看上去 机器聚类的结果很差,其实很有可能是它关注了某个人类不去关注的方面。例如说把左边的图形进行聚类:
人类可能给出,右边第一种聚类是正确的聚类,那是因为人类关注的是形状。可是机器给出的第二类,第三类 也是合理的,并不能一棒子打死。
相似度度量
既然,聚类是为了感知样本间的相似度,把相似的样本聚类在一起,那么我们首先就得定义好样本之间的相似度。
注意,这里的样本相似度其实就是指样本和样本之间的距离,而样本是以特征向量的形式给出的,所以其实我们是需要定义样本特征向量之间的距离、样本与类别之间的距离、类别与类别之间的距离、类别内部的距离。
样本与样本之间的距离
给定两个样本的特征向量: x , y ∈ R n x,y \in R^{n} x,y∈Rn,常用的样本间的距离有:
- p范数: d p ( x , y ) = ( ∑ i = 1 n w i ∣ x i − y i ∣ p ) 1 p d_{p}(x,y)=(\sum_{i=1}^{n}w_{i}|x_{i}-y_{i}|^{p})^{\frac{1}{p}} dp(x,y)=(∑i=1nwi∣xi−yi∣p)p1
- cos范数: s ( x , y ) = x T y ∣ ∣ x ∣ ∣ ∣ ∣ y ∣ ∣ s(x,y)=\frac{x^{T}y}{||x||||y||} s(x,y)=∣∣x∣∣∣∣y∣∣xTy
- 皮特逊范数:
r
(
x
,
y
)
=
x
d
T
y
d
∣
∣
x
d
∣
∣
∣
∣
y
d
∣
∣
r(x,y)=\frac{x^{T}_{d}y_{d}}{||x_{d}||||y_{d}||}
r(x,y)=∣∣xd∣∣∣∣yd∣∣xdTyd,其中
x
d
,
y
d
x_{d},y_{d}
xd,yd都是各个元素减去它们的均值。
例如: x d = ( x 1 − μ 1 , x 2 − μ 1 , … , x n − μ 1 ) x_{d}=(x_{1}-\mu_{1},x2-\mu_{1},\dots,x_{n}-\mu_{1}) xd=(x1−μ1,x2−μ1,…,xn−μ1),其中 μ 1 = ∑ i = 1 n x i n \mu_{1}=\frac{\sum^{n}_{i=1}x_{i}}{n} μ1=n∑i=1nxi
这个范数的主要作用是可以减少因为x,y错位而导致的相似度变化过大的问题。
样本到类别之间的距离
样本到类别之间的距离,其实就是样本到集合的距离。
一般当集合为离散点集的时候:
样本到类别之间的距离可以定义为:
- 到集合最远点的距离 d ( x , C ) = m a x y ∈ C d ( x , y ) d(x,C)=max_{y \in C} d(x,y) d(x,C)=maxy∈Cd(x,y)
- 到集合最近点的距离 d ( x , C ) = m i n y ∈ C d ( x , y ) d(x,C)=min_{y \in C} d(x,y) d(x,C)=miny∈Cd(x,y)
- 到集合平均点的距离
d
(
x
,
C
)
=
1
∣
C
∣
∑
y
∈
C
d
(
x
,
y
)
d(x,C)=\frac{1}{|C|}\sum_{y \in C}d(x,y)
d(x,C)=∣C∣1∑y∈Cd(x,y)
当集合为连续区域的时候,也可以定义类似的最近距离以及平均距离,但是一般不定义最远距离,除非区域是封闭的,否则最远距离无意义。
类别之间的距离
类别之间的距离,就是集合到集合的距离,衡量一个集合到另外一个集合的距离程度。
一般有如下定义:
- 集合间最远点距离: d m a x ( C i , C j ) = m a x 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 m i n ( C i , C j ) = m i n 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 a v g ( C i , C j ) = s u m x ∈ C i , y ∈ C j d ( x , y ) ∣ ∣ C i ∣ ∣ ∣ C j ∣ ∣ d_{avg}(C_{i},C_{j})=\frac{sum_{x \in C_{i},y \in C_{j}} d(x,y)}{||C_{i}|||C_{j}||} davg(Ci,Cj)=∣∣Ci∣∣∣Cj∣∣sumx∈Ci,y∈Cjd(x,y)
- 表征点距离: d c e n ( C i , C j ) = d ( u C i , u C j ) d_{cen}(C_{i},C_{j})=d(u_{C_{i}},u_{C_{j}}) dcen(Ci,Cj)=d(uCi,uCj).其中的 u u u表示各类的表征点,可以是类的平均点。
类内距离
这个距离,主要是衡量一个类别内的样本的离散程度。一般有如下定义:
类内的平均距离:所有样本点之间的距离的和的平均
a
v
g
(
C
)
=
2
∣
∣
C
∣
∣
(
∣
∣
C
∣
∣
−
1
)
∑
1
<
=
i
<
=
j
<
=
∣
C
∣
d
(
x
i
,
x
j
)
avg(C)=\frac{2}{||C|| (||C||-1)} \sum_{1<=i<=j<=|C|} d(x_{i},x_{j})
avg(C)=∣∣C∣∣(∣∣C∣∣−1)2∑1<=i<=j<=∣C∣d(xi,xj),其实就是遍历所有的组合,共
C
∣
∣
C
∣
∣
2
C^{2}_{||C||}
C∣∣C∣∣2种组合,然后计算各个组合下的距离,求和再求平均。
类别最大样本距离:所有样本点之间距离的最大值
d
i
a
m
(
C
)
=
m
a
x
1
<
=
i
<
=
j
<
=
∣
∣
C
∣
∣
d
(
x
i
,
y
j
)
diam(C)=max_{1<=i<=j<=||C||} d(x_{i},y_{j})
diam(C)=max1<=i<=j<=∣∣C∣∣d(xi,yj)
性能度量
有了聚类算法后,我们要度量一下聚类的效果。
注意,这里的指标只是一些经验之谈。
性能的外部指标
外部指标是指,聚类的标准答案已知的情况下,聚类效果的指标。
此时,标准答案会给出各个样本所属的类别。
那我们如何衡量聚类的效果呢? 这种指标当然需要是与聚类标签语义无关的,重点关注相类似的样本是否聚集到一类,而不是聚集到哪一类。
显行的方法是样本两两组合,观察这两个预测是不是一类,标准答案是不是同一类。
这个a就是,标准答案说x,y是同一类,而聚类结果也给出x,y是同一类的这种事件的数量。
b就是标准答案说x,y不是同一类,而聚类结果偏说x,y是同一类的这种事件的数量。
d就是标准答案说x,y不是同一类,而聚类结果也是说x,y不是同一类。
显然,好的聚类效果是a很大,d很大;而b,c很小。
基于这种统计,有以下几类指标:
聚类性能内部指标
内部指标无关是否有标注标准答案,主要从结果的统计特征评价聚类的性能。
这种内部指标都是认为 类内数据越聚集,类与类之间越分散的聚类效果越好!
DBI指数是指把最大的 a v g ( C i ) + a v g ( C j ) d c e n ( u i , u j ) \frac{avg(C_{i})+avg(C_{j})}{d_{cen}(u_{i},u_{j})} dcen(ui,uj)avg(Ci)+avg(Cj) 当做这个聚类的效果,之所以选最大的这个指标是因为聚类需要考虑聚类出来的所有类别,如果所有类别里面最大的 a v g ( C i ) + a v g ( C j ) d c e n ( u i , u j ) \frac{avg(C_{i})+avg(C_{j})}{d_{cen}(u_{i},u_{j})} dcen(ui,uj)avg(Ci)+avg(Cj) 都特别小了,那么其他类别间的这个指标就更好了。
序贯方法
序贯方法简单的一匹。
序贯方法就是逐一的比较单个样本与类的相似性,相似就把样本归类,不相似就另外建立一个类。
缺点:
严重依赖于样本的顺序;先出现的样本会优先被当做类心。
改进方法:先遍历,确定类别,然后再遍历一般进行分类。
缺点:严重依赖阈值的选择。
改进方法:采用双阈值,弱化某个阈值的作用。
核心思想其实很简单:当样本与类之间的距离小于
θ
1
\theta_{1}
θ1则将样本归类;如果这个距离大于
θ
2
\theta_{2}
θ2则将样本另起一类;否则留待下次分类。
然后在处理最初类的建立,以及“顽固样本的处理”。注意随着算法的运行,当新的样本加入后类心是会变化的,所以处于灰色带的样本有可能被纳入正确的类别中。
这三种方法都是当类别一旦产生就不可变,而且相近的类别间也不能合并。于是有人提出可以在后期合并以及改变样本所属类别的改进方法。
其实这种增强方法 就是K-means里面使用到的方法。
层次聚类方法
层次聚类方法,以不同的层次来逐步对样本进行聚类。
存在归并和分化两种方法。
归并算法里面一开始让所有的样本自成一类;然后在每一次的迭代中,合并两种最为相似的类,删除被合并的类;直到达到聚类数,或者全部样本聚集成一类。
可以使用表格记录中间结果,防止重复计算。
分化的话,就是一开始假设所有样本都是属于同一类的,然后选择一个划分点,将样本以最不相似的方法划分开来。
K-means聚类
这个方法太多经典,简单好用。很多算法集成包也是直接提供K-means的聚类方法。
K-means是基于损失函数最小化的思想的,K-means的损失函数定义为:
既然要最小化这个东西,那么只要把各个样本归到离自己最近的那个类别就是啦。
改进后的K-means是每个样本都更新一次类心,它的好处是可以使用目标函数得到收敛。每次它选择那个使得目标函数更小的类别来归类。
注意这里的
p
j
p_{j}
pj,上面是指将样本i从原来的类别挪到第j个类别给第j个类别增加的方差。
而下面那个是样本从原来的类别中挪出来,减少的方差。
既然要让目标函数最小,那么每一步的决策自然是使得移出的方差的减少量 大于 移入另外一个类别的方差的增加量。如果找不到这么一个类别,那就不移动。这种策略保证,误差不会增加。