前言
聚类就是对大量未标注的数据集,按照数据的内在相似性将数据划分为多个类别,使得类别内的数据相似度较大,而类间相似度较小。
1 几种聚类常用距离
- 欧式距离:
d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p \mathrm{dist(}X,Y)=\left( \sum_{i=1}^n{\left| x_i-y_i \right|^p} \right) ^{\frac{1}{p}} dist(X,Y)=(i=1∑n∣xi−yi∣p)p1
一般的情况用欧式距离。 - Jaccard相似系数:
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{|A\cap B|}{|A\cup B|} J(A,B)=∣A∪B∣∣A∩B∣
涉及到集合情况用这个。 - 余弦相似度
cos ( θ ) = a T b ∣ a ∣ ⋅ ∣ b ∣ \cos\mathrm{(}\theta )=\frac{a^Tb}{|a|\cdot |b|} cos(θ)=∣a∣⋅∣b∣aTb
词嵌入的时候欧式距离并不合适,而是夹角余弦值比较合适,文档之间也可以。 - Pearson相似系数
ρ X x = c o v ( X , Y ) σ X σ Y = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y = ∑ i = 1 n ( X i − μ X ) ( Y i − μ Y ) ∑ i = 1 n ( X i − μ X ) 2 ∑ i = 1 n ( Y i − μ P ) 2 \rho _{Xx}=\frac{\mathrm{cov(}X,Y)}{\sigma _X\sigma _Y}=\frac{E\left[ \left( X-\mu _X \right) \left( Y-\mu _Y \right) \right]}{\sigma _X\sigma _Y}=\frac{\sum_{i=1}^n{\left( X_i-\mu _X \right)}\left( Y_i-\mu _{\mathrm{Y}} \right)}{\sqrt{\sum_{i=1}^n{\left( X_i-\mu _X \right) ^2}}\sqrt{\sum_{i=1}^n{\left( Y_i-\mu _{\mathrm{P}} \right) ^2}}} ρXx=σXσYcov(X,Y)=σXσYE[(X−μX)(Y−μY)]=∑i=1n(Xi−μX)2∑i=1n(Yi−μP)2∑i=1n(Xi−μX)(Yi−μY) - 相对熵
D ( p ∣ q ) = ∑ x p ( x ) log p ( x ) q ( x ) = E p ( x ) log p ( x ) q ( x ) D(p|q)=\sum_x{p}(x)\log \frac{p(x)}{q(x)}=E_{p(x)}\log \frac{p(x)}{q(x)} D(p∣q)=x∑p(x)logq(x)p(x)=Ep(x)logq(x)p(x)
4和5都是可以度量函数之间的相似性。 - Hellinger距离:
D α ( p ∣ q ) = 2 1 − α 2 ( 1 − ∫ p ( x ) 1 + α 2 q ( x ) 1 − α 2 d x ) \quad D_{\alpha}(p|q)=\frac{2}{1-\alpha ^2}\left( 1-\int{p}(x)^{\frac{1+\alpha}{2}}q(x)^{\frac{1-\alpha}{2}}dx \right) Dα(p∣q)=1−α22(1−∫p(x)21+αq(x)21−αdx)
2 K-means算法
基本思想:对于给定的类别数目k,首先给出初始划分,通过迭代改变样本和簇的隶属关系,使得每一次改进后的划分方案都比前一次的好。
给定无标签的输入样本 S = x 1 , x 2 , . . . , x m \mathrm{S}=\mathrm{x}_1,\mathrm{x}_2,...,\mathrm{x}_{\mathrm{m}} S=x1,x2,...,xm,选择初始K个类别的类中心 μ 1 μ 2 . . . μ k \mu _1\mu _2...\mu _{\mathrm{k}} μ1μ2...μk。
将其他样本标记为距离类中心最近的类别:
l
a
b
e
l
i
=
a
r
g
min
1
≤
j
≤
k
∥
x
i
−
μ
j
∥
\,\,\mathrm{label} _i=\underset{1\le j\le k}{\mathrm{arg}\min}\left\| x_i-\mu _j \right\|
labeli=1≤j≤kargmin∥xi−μj∥
其中这个距离可以使用其他的距离,以平方误差为例子:
l
a
b
e
l
i
=
a
r
g
min
1
≤
j
≤
k
J
(
μ
1
,
μ
2
,
⋯
μ
k
)
=
a
r
g
min
1
≤
j
≤
k
1
2
∑
j
=
1
K
∑
i
=
1
N
j
(
x
i
−
μ
j
)
2
\,\,\mathrm{label}_i=\underset{1\le j\le k}{\mathrm{arg} \min}\,\,J\left( \mu _1,\mu _2,\cdots \mu _k \right) =\underset{1\le j\le k}{\mathrm{arg} \min}\frac{1}{2}\sum_{j=1}^K{\sum_{i=1}^{N_j}{\left( x_i-\mu _j \right) ^2}}
labeli=1≤j≤kargminJ(μ1,μ2,⋯μk)=1≤j≤kargmin21j=1∑Ki=1∑Nj(xi−μj)2
再将每个类中心更新为该类别所属样本的均值:
μ
j
=
1
∣
c
j
∣
∑
i
∈
c
j
x
i
\mu _j=\frac{1}{\left| c_j \right|}\sum_{i\in c_j}{x_i}
μj=∣cj∣1i∈cj∑xi
重复以上最后两步,直到小于某个阈值,中止条件可以是迭代次数/类中心变化率/MSE(Minimum Squared Error)。下图可以展示算法的一个变化过程:
但是如果数据中出现个别极端样本,那么以均值为类中心就不够合适,修改为中位数更妥当,这种方式即K-mediods聚类(K中值聚类)。
3 初值选择
K-means算法对初始值的选择是敏感的,不然很有可能落到局部最优解上。
希望样本在初始化的时候就远一些,先随机选一个,然后再计算其他样本到这个初始值的距离,希望选择一个距离比较大的样本选为第二个。将距离除以总距离和,分配概率p。随机100次,按照概率大小来选择,并不是总是选概率最高的。
类别数K作为一个超参数也可以进行选择,例如手肘法:
当损失函数值下降到一个拐点的时候停止,就选择拐点的K值。
4 聚类的衡量指标
相当于从已有的分类中任意选两个,属于同样一个类别的概率可能性有多大。
5 结果分析
对于方差接近的混合高斯数据有好的效果:
但数据不是高斯分布的情况就很差: