无监督学习(unsupervised learning) 是利用无标记训练样本的学习来揭示数据的内部性质以及规律。其中聚类(clustering)是其中重要的一类。
聚类是将数据按照一定原则划分为若干个不相交的子集(簇,cluster)。
k均值(k-means)算法的假设是距离相近的两样本在分类上也是相类似的。因为该算法比较简单,直接放伪代码:
输入:样本集 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm};
聚类簇数 k k k.
过程:
从 D D D中随机选择 k k k个样本作为初始均值向量 { μ 1 , μ 2 , . . . μ k } \{\mu_1,\mu_2,...\mu_k\} {μ1,μ2,...μk}
repeat
令 C i = ϕ ( 1 ≤ i ≤ k ) C_i = \phi(1 \leq i \leq k) Ci=ϕ(1≤i≤k)
// 划分样本至相应簇
for j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m do
计算样本 x j x_j xj和各均值向量 μ i ( 1 ≤ i ≤ k ) \mu_i(1 \leq i \leq k) μi(1≤i≤k)之间的距离: d j i = ∣ ∣ x j − μ i ∣ ∣ 2 d_{ji} = || x_j -\mu_i||_2 dji=∣∣xj−μi∣∣2;
根据距离最近的均值向量确定 x j x_j xj的簇标记: λ j = a r g m i n i ∈ ( 1 , 2 , . . . , k ) d j i \lambda_j =arg min_{i \in (1,2,...,k)} d_{ji} λj=argmini∈(1,2,...,k)dji;
将样本 x j x_j xj划入相应的簇: C λ j ∪ { x j } C_{\lambda_j}\cup\{x_j\} Cλj∪{xj};
end for
// 根据簇更新均值向量
for i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k do
计算新的均值向量 μ i ′ = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i'=\frac{1}{|C_i|}\sum_{x \in C_i}x μi′=∣Ci∣1∑x∈Cix;
if μ i ′ ≠ μ i \mu_i' \neq \mu_i μi′=μi then
将当前 μ i \mu_i μi更新为 μ i ′ \mu_i' μi′;
else
保持当前均值向量不变
end if
end for
until 当前均值向量均未更新或者满足设定的条件
输出:簇划分 C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1,C2,...,Ck}
学习向量量化(Learning Vector Quantization,LVQ)和k均值算法相似在于二者都假设样本间距离越近分类相同可能性越大,不同在于LVQ假设数据样本带有类别标记,这也意味着LVQ会利用样本的监督信息辅助聚类实现。
伪代码见下:
输入:样本集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)};
原型向量个数 q q q,各个原型向量预设的类别标记 { t 1 , t 2 , . . . , t q } \{ t_1,t_2,...,t_q\} {t1,t2,...,tq};
学习率 η ∈ ( 0 , 1 ) \eta \in(0,1) η∈(0,1).
过程:
初始化一组原型向量 { p 1 , p 2 , . . . p q } \{p_1,p_2,...p_q\} {p1,p2,...pq}
repeat
从样本集 D D D中随机选取样本 ( x i , y j ) (x_i,y_j) (xi,yj);
计算样本 x j x_j xj与 p i ( 1 ≤ i ≤ q ) p_i (1 \leq i \leq q) pi(1≤i≤q)的距离: d j i = ∣ ∣ x j − p i ∣ ∣ 2 d_{ji}=||x_j-p_i||_2 dji=∣∣xj−pi∣∣2
找出与 x j x_j xj距离最近的原型向量: p i ∗ , i ∗ = a r g m i n i ∈ { 1 , 2 , . . . , q } d j i p_{i^*},i^*=arg min_{i \in \{ 1,2,...,q\}}d_{ji} pi∗,i∗=argmini∈{1,2,...,q}dji
if y j = t i ∗ y_j=t_{i^*} yj=ti∗ then
p ′ = p i ∗ + η ⋅ ( x j − p i ∗ ) p' =p_{i^*}+\eta \cdot (x_j-p_{i^*}) p′=pi∗+η⋅(xj−pi∗);
else
p ′ = p i ∗ − η ⋅ ( x j − p i ∗ ) p' =p_{i^*}-\eta \cdot (x_j-p_{i^*}) p′=pi∗−η⋅(xj−pi∗);
end if
将原型向量更新 p i ∗ p_{i^*} pi∗为 p ′ p' p′
until满足停止条件
令 R i = ϕ ( 1 ≤ i ≤ q ) R_i = \phi (1 \leq i \leq q) Ri=ϕ(1≤i≤q)
for j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m do
计算样本 x j x_j xj与 p i ( 1 ≤ i ≤ k ) p_i (1 \leq i \leq k) pi(1≤i≤k)的距离: d j i = ∣ ∣ x j − p i ∣ ∣ 2 d_{ji}=||x_j-p_i||_2 dji=∣∣xj−pi∣∣2
找出与 x j x_j xj距离最近的原型向量: p i ∗ , i ∗ = a r g m i n i ∈ { 1 , 2 , . . . , q } d j i p_{i^*},i^*=arg min_{i \in \{ 1,2,...,q\}}d_{ji} pi∗,i∗=argmini∈{1,2,...,q}dji
将样本 x j x_j xj划入相应的簇 R t i ∗ = R t i ∗ ∪ { x j } R_{t_{i^*}}=R_{t_{i^*}}\cup\{x_j\} Rti∗=Rti∗∪{xj}
end for
输出:簇划分 R = { R 1 , R 2 , . . . , R q } R=\{R_1,R_2,...,R_q\} R={R1,R2,...,Rq}
对比k均值和LVQ伪代码可以发现:k均值因为样本自身没有标签,故需要利用原型向量不断对于样本进行划分;而LVQ在训练中利用样本标签不断迭代原型向量,到训练完成后才需要对样本进行划分。
高斯混合(Mixture-of-Gaussian)与k均值、LVQ不同在于其是利用概率模型作为聚类的原型。
定义高斯混合分布
p M ( x ) = ∑ i = 1 k α i ⋅ p ( x ∣ μ i , Σ i ) (1) p_M(x)=\sum_{i=1}^k \alpha_i \cdot p(x|\mu_i,\Sigma_i) \tag1 pM(x)=i=1∑kαi⋅p(x∣μi,Σi)(1)
该分布是由 k k k个混合成分组成,每个混合成分对应一个高斯分布,即为 p ( ⋅ ) p(\cdot) p(⋅),其中 μ i , Σ i \mu_i,\Sigma_i μi,Σi为相应的参数。而 α i > 0 \alpha_i>0 αi>0为相应的混合系数(mixture coefficient),书中解释 α i \alpha_i αi为第 i i i个混合成分的概率, ∑ i = 1 k α i = 1 \sum_{i=1}^k \alpha_i = 1 ∑i=1kαi=1.
设 z j ∈ { 1 , 2 , . . . , k } z_j \in \{ 1,2,...,k\} zj∈{1,2,...,k}表示样本 x j x_j xj在高斯混合的输出,则有 α i = p ( z j = i ) \alpha_i =p(z_j = i) αi=p(zj=i),根据贝叶斯定理有:
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 ) p M ( x j ) (2) p_M(z_j=i|x_j) = \frac{p(z_j=i)\cdot p_M(x_j|z_j=i)}{p_M(x_j)}= \frac{\alpha_i \cdot p(x_j|\mu_i,\Sigma_i)}{p_M(x_j)} \tag2 pM(zj=i∣xj)=pM(xj)p(zj=i)⋅pM(xj∣zj=i)=pM(xj)αi⋅p(xj∣μi,Σi)(2)
将 p M ( z j = i ∣ x j ) p_M(z_j=i|x_j) pM(zj=i∣xj)记为 γ j i ( i = 1 , 2 , . . . , k ) \gamma_{ji}(i=1,2,...,k) γji(i=1,2,...,k),设高斯混合分布将样本集 D D D划分为 k k 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 \lambda_j λj为:
λ j = a r g m a x i ∈ { 1 , 2 , . . . , k } γ j i (3) \lambda_j = arg max_{i \in \{1,2,...,k\}}\gamma_{ji} \tag{3} λj=argmaxi∈{1,2,...,k}γji(3)
对于(1),可采用极大似然估计来求解其中的参数 α i \alpha_i αi、 μ i \mu_i μi和 Σ i \Sigma_i Σi。
这里为什么采用极大似然估计呢?
我想主要是因为(1)表示为 x j x_j xj的概率,假设存在 i ′ i' i′使得 λ j = γ j i ′ \lambda_j=\gamma_{ji'} λj=γji′(见式3),则有参数 ( α i ′ , μ i ′ , Σ i ′ ) (\alpha_{i'},\mu_{i'},\Sigma_{i'}) (αi′,μi′,Σi′)使得(1)最大,即此时 i ≠ i ′ i \neq i' i=i′的项最小, i = i ′ i = i' i=i′的项最大,则对(1)使用极大似然估计然后对于 α i \alpha_i αi、 μ i \mu_i μi和 Σ i \Sigma_i Σi求偏导就可以得到相应的参数
(1)的极大似然估计为:
L L ( D ) = l n ( ∏ j = 1 m p M ( x j ) ) = ∑ j = 1 m l n ( ∑ i = 1 k α i ⋅ p ( x j ∣ μ i , Σ i ) ) (4) LL(D) = ln(\prod_{j=1}^mp_M(x_j)) = \sum_{j=1}^mln(\sum_{i=1}^k \alpha_i \cdot p(x_j|\mu_i,\Sigma_i)) \tag{4} LL(D)=ln(j=1∏mpM(xj))=j=1∑mln(i=1∑kαi⋅p(xj∣μi,Σi))(4)
由 ∂ L L ( D ) ∂ μ i = 0 \frac{\partial LL(D)}{\partial \mu_i} = 0 ∂μi∂LL(D)=0和 ∂ L L ( D ) ∂ Σ i = 0 \frac{\partial LL(D)}{\partial \Sigma_i} = 0 ∂Σi∂LL(D)=0可以求得:
μ i = ∑ j = 1 m γ j i x j ∑ j = 1 m γ j i (5) \mu_i = \frac{\sum_{j=1}^m\gamma_{ji}x_j}{\sum_{j=1}^m \gamma_{ji}} \tag{5} μi=∑j=1mγji∑j=1mγjixj(5)
Σ i = ∑ j = 1 m γ j i ( x j − μ i ) ( x j − μ i ) T ∑ j = 1 m γ j i (6) \Sigma_i = \frac{\sum_{j=1}^m\gamma_{ji}(x_j-\mu_i)(x_j-\mu_i)^T}{\sum_{j=1}^m \gamma_{ji}} \tag{6} Σi=∑j=1mγji∑j=1mγji(xj−μi)(xj−μi)T(6)
而对于混合系数 α i \alpha_i αi来说其还需要满足条件 α ≥ 0 , ∑ i = 1 k α i = 1 \alpha \geq 0,\sum_{i=1}^k \alpha_i=1 α≥0,∑i=1kαi=1,则有拉格朗日形式:
L L ( D ) + λ ( ∑ i = 1 k α i − 1 ) (7) LL(D)+\lambda(\sum_{i=1}^k \alpha_i-1) \tag7 LL(D)+λ(i=1∑kαi−1)(7)
所以有
α i = 1 m ∑ j = 1 m γ j i (8) \alpha_i = \frac{1}{m} \sum_{j=1}^m \gamma_{ji} \tag8 αi=m1j=1∑mγji(8)
伪代码见下:
输入:样本集 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm};
高斯混合成分个数 k k k.
过程:
初始化高斯混合分布的模型参数 { ( α i , μ i , Σ i ) ∣ 1 ≤ i ≤ k } \{(\alpha_i,\mu_i,\Sigma_i)| 1\leq i \leq k \} {(αi,μi,Σi)∣1≤i≤k}
repeat
for j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m do
根据式2计算 γ j i ( 1 ≤ i ≤ k ) \gamma_{ji}(1 \leq i \leq k) γji(1≤i≤k)
end for
for i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k do
根据式5、6、8计算新的模型参数 { ( α i ′ , μ i ′ , Σ i ) ′ ∣ 1 ≤ i ≤ k } \{(\alpha_i',\mu_i',\Sigma_i)'| 1\leq i \leq k \} {(αi′,μi′,Σi)′∣1≤i≤k};
end for
until:满足停止条件
令 C i = ϕ ( 1 ≤ i ≤ k ) C_i = \phi (1 \leq i \leq k) Ci=ϕ(1≤i≤k)
for j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m do
根据式3确定样本 x j x_j xj的簇标记 λ j \lambda_j λj;
将样本 x j x_j xj划入相应的簇 C λ j = C λ j ∪ { x j } C_{\lambda_j}=C_{\lambda_j}\cup\{x_j\} Cλj=Cλj∪{xj}
end for
输出:簇划分 C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1,C2,...,Ck}
书中以分类西瓜举例,各个参数的初始化分别为:
假如 μ \mu μ选取过近会不会最后重叠从而达不到分类效果呢?
高斯混合聚类模型可以想象为样本空间中存在 k k k个高斯分布概率模型来决定某一样本的分类;
式2为该样本上各个模型输出乘以相应参数之和,在参数初始化为相同值情况下,对式2的优化只会使得各个模型在所有样本上的输出尽可能大;
但是不同模型在同一样本上的输出是不同的(初始 μ \mu μ不同),则不同模型在移动时同一样本的“拉力”不同,这便会使得多次迭代后几个模型相差会越来越大;
当然这可能也意味着当初始值太过于相近时的确有可能使得多个模型重叠?
密度聚类也称为“基于密度的聚类”(density-based clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
其中比较著名的密度聚类算法是DBSCAN(Density-Based Spatial Clustering of Application with Noise),它基于一组 “邻域”(neighorhood)参数 ( ϵ , M i n P t s ) (\epsilon, MinPts) (ϵ,MinPts)来刻画样本分布的紧密程度。设数据集 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm},则定义:
而DBSCAN将簇定义为:由密度可达关系导出的最大的密度相连样本集合。
伪代码见下:
输入:样本集 D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm};
邻域参数 ( ϵ , M i n P t s ) (\epsilon, MinPts) (ϵ,MinPts).
过程:
初始化核心对象集合 Ω = ϕ \Omega=\phi Ω=ϕ
//获得所有核心对象
for j = 1 , 2 , . . . , m j=1,2,...,m j=1,2,...,m do
确定样本 x j x_j xj的 ϵ − \epsilon- ϵ−邻域 N ϵ ( x j ) N_{\epsilon}(x_j) Nϵ(xj)
if ∣ N ϵ ( x j ) ∣ ≥ M i n P t s |N_{\epsilon}(x_j)|\geq MinPts ∣Nϵ(xj)∣≥MinPtsthen
将样本 x i x_i xi加入核心对象集合: Ω = Ω ∪ { x i } \Omega=\Omega\cup\{x_i\} Ω=Ω∪{xi}
end if
end for
//依次访问核心对象
初始化聚类簇数: k = 0 k=0 k=0
初始化未访问样本集合: Γ = D \Gamma=D Γ=D
while: Ω ≠ ϕ \Omega\neq\phi Ω=ϕ do
记录当前未访问样本集合: Γ o l d = Γ \Gamma_{old} = \Gamma Γold=Γ
随机选取一个核心对象 o ∈ Ω o \in \Omega o∈Ω,初始化队列 Q = < o > Q=
Γ = Γ − { o } \Gamma = \Gamma - \{o\} Γ=Γ−{o}
//将核心对象及其密度直达样本化为一簇,
//密度直达样本中核心对象的密度直达样本也要划入
while Q ≠ ϕ Q \neq\phi Q=ϕ do
取出队列 Q Q Q中的首个样本 q q q;
if ∣ N ϵ ( q ) ∣ ≥ M i n P t s |N_{\epsilon}(q)|\geq MinPts ∣Nϵ(q)∣≥MinPts then
令 Δ = N ϵ ( q ) ∩ Γ \Delta=N_{\epsilon}(q)\cap \Gamma Δ=Nϵ(q)∩Γ;
将 Δ \Delta Δ中的样本加入队列 Q Q Q;
Γ = Γ − Δ \Gamma = \Gamma-\Delta Γ=Γ−Δ;
end if
end while
k = k + 1 k=k+1 k=k+1,生成聚类簇 C k = Γ o l d − Γ C_k=\Gamma_{old} - \Gamma Ck=Γold−Γ;
Ω = Ω − C k \Omega = \Omega-C_k Ω=Ω−Ck
end while
输出:簇划分 C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1,C2,...,Ck}
层次聚类(hierarchical clustering)尝试在不同层次对数据集进行划分,从而形成树性的聚类结构。书中介绍的是一种叫做AGNES(AGglomerative NESting)的层次聚类算法。
老实讲我看到AGNES的伪代码的时候感觉这个真的很直观……
开始的时候每一个样本便是一类,然后不断迭代;每次迭代找到距离最近的簇然后合并这两个簇,迭代到只剩指定个簇。
书中对于各个聚类算法介绍也比较表面,并没有太体现其中的数学,我也是初学,先对这些有些了解就好。
书中介绍了五种聚类方法: