机器学习第9章------聚类
- 9.聚类
-
- [9.1 聚类任务](#9.1 聚类任务)
- [9.2 性能度量](#9.2 性能度量)
- [9.3 距离计算](#9.3 距离计算)
- [9.4 原型聚类](#9.4 原型聚类)
-
- [9.4.1 k均值算法](#9.4.1 k均值算法)
- [9.4.2 学习向量量化(LVQ)](#9.4.2 学习向量量化(LVQ))
- [9.4.3 高斯混合聚类](#9.4.3 高斯混合聚类)
- [9.5 密度聚类](#9.5 密度聚类)
- [9.6 层次聚类](#9.6 层次聚类)
- [9.7 kmeans手动算法实现](#9.7 kmeans手动算法实现)
- [9.8 kmeans算法运用](#9.8 kmeans算法运用)
9.聚类
9.1 聚类任务
-
在"无监督学习"任务中研究最多、应用最广.
-
聚类目标:将数据集中的样本划分为若干个通常不相交的子集("簇",cluster)
-
聚类既可以作为一个单独过程(用于找寻数据内在的分布结构 ),也可作为分类等其他学习任务的前驱过程。
-
形式化描述
- 假定样本集
D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm}
包含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维的特征向量,聚类算法将样本集D划分成k个不相交的簇
{ C l ∣ l = 1 , 2 , . . . k } D = ⋃ l = 1 k C l , 且 C l , ⋂ l , ≠ l C l = ∅ \{C_l|l=1,2,...k\}\\ D=\bigcup_{l=1}^k C_l,且C_{l^,}\bigcap_{l^,\neq l}C_l=\emptyset {Cl∣l=1,2,...k}D=l=1⋃kCl,且Cl,l,=l⋂Cl=∅
相应地,用
λ ∈ { 1 , 2 , . . . , k } \lambda∈\{1,2,...,k\} λ∈{1,2,...,k}
表示样本
x j x_j xj
的"簇标记"(cluster label),即
x j ∈ C λ j x_j\in C_{\lambda_j} xj∈Cλj
于是,聚类的结果可用包含m个元素的簇标记向量
λ = { λ 1 ; λ 2 ; . . . ; λ m } \lambda=\{\lambda_1;\lambda_2;...;\lambda_m\} λ={λ1;λ2;...;λm}
表示。
- 假定样本集
9.2 性能度量
- 聚类性能度量,即聚类"有效性指标"
- 直观上,我们希望"物以类聚",即同簇的样本尽可能彼此相似,不同簇的样本尽可能不同。换言之,聚类结果的"簇内相似度 "高,且"簇间相似度"低,这样的聚类效果较好。
- 聚类性能度量指标
- 外部指标:将聚类结果与某个"参考模型"进行比较。
- 内部指标:直接考察聚类结果而不用任何参考模型。
数据集
D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm}
假定通过聚类得到的簇划分为
C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1,C2,...,Ck}
参考模型给出的簇划分为
C = { C 1 ∗ , C 2 ∗ , . . . , C k ∗ } C=\{C_1^*,C_2^*,...,C_k^*\} C={C1∗,C2∗,...,Ck∗}
相应地
令 λ 与 λ ∗ 分别表示与 C 和 C ∗ 对应的簇标记向量 令\lambda与\lambda^*分别表示与C和C^*对应的簇标记向量 令λ与λ∗分别表示与C和C∗对应的簇标记向量
我们将样本两两配对考虑,定义
a = ∣ S S ∣ , S S = { ( x i , x j ) ∣ λ i = λ j , λ i ∗ = λ j ∗ , i < j } b = ∣ S D ∣ , S D = { ( x i , x j ) ∣ λ i = λ j , λ i ∗ ≠ λ j ∗ , i < j } c = ∣ D S ∣ , D S = { ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ = λ j ∗ , i < j } d = ∣ D D ∣ , D D = { ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ ≠ λ j ∗ , i < j } a=|SS|,SS=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*=\lambda_j^*,i<j\}\\ b=|SD|,SD=\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*\neq\lambda_j^*,i<j\}\\ c=|DS|,DS=\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^*=\lambda_j^*,i<j\}\\ d=|DD|,DD=\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^*\neq\lambda_j^*,i<j\} a=∣SS∣,SS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}b=∣SD∣,SD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}c=∣DS∣,DS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}d=∣DD∣,DD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
以下图10个样本点为例
-
符合SS的点有
( x 1 , x 2 ) , ( x 1 , x 6 ) , ( x 2 , x 6 ) , ( x 3 , x 7 ) , ( x 5 , x 8 ) , ( x 5 , x 9 ) , ( x 5 , x 10 ) , ( x 8 , x 9 ) , ( x 8 , x 10 ) , ( x 9 , x 10 ) (x_1,x_2),(x_1,x_6),(x_2,x_6),(x_3,x_7),\\ (x_5,x_8),(x_5,x_9),(x_5,x_{10}),(x_8,x_9),\\ (x_8,x_{10}),(x_9,x_{10}) (x1,x2),(x1,x6),(x2,x6),(x3,x7),(x5,x8),(x5,x9),(x5,x10),(x8,x9),(x8,x10),(x9,x10)所以
a = ∣ S S ∣ = 10 a=|SS|=10 a=∣SS∣=10 -
符合SD的点有
( x 1 , x 3 ) , ( x 1 , x 7 ) , ( x 2 , x 3 ) , ( x 2 , x 7 ) , ( x 3 , x 6 ) , ( x 6 , x 7 ) , ( x 4 , x 5 ) , ( x 4 , x 8 ) , ( x 4 , x 9 ) , ( x 4 , x 10 ) (x_1,x_3),(x_1,x_7),(x_2,x_3),(x_2,x_7),(x_3,x_6),(x_6,x_7),\\ (x_4,x_5),(x_4,x_8),(x_4,x_9),(x_4,x_{10}) (x1,x3),(x1,x7),(x2,x3),(x2,x7),(x3,x6),(x6,x7),(x4,x5),(x4,x8),(x4,x9),(x4,x10)所以
b = ∣ S D ∣ = 10 b=|SD|=10 b=∣SD∣=10 -
符合DS的点有
( x 1 , x 4 ) , ( x 2 , x 4 ) , ( x 4 , x 6 ) , ( x 3 , x 5 ) , ( x 3 , x 8 ) , ( x 3 , x 9 ) , ( x 3 , x 10 ) , ( x 5 , x 7 ) , ( x 7 , x 8 ) , ( x 7 , x 9 ) , ( x 7 , x 10 ) , (x_1,x_4),(x_2,x_4),(x_4,x_6),\\ (x_3,x_5),(x_3,x_8),(x_3,x_9),(x_3,x_{10}),\\ (x_5,x_7),(x_7,x_8),(x_7,x_9),(x_7,x_{10}), (x1,x4),(x2,x4),(x4,x6),(x3,x5),(x3,x8),(x3,x9),(x3,x10),(x5,x7),(x7,x8),(x7,x9),(x7,x10),所以
c = ∣ D S ∣ = 11 c=|DS|=11 c=∣DS∣=11 -
符合DD的点有
( x 1 , x 5 ) , ( x 1 , x 8 ) , ( x 1 , x 9 ) , ( x 1 , x 10 ) , ( x 2 , x 5 ) , ( x 2 , x 8 ) , ( x 2 , x 9 ) , ( x 2 , x 10 ) , ( x 5 , x 6 ) , ( x 6 , x 8 ) , ( x 6 , x 9 ) , ( x 6 , x 10 ) ( x 3 , x 4 ) , ( x 4 , x 7 ) (x_1,x_5),(x_1,x_8),(x_1,x_9),(x_1,x_{10}),\\ (x_2,x_5),(x_2,x_8),(x_2,x_9),(x_2,x_{10}),\\ (x_5,x_6),(x_6,x_8),(x_6,x_9),(x_6,x_{10})\\ (x_3,x_4),(x_4,x_7) (x1,x5),(x1,x8),(x1,x9),(x1,x10),(x2,x5),(x2,x8),(x2,x9),(x2,x10),(x5,x6),(x6,x8),(x6,x9),(x6,x10)(x3,x4),(x4,x7)所以
d = ∣ D D ∣ = 14 d=|DD|=14 d=∣DD∣=14 -
总的有
a + b + c + d = m ( m − 1 ) 2 = 10 × 9 2 = 45 a+b+c+d=\frac{m(m-1)}{2}=\frac{10\times 9}{2}=45 a+b+c+d=2m(m−1)=210×9=45 -
基于上述所求值可计算外部指标(需要借助数据真实的标签)
-
Jaccard指数(JC)
J C = a a + b + c JC=\frac{a}{a+b+c} JC=a+b+ca -
FM指数(FMI)
F M I = a a + b ⋅ a a + c FMI=\sqrt{\frac{a}{a+b}\cdot\frac{a}{a+c}} FMI=a+ba⋅a+ca -
Rand指数(RI)
R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m−1)2(a+d)
-
-
考虑聚类结果的簇划分
C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1,C2,...,Ck}-
定义簇C内样本间的平均距离
a v g ( C ) = 2 ∣ C ∣ ( ∣ C ∣ − 1 ) ∑ 1 ≤ i ≤ j ≤ ∣ C ∣ d i s t ( x i , x j ) avg(C)=\frac{2}{|C|(|C|-1)} \sum_{1\leq i\leq j \leq|C|}dist(x_i,x_j) avg(C)=∣C∣(∣C∣−1)21≤i≤j≤∣C∣∑dist(xi,xj) -
簇C内样本间的最远距离
d i a m ( C ) = m a x 1 ≤ i ≤ j ≤ ∣ C ∣ d i s t ( x i , x j ) diam(C)=max_{1\leq i\leq j\leq|C|}dist(x_i,x_j) diam(C)=max1≤i≤j≤∣C∣dist(xi,xj) -
两个簇的最近样本间的距离
d m i n ( C i , C j ) = m i n x i ∈ C i , x j ∈ C j d i s t ( x i , x j ) d_{min}(C_i,C_j)=min_{x_i\in C_i,x_j\in C_j}dist(x_i,x_j) dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj) -
两簇的中心点间的距离
d c e n ( C i , C j ) = d i s t ( μ i , μ j ) d_{cen}(C_i,C_j)=dist(\mu_i,\mu_j) dcen(Ci,Cj)=dist(μi,μj)
-
-
基于上述所求值可计算内部指标(不需要借助数据真实的标签,比较常用,毕竟真实的标签可遇不可求)
-
DB指数(DBI)
D B I = 1 k ∑ i = 1 k max j ≠ i ( a v g ( C i ) + a v g ( C j ) d c e n ( μ i , μ j ) ) DBI=\frac{1}{k}\sum_{i=1}^k\max_{j\neq i}\bigg(\frac{avg(C_i)+avg(C_j)}{d_{cen}(\mu_i,\mu_j)}\bigg) DBI=k1i=1∑kj=imax(dcen(μi,μj)avg(Ci)+avg(Cj))越小越好 \color{red}{越小越好} 越小越好
-
Dunn指数(DI)
D I = min 1 ≤ i ≤ k { max j ≠ i ( d m i n ( C i , C j ) max 1 ≤ l ≤ k d i a m ( C l ) ) } DI=\min_{1\leq i\leq k}\{\max_{j\neq i}\bigg(\frac{d_{min}(C_i,C_j)}{\max_{1\leq l\leq k}diam(C_l)}\bigg)\} DI=1≤i≤kmin{j=imax(max1≤l≤kdiam(Cl)dmin(Ci,Cj))}越大越好 \color{red}{越大越好} 越大越好
-
9.3 距离计算
-
距离度量的性质
-
非负性
d i s t ( x i , x j ) > 0 dist(x_i,x_j)>0 dist(xi,xj)>0 -
同一性:
d i s t ( x i , x j ) = 0 当且仅当 i = j dist(x_i,x_j)=0当且仅当i= j dist(xi,xj)=0当且仅当i=j -
对称性
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)
-
-
常用距离
-
闵可夫斯基距离
d i s t ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p dist(x_i,x_j)=\bigg(\sum_{u=1}^n|x_{iu}-x_{ju}|^p\bigg)^{\frac{1}{p}} dist(xi,xj)=(u=1∑n∣xiu−xju∣p)p1-
例如
age height weight 小明 14 172 50 小红 13 164 48 小明记为样本 x 1 , 小红记为样本 x 2 小明记为样本x_1,小红记为样本x_2 小明记为样本x1,小红记为样本x2
d i s t ( x 1 , x 2 ) = ( ( 14 − 13 ) p + ( 172 − 164 ) p + ( 50 − 48 ) p ) 1 p dist(x_1,x_2)=\big((14-13)^p+(172-164)^p+(50-48)^p\big)^{\frac{1}{p}} dist(x1,x2)=((14−13)p+(172−164)p+(50−48)p)p1
-
p=1:曼哈顿距离(街区距离)
-
p=2:欧氏距离
-
属性介绍
- 连续属性:在定义域上有无穷多个可能的取值
- 离散属性:在定义域上是有限个可能的取值
- 有序属性:例如定义域为{1,2,3}的离散属性,"1"与"2"比较接近、与"3"比较远,称为"有序属性"。
- 无序属性:例如定义域为{飞机,火车,轮船}这样的离散属性,不能直接在属性值上进行计算,称为"无序属性"。
-
显然闵可夫斯基距离属于有序属性
-
-
VDM(处理无序属性)
-
令
m u , a m_{u,a} mu,a表示属性a上取值为u的样本数,
m u , a , i m_{u,a,i} mu,a,i表示在第i个样本簇中在属性a上取值为u的样本数,k为样本簇数,则属性u上两个离散值a与b之间的VDM距离为
V D M p ( a , b ) = ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p VDM_p(a,b)=\sum_{i=1}^k\bigg|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}\bigg|^p VDMp(a,b)=i=1∑k mu,amu,a,i−mu,bmu,b,i p -
例如
age height weight mode 小明 14 172 50 飞机 小红 13 164 48 汽车 小白 15 170 49 火车 ... 经过统计,班级50个人中,15个人喜欢坐飞机,15个人喜欢坐汽车,20个人喜欢坐火车
记
坐火车为 a , 坐汽车为 b 坐火车为a,坐汽车为b 坐火车为a,坐汽车为b所以
V D M p ( a , b ) = ∣ 15 20 − 15 15 ∣ p + ∣ 5 20 − 0 15 ∣ p VDM_p(a,b)=|\frac{15}{20}-\frac{15}{15}|^p+|\frac{5}{20}-\frac{0}{15}|^p VDMp(a,b)=∣2015−1515∣p+∣205−150∣p
-
-
MinkovDM(处理混合属性)
M i n k o v D M p ( x i , x j ) = ( ∑ u = 1 n c ∣ x i u − x j u ∣ p + ∑ u = n c + 1 n V D M p ( x i u , x j u ) ) 1 p MinkovDM_p(x_i,x_j)=\bigg(\sum_{u=1}^{n_c}|x_{iu}-x_{ju}|^p+\sum_{u=n_c+1}^nVDM_p(x_{iu},x_{ju})\bigg)^{\frac{1}{p}} MinkovDMp(xi,xj)=(u=1∑nc∣xiu−xju∣p+u=nc+1∑nVDMp(xiu,xju))p1 -
加权距离(样本中不同属性的重要性不同时)
d i s t ( x i , x j ) = ( ω 1 ⋅ ∣ x i 1 − x j 1 ∣ p + . . . + ω n ⋅ ∣ x i n − x j n ∣ p ) 1 p dist(x_i,x_j)=\big(\omega_1\cdot|x_{i1}-x_{j1}|^p+...+\omega_n\cdot|x_{in}-x_{jn}|^p\big)^{\frac{1}{p}} dist(xi,xj)=(ω1⋅∣xi1−xj1∣p+...+ωn⋅∣xin−xjn∣p)p1
-
9.4 原型聚类
- 原型聚类
- 也称为"基于原型的聚类",此类算法假设聚类结构能通过一组原型刻画。
- 算法过程
- 通常情况下,算法先对原型进行初始化,再对原型进行迭代更新求解。
- k均值算法、学习向量量化算法、高斯混合聚类算法。
9.4.1 k均值算法
给定数据集
D = { x 1 , x 2 , . . . , x m } D=\{x_1,x_2,...,x_m\} D={x1,x2,...,xm}
k均值算法针对聚类所得簇划分
C = { C 1 , C 2 , . . . , C k } 这里的 k 是需要事先指定的 ( 需要分成 k 类 ) ,所以此算法中, k 的选取很重要 C=\{C_1,C_2,...,C_k\}\\ 这里的k是需要事先指定的(需要分成k类),所以此算法中,k的选取很重要 C={C1,C2,...,Ck}这里的k是需要事先指定的(需要分成k类),所以此算法中,k的选取很重要
最小化平方误差
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 μ i 是簇 C i 的均值向量 ( 1 ∣ C i ∣ ∑ x ∈ C i x ) ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 为簇中的所有点距离中心点的距离和 E=\sum_{i=1}^k\sum_{x\in C_i}||x-\mu_i||^2_2\\ \mu_i是簇C_i的均值向量(\frac{1}{|C_i|}\sum_{x\in C_i}x)\\ \sum_{x\in C_i}||x-\mu_i||^2_2为簇中的所有点距离中心点的距离和 E=i=1∑kx∈Ci∑∣∣x−μi∣∣22μi是簇Ci的均值向量(∣Ci∣1x∈Ci∑x)x∈Ci∑∣∣x−μi∣∣22为簇中的所有点距离中心点的距离和
E值在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度,E值越小,则簇内样本相似度越高。算法的整个过程就是在不断的调整"点该属于哪一个簇",从而使得平方误差最小
例如,我们以西瓜数据集为例,因为需要划分成3类,所以随机选取了编号6、12、27作为均值向量
μ 1 = ( 0.403 ; 0.237 ) 、 μ 2 = ( 0.343 ; 0.099 ) 、 μ 1 = ( 0.532 ; 0.472 ) \mu_1=(0.403;0.237)、\mu_2=(0.343;0.099)、\mu_1=(0.532;0.472) μ1=(0.403;0.237)、μ2=(0.343;0.099)、μ1=(0.532;0.472)
接着对样本点进行划分,例如我们对编号1进行计算距离
d 11 = ( 0.697 − 0.403 ) 2 + ( 0.460 − 0.237 ) 2 = 0.369 ( 样本 1 到簇 1 的距离 ) d 12 = ( 0.697 − 0.343 ) 2 + ( 0.460 − 0.099 ) 2 = 0.506 ( 样本 1 到簇 2 的距离 ) d 13 = ( 0.697 − 0.532 ) 2 + ( 0.460 − 0.472 ) 2 = 0.166 ( 样本 1 到簇 3 的距离 ) d_{11}=\sqrt{(0.697-0.403)^2+(0.460-0.237)^2}=0.369\quad(样本1到簇1的距离)\\ d_{12}=\sqrt{(0.697-0.343)^2+(0.460-0.099)^2}=0.506\quad(样本1到簇2的距离)\\ d_{13}=\sqrt{(0.697-0.532)^2+(0.460-0.472)^2}=0.166\quad(样本1到簇3的距离) d11=(0.697−0.403)2+(0.460−0.237)2 =0.369(样本1到簇1的距离)d12=(0.697−0.343)2+(0.460−0.099)2 =0.506(样本1到簇2的距离)d13=(0.697−0.532)2+(0.460−0.472)2 =0.166(样本1到簇3的距离)
所以样本1被划分到簇3中,以此类推,对所有样本进行划分,可以得到结果
C 1 = { x 5 , x 6 , x 7 , x 8 , x 9 , x 10 , x 13 , x 14 , x 15 , x 17 , x 18 , x 19 , x 20 , x 23 } C 2 = { x 11 , x 12 , x 16 } C 3 = { x 1 , x 2 , x 3 , x 4 , x 21 , x 22 , x 24 , x 25 , x 26 , x 27 , x 28 , x 29 , x 30 } C_1=\{x_5,x_6,x_7,x_8,x_9,x_{10},x_{13},x_{14},x_{15},x_{17},x_{18},x_{19},x_{20},x_{23}\}\\ C_2=\{x_{11},x_{12},x_{16}\}\\ C_3=\{x_1,x_2,x_3,x_4,x_{21},x_{22},x_{24},x_{25},x_{26},x_{27},x_{28},x_{29},x_{30}\} C1={x5,x6,x7,x8,x9,x10,x13,x14,x15,x17,x18,x19,x20,x23}C2={x11,x12,x16}C3={x1,x2,x3,x4,x21,x22,x24,x25,x26,x27,x28,x29,x30}
这样三个簇里分别都有样本,可以求出新的均值向量
μ 1 , = ( 0.473 ; 0.214 ) 、 μ 2 , = ( 0.394 ; 0.066 ) 、 μ 3 , = ( 0.623 ; 0.388 ) \mu_1^,=(0.473;0.214)、\mu_2^,=(0.394;0.066)、\mu_3^,=(0.623;0.388) μ1,=(0.473;0.214)、μ2,=(0.394;0.066)、μ3,=(0.623;0.388)
更新均值向量,把三个簇内的样本清空,重新再来一遍,又可以得到一次划分结果和一组新的均值向量,循环迭代,直到收敛或者规定次数后停止。下图是进行四次迭代的划分结果。
9.4.2 学习向量量化(LVQ)
与一般聚类算法不同的是,LVQ假设数据样本带有类别标记 ,学习过程中利用样本的这些监督信息来辅助聚类
给定样本集
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(x_1,y1),(x_2,y_2),..., (x_m,y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)}
LVQ的目标是学得一组n维原型向量
{ p 1 , p 2 , . . . , p q } \{p_1,p_2,...,p_q\} {p1,p2,...,pq}
每个原型向量代表一个聚类簇。常用于发现类别的"子类"结构。
如果样本标记与预设标记一致,之间的距离变为
∣ ∣ p , − x j ∣ ∣ 2 = ∣ ∣ p i ∗ + η ⋅ ( x j − p i ∗ ) − x j ∣ ∣ 2 = ( 1 − η ) ⋅ ∣ ∣ p i ∗ − x j ∣ ∣ 2 ||p^,-x_j||2=||p{i^*}+\eta\cdot(x_j-p_{i^*})-x_j||2\\ =(1-\eta)\cdot||p{i^*}-x_j||_2 ∣∣p,−xj∣∣2=∣∣pi∗+η⋅(xj−pi∗)−xj∣∣2=(1−η)⋅∣∣pi∗−xj∣∣2
如果样本标记与预设标记不一致,之间的距离为
∣ ∣ p , − x j ∣ ∣ 2 = ∣ ∣ p i ∗ − η ⋅ ( x j − p i ∗ ) − x j ∣ ∣ 2 = ( 1 + η ) ⋅ ∣ ∣ p i ∗ − x j ∣ ∣ 2 ||p^,-x_j||2=||p{i^*}-\eta\cdot(x_j-p_{i^*})-x_j||2\\ =(1+\eta)\cdot||p{i^*}-x_j||_2 ∣∣p,−xj∣∣2=∣∣pi∗−η⋅(xj−pi∗)−xj∣∣2=(1+η)⋅∣∣pi∗−xj∣∣2
例如,我们以西瓜数据集为例
虽然瓜可以只分为两类(好瓜和坏瓜),但是学习向量量化算法可以划分为更具体的子类,所以我们可以想让它划分为5类,所以原型向量也有5个
p 1 , p 2 , p 3 , p 4 , p 5 p_1,p_2,p_3,p_4,p_5 p1,p2,p3,p4,p5
对应的类别标记为
c 1 , c 2 , c 2 , c 1 , c 1 c 1 : 好瓜 = 是 , c 2 : 好瓜 = 否 c_1,c_2,c_2,c_1,c_1\\ c_1:好瓜=是,c_2:好瓜=否 c1,c2,c2,c1,c1c1:好瓜=是,c2:好瓜=否
所以初始化的原型向量1、4、5需要在"好瓜=是"的标记下随机选择样本;而初始化的原型向量2和3需要在"好瓜=否"的标记下随机选择样本。这里假定5个原型向量初始化为
x 5 = ( 0.556 , 0.215 ) , x 12 = ( 0.343 , 0.099 ) , x 18 = ( 0.359 , 0.188 ) , x 23 = ( 0.483 , 0.312 ) , x 29 = ( 0.725 , 0.445 ) x_5=(0.556,0.215),x_{12}=(0.343,0.099),x_{18}=(0.359,0.188),\\ x_{23}=(0.483,0.312),x_{29}=(0.725,0.445) x5=(0.556,0.215),x12=(0.343,0.099),x18=(0.359,0.188),x23=(0.483,0.312),x29=(0.725,0.445)
然后进入第一轮的迭代,随机选择一个样本,假定选择的是
x 1 x_1 x1
这时候需要计算样本1到5个原型向量的距离,计算过程与k均值算法一样
d 11 = ( 0.697 − 0.556 ) 2 + ( 0.460 − 0.215 ) 2 = 0.283 ( x 1 到 p 1 的距离 ) d 12 = ( 0.697 − 0.343 ) 2 + ( 0.460 − 0.099 ) 2 = 0.506 ( x 1 到 p 2 的距离 ) d 13 = ( 0.697 − 0.359 ) 2 + ( 0.460 − 0.188 ) 2 = 0.434 ( x 1 到 p 3 的距离 ) d 14 = ( 0.697 − 0.483 ) 2 + ( 0.460 − 0.312 ) 2 = 0.260 ( x 1 到 p 4 的距离 ) d 15 = ( 0.697 − 0.725 ) 2 + ( 0.460 − 0.445 ) 2 = 0.032 ( x 1 到 p 5 的距离 ) d_{11}=\sqrt{(0.697-0.556)^2+(0.460-0.215)^2}=0.283\quad(x_1到p_1的距离)\\ d_{12}=\sqrt{(0.697-0.343)^2+(0.460-0.099)^2}=0.506\quad(x_1到p_2的距离)\\ d_{13}=\sqrt{(0.697-0.359)^2+(0.460-0.188)^2}=0.434\quad(x_1到p_3的距离)\\ d_{14}=\sqrt{(0.697-0.483)^2+(0.460-0.312)^2}=0.260\quad(x_1到p_4的距离)\\ d_{15}=\sqrt{(0.697-0.725)^2+(0.460-0.445)^2}=0.032\quad(x_1到p_5的距离) d11=(0.697−0.556)2+(0.460−0.215)2 =0.283(x1到p1的距离)d12=(0.697−0.343)2+(0.460−0.099)2 =0.506(x1到p2的距离)d13=(0.697−0.359)2+(0.460−0.188)2 =0.434(x1到p3的距离)d14=(0.697−0.483)2+(0.460−0.312)2 =0.260(x1到p4的距离)d15=(0.697−0.725)2+(0.460−0.445)2 =0.032(x1到p5的距离)
发现样本1与原型向量5距离最近,且二者具有相同类别标记(都是好瓜),假设学习率为
η = 0.1 \eta=0.1 η=0.1
则原型向量5可以得到更新
p 5 , = p 5 + η ( x 1 − p 5 ) = ( 0.725 , 0.445 ) + 0.1 ⋅ ( ( 0.697 , 0.460 ) − ( 0.725 , 0.445 ) ) = ( 0.722 , 0.442 ) p_5^,=p_5+\eta(x_1-p_5)\\ =(0.725,0.445)+0.1\cdot((0.697,0.460)-(0.725,0.445))\\ =(0.722,0.442) p5,=p5+η(x1−p5)=(0.725,0.445)+0.1⋅((0.697,0.460)−(0.725,0.445))=(0.722,0.442)
经过50、100、200、400轮迭代后的结果如下
9.4.3 高斯混合聚类
与k均值、LVQ用原型向量来刻画聚类结构不同,高斯混合聚类采用概率模型来表达聚类原型
- 多元高斯分布的定义
对n维样本空间中的随机向量x,若服从高斯分布,其概率密度函数为
p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) 也可记作 p ( x ∣ μ , Σ ) μ 是 n 维均值向量 , Σ 是 n × n 的协方差矩阵 p(x)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)}\quad 也可记作p(x|\mu,\Sigma)\\ \mu是n维均值向量,\Sigma 是n\times n的协方差矩阵 p(x)=(2π)2n∣Σ∣211e−21(x−μ)TΣ−1(x−μ)也可记作p(x∣μ,Σ)μ是n维均值向量,Σ是n×n的协方差矩阵
-
高斯混合分布的定义
p ( x ) = ∑ i = 1 k p ( z j = i ) ⋅ p ( x j ∣ z j = i ) = ∑ i = 1 k α i ⋅ p ( x ∣ μ i , Σ i ) 全概率公式展开 k 个高斯分布共同构成一个 x 向量 其中 , μ i 与 Σ i 是第 i 个 高斯混合成分 的参数。 而 α i > 0 为相应的混合系数 , 且 ∑ i = 1 k α i = 1 p(x)=\sum_{i=1}^kp(z_j=i)\cdot p(x_j|z_j=i)=\sum_{i=1}^k\alpha_i\cdot p(x|\mu_i,\Sigma_i)\quad 全概率公式展开\\ k个高斯分布共同构成一个x向量\\ 其中,\mu_i与\Sigma_i是第i个\color{red}{高斯混合成分}\color{black}{的参数。}\\ 而\alpha_i>0为相应的混合系数,且\sum_{i=1}^k\alpha_i=1 p(x)=i=1∑kp(zj=i)⋅p(xj∣zj=i)=i=1∑kαi⋅p(x∣μi,Σi)全概率公式展开k个高斯分布共同构成一个x向量其中,μi与Σi是第i个高斯混合成分的参数。而αi>0为相应的混合系数,且i=1∑kαi=1 -
假设样本的生成过程由高斯混合分布给出:
-
首先,根据
α 1 , α 2 , . . . , α k \alpha_1,\alpha_2,...,\alpha_k α1,α2,...,αk定义的先验分布选择高斯混合成分,其中
α i \alpha_i αi为选择第i个混合成分的概率
-
然后,根据被选择的混合成分的概率密度函数进行采样,从而生成相应的样本。
-
训练集
D = { x 1 , x 2 , . . , x m } D=\{x_1,x_2,..,x_m\} D={x1,x2,..,xm}
随机变量
z j ∈ 1 , 2 , . . . , k : 表示生成样本 x j 的高斯混合成分 ( x j 属于哪一个高斯分布 ) z_j\in{1,2,...,k}:表示生成样本x_j的高斯混合成分(x_j属于哪一个高斯分布) zj∈1,2,...,k:表示生成样本xj的高斯混合成分(xj属于哪一个高斯分布)
属于第i个高斯分布的概率
第 i 个高斯分布的均值和协方差矩阵 : μ i 、 Σ i p ( z j = i ) = p ( μ i , Σ i ) = α i 第i个高斯分布的均值和协方差矩阵:\mu_i、\Sigma_i\\ p(z_j=i)=p(\mu_i,\Sigma_i)=\alpha_i 第i个高斯分布的均值和协方差矩阵:μi、Σip(zj=i)=p(μi,Σi)=αi
给定样本的情况下,属于第i个高斯分布的概率
p ( z j = i ∣ x j ) 简记为 γ j i = p ( z j = i ) ⋅ p ( x j ∣ z j = i ) p ( x j ) = α i ⋅ p ( x j ∣ μ i , Σ i ) p ( x j ) = α i ⋅ p ( x j ∣ μ i , Σ i ) ∑ l = 1 k p ( z j = l ) p ( x j ∣ z j = l ) = α i ⋅ p ( x j ∣ μ i , Σ i ) ∑ l = 1 k α l ⋅ p ( x j ∣ μ l , Σ l ) p(z_j=i|x_j)\quad 简记为\gamma_{ji}\\ =\frac{p(z_j=i)\cdot p(x_j|z_j=i)}{p(x_j)} =\frac{\alpha_i\cdot p(x_j|\mu_i,\Sigma_i)}{p(x_j)}\\ =\frac{\alpha_i\cdot p(x_j|\mu_i,\Sigma_i)}{\sum_{l=1}^kp(z_j=l)p(x_j|z_j=l)} =\frac{\alpha_i\cdot p(x_j|\mu_i,\Sigma_i)}{\sum_{l=1}^k\alpha_l\cdot p(x_j|\mu_l,\Sigma_l)}\\ p(zj=i∣xj)简记为γji=p(xj)p(zj=i)⋅p(xj∣zj=i)=p(xj)αi⋅p(xj∣μi,Σi)=∑l=1kp(zj=l)p(xj∣zj=l)αi⋅p(xj∣μi,Σi)=∑l=1kαl⋅p(xj∣μl,Σl)αi⋅p(xj∣μi,Σi)
这样在一个给定的样本中,可以求出它属于每一个高斯分布的概率,我们取最大的概率作为它划分进簇的标准
λ j = arg max i ∈ { 1 , 2 , . . . , k } γ j i \lambda_j=\arg\max_{i\in\{1,2,...,k\}}\gamma_{ji} λj=argi∈{1,2,...,k}maxγji
所以整个过程转化为,确定参数
α i , μ i , Σ i \alpha_i,\mu_i,\Sigma_i αi,μi,Σi
-
极大似然估计求解
L L ( D ) = ln ( ∏ j = 1 k p ( x j ) ) = ∑ j = 1 m ln ( ∑ i = 1 k α i ⋅ p ( x j ∣ μ i , Σ i ) ) LL(D)=\ln\bigg(\prod_{j=1}^kp(x_j)\bigg)\\ =\sum_{j=1}^m\ln\bigg(\sum_{i=1}^k\alpha_i\cdot p(x_j|\mu_i,\Sigma_i)\bigg) LL(D)=ln(j=1∏kp(xj))=j=1∑mln(i=1∑kαi⋅p(xj∣μi,Σi))-
对均值求偏导,并令其等于零进行求解
∂ L L ( D ) ∂ μ i \frac{\partial\,LL(D)}{\partial\,\mu_i} ∂μi∂LL(D)
-
对协方差矩阵求偏导,并令其等于零进行求解
∂ L L ( D ) ∂ Σ i \frac{\partial\,LL(D)}{\partial\,\Sigma_i} ∂Σi∂LL(D)
-
接着需要用拉格朗日对
α i \alpha_i αi求解,并且条件满足
α i ≥ 0 , ∑ i = 1 k α i = 1 \alpha_i\geq0,\sum_{i=1}^k\alpha_i=1 αi≥0,i=1∑kαi=1所以拉格朗日形式如下
L L ( D ) + λ ( ∑ i = 1 k α i − 1 ) LL(D)+\lambda\big(\sum_{i=1}^k\alpha_i-1\big) LL(D)+λ(i=1∑kαi−1)对其求导,并令其等于零进行求解
-
算法流程如下:
还是以西瓜数据集为例,假设我们要划分成三类,也就是高斯混合成分的个数
k = 3 k=3 k=3
对模型参数进行初始化
-
属于类1、类2、类3的概率
α 1 = 1 3 、 α 2 = 1 3 、 α 3 = 1 3 \alpha_1=\frac{1}{3}、\alpha_2=\frac{1}{3}、\alpha_3=\frac{1}{3} α1=31、α2=31、α3=31 -
类1、类2、类3的均值(随机初始化)
μ 1 = x 6 = ( 0.403 ; 0.237 ) 、 μ 2 = x 22 = ( 0.714 ; 0.346 ) 、 μ 3 = x 27 = ( 0.532 ; 0.472 ) \mu_1=x_6=(0.403;0.237)、\mu_2=x_{22}=(0.714;0.346)、\mu_3=x_{27}=(0.532;0.472) μ1=x6=(0.403;0.237)、μ2=x22=(0.714;0.346)、μ3=x27=(0.532;0.472) -
类1、类2、类3的协方差矩阵(方阵且是对称阵)
维数为特征的个数,因为有密度和含糖率两个特征,所以矩阵为2×2
Σ 1 = Σ 2 = Σ 3 = ( 0.1 0 0 0.1 ) \Sigma_1=\Sigma_2=\Sigma_3=\begin{pmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{pmatrix} Σ1=Σ2=Σ3=(0.1000.1)
以样本编号1为例,计算后验概率
γ 11 = α 1 ⋅ p ( x 1 ∣ μ 1 , Σ 1 ) ∑ l = 1 3 α l ⋅ p ( x 1 ∣ μ l , Σ l ) \gamma_{11}=\frac{\alpha_1\cdot p(x_1|\mu_1,\Sigma_1)}{\sum_{l=1}^3\alpha_l\cdot p(x_1|\mu_l,\Sigma_l)}\\ γ11=∑l=13αl⋅p(x1∣μl,Σl)α1⋅p(x1∣μ1,Σ1)
分子 : α 1 ⋅ p ( x 1 ∣ μ 1 , Σ 1 ) = 1 3 1 ( 2 π ) 2 2 ∣ 0.1 0 0 0.1 ∣ 1 2 e − 1 2 ( ( 0.697 ; 0.460 ) − ( 0.403 ; 0.237 ) ) T ( 0.1 0 0 0.1 ) − 1 ( ( 0.697 ; 0.460 ) − ( 0.403 ; 0.237 ) ) = 1 3 1 2 π ⋅ 0.1 e − 1 2 ( 0.294 0.223 ) ( 10 0 0 10 ) ( 0.294 0.223 ) = 1 0.6 π e − 0.680825 分子:\\ \alpha_1\cdot p(x_1|\mu_1,\Sigma_1)=\frac{1}{3}\frac{1}{(2\pi)^{\frac{2}{2}}\begin{vmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{vmatrix}^{\frac{1}{2}}}e^{-\frac{1}{2}\big((0.697;0.460)-(0.403;0.237)\big)^T\begin{pmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{pmatrix}^{-1}\big((0.697;0.460)-(0.403;0.237)\big)}\\ =\frac{1}{3}\frac{1}{2\pi \cdot 0.1}e^{-\frac{1}{2}\begin{pmatrix} 0.294 & 0.223 \end{pmatrix}\begin{pmatrix} 10 & 0 \\ 0 & 10 \\ \end{pmatrix}\begin{pmatrix} 0.294\\0.223\end{pmatrix}}\\ =\frac{1}{0.6\pi}e^{-0.680825} 分子:α1⋅p(x1∣μ1,Σ1)=31(2π)22 0.1000.1 211e−21((0.697;0.460)−(0.403;0.237))T(0.1000.1)−1((0.697;0.460)−(0.403;0.237))=312π⋅0.11e−21(0.2940.223)(100010)(0.2940.223)=0.6π1e−0.680825
分母 : ∑ l = 1 3 α l ⋅ p ( x 1 ∣ μ l , Σ l ) = α 1 ⋅ p ( x 1 ∣ μ 1 , Σ 1 ) + α 2 ⋅ p ( x 1 ∣ μ 2 , Σ 2 ) + α 3 ⋅ p ( x 1 ∣ μ 3 , Σ 3 ) = 1 3 1 ( 2 π ) 2 2 ∣ 0.1 0 0 0.1 ∣ 1 2 e − 1 2 ( ( 0.697 ; 0.460 ) − ( 0.403 ; 0.237 ) ) T ( 0.1 0 0 0.1 ) − 1 ( ( 0.697 ; 0.460 ) − ( 0.403 ; 0.237 ) ) + 1 3 1 ( 2 π ) 2 2 ∣ 0.1 0 0 0.1 ∣ 1 2 e − 1 2 ( ( 0.697 ; 0.460 ) − ( 0.714 ; 0.346 ) ) T ( 0.1 0 0 0.1 ) − 1 ( ( 0.697 ; 0.460 ) − ( 0.714 ; 0.346 ) ) + 1 3 1 ( 2 π ) 2 2 ∣ 0.1 0 0 0.1 ∣ 1 2 e − 1 2 ( ( 0.697 ; 0.460 ) − ( 0.532 ; 0.472 ) ) T ( 0.1 0 0 0.1 ) − 1 ( ( 0.697 ; 0.460 ) − ( 0.532 ; 0.472 ) ) = 1 3 1 2 π ⋅ 0.1 e − 1 2 ( 0.294 0.223 ) ( 10 0 0 10 ) ( 0.294 0.223 ) + 1 3 1 2 π ⋅ 0.1 e − 1 2 ( − 0.017 0.114 ) ( 10 0 0 10 ) ( − 0.017 0.114 ) + 1 3 1 2 π ⋅ 0.1 e − 1 2 ( 0.165 − 0.012 ) ( 10 0 0 10 ) ( 0.165 − 0.012 ) = 1 0.6 π ( e − 0.680825 + e − 0.066425 + e − 0.136845 ) 分母:\\ \sum_{l=1}^3\alpha_l\cdot p(x_1|\mu_l,\Sigma_l)=\alpha_1\cdot p(x_1|\mu_1,\Sigma_1)+\alpha_2\cdot p(x_1|\mu_2,\Sigma_2)+\alpha_3\cdot p(x_1|\mu_3,\Sigma_3)\\ =\frac{1}{3}\frac{1}{(2\pi)^{\frac{2}{2}}\begin{vmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{vmatrix}^{\frac{1}{2}}}e^{-\frac{1}{2}\big((0.697;0.460)-(0.403;0.237)\big)^T\begin{pmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{pmatrix}^{-1}\big((0.697;0.460)-(0.403;0.237)\big)}\\ +\frac{1}{3}\frac{1}{(2\pi)^{\frac{2}{2}}\begin{vmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{vmatrix}^{\frac{1}{2}}}e^{-\frac{1}{2}\big((0.697;0.460)-(0.714;0.346)\big)^T\begin{pmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{pmatrix}^{-1}\big((0.697;0.460)-(0.714;0.346)\big)}\\ +\frac{1}{3}\frac{1}{(2\pi)^{\frac{2}{2}}\begin{vmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{vmatrix}^{\frac{1}{2}}}e^{-\frac{1}{2}\big((0.697;0.460)-(0.532;0.472)\big)^T\begin{pmatrix} 0.1 & 0 \\ 0 & 0.1 \\ \end{pmatrix}^{-1}\big((0.697;0.460)-(0.532;0.472)\big)}\\ =\frac{1}{3}\frac{1}{2\pi \cdot 0.1}e^{-\frac{1}{2}\begin{pmatrix} 0.294 & 0.223 \end{pmatrix}\begin{pmatrix} 10 & 0 \\ 0 & 10 \\ \end{pmatrix}\begin{pmatrix} 0.294\\0.223\end{pmatrix}}+\\ \frac{1}{3}\frac{1}{2\pi \cdot 0.1}e^{-\frac{1}{2}\begin{pmatrix} -0.017 & 0.114 \end{pmatrix}\begin{pmatrix} 10 & 0 \\ 0 & 10 \\ \end{pmatrix}\begin{pmatrix} -0.017\\ 0.114\end{pmatrix}}+\\ \frac{1}{3}\frac{1}{2\pi \cdot 0.1}e^{-\frac{1}{2}\begin{pmatrix} 0.165 & -0.012 \end{pmatrix}\begin{pmatrix} 10 & 0 \\ 0 & 10 \\ \end{pmatrix}\begin{pmatrix} 0.165\\-0.012 \end{pmatrix}}\\ =\frac{1}{0.6\pi}(e^{-0.680825}+e^{-0.066425}+e^{-0.136845}) 分母:l=1∑3αl⋅p(x1∣μl,Σl)=α1⋅p(x1∣μ1,Σ1)+α2⋅p(x1∣μ2,Σ2)+α3⋅p(x1∣μ3,Σ3)=31(2π)22 0.1000.1 211e−21((0.697;0.460)−(0.403;0.237))T(0.1000.1)−1((0.697;0.460)−(0.403;0.237))+31(2π)22 0.1000.1 211e−21((0.697;0.460)−(0.714;0.346))T(0.1000.1)−1((0.697;0.460)−(0.714;0.346))+31(2π)22 0.1000.1 211e−21((0.697;0.460)−(0.532;0.472))T(0.1000.1)−1((0.697;0.460)−(0.532;0.472))=312π⋅0.11e−21(0.2940.223)(100010)(0.2940.223)+312π⋅0.11e−21(−0.0170.114)(100010)(−0.0170.114)+312π⋅0.11e−21(0.165−0.012)(100010)(0.165−0.012)=0.6π1(e−0.680825+e−0.066425+e−0.136845)
γ 11 = 1 0.6 π e − 0.680825 1 0.6 π ( e − 0.680825 + e − 0.066425 + e − 0.136845 ) ≈ 0.219 \gamma_{11}=\frac{\frac{1}{0.6\pi}e^{-0.680825}}{\frac{1}{0.6\pi}(e^{-0.680825}+e^{-0.066425}+e^{-0.136845})}\approx0.219 γ11=0.6π1(e−0.680825+e−0.066425+e−0.136845)0.6π1e−0.680825≈0.219
γ 12 = α 1 ⋅ p ( x 1 ∣ μ 2 , Σ 2 ) ∑ l = 1 3 α l ⋅ p ( x 1 ∣ μ l , Σ l ) = 1 0.6 π e − 0.066425 1 0.6 π ( e − 0.680825 + e − 0.066425 + e − 0.136845 ) ≈ 0.404 \gamma_{12}=\frac{\alpha_1\cdot p(x_1|\mu_2,\Sigma_2)}{\sum_{l=1}^3\alpha_l\cdot p(x_1|\mu_l,\Sigma_l)}=\frac{\frac{1}{0.6\pi}e^{-0.066425}}{\frac{1}{0.6\pi}(e^{-0.680825}+e^{-0.066425}+e^{-0.136845})}\approx0.404\\ γ12=∑l=13αl⋅p(x1∣μl,Σl)α1⋅p(x1∣μ2,Σ2)=0.6π1(e−0.680825+e−0.066425+e−0.136845)0.6π1e−0.066425≈0.404
γ 13 = α 1 ⋅ p ( x 1 ∣ μ 2 , Σ 2 ) ∑ l = 1 3 α l ⋅ p ( x 1 ∣ μ l , Σ l ) = 1 0.6 π e − 0.136845 1 0.6 π ( e − 0.680825 + e − 0.066425 + e − 0.136845 ) ≈ 0.377 \gamma_{13}=\frac{\alpha_1\cdot p(x_1|\mu_2,\Sigma_2)}{\sum_{l=1}^3\alpha_l\cdot p(x_1|\mu_l,\Sigma_l)}=\frac{\frac{1}{0.6\pi}e^{-0.136845}}{\frac{1}{0.6\pi}(e^{-0.680825}+e^{-0.066425}+e^{-0.136845})}\approx0.377\\ γ13=∑l=13αl⋅p(x1∣μl,Σl)α1⋅p(x1∣μ2,Σ2)=0.6π1(e−0.680825+e−0.066425+e−0.136845)0.6π1e−0.136845≈0.377
得到后验概率后,计算新均值向量
μ 1 , = ∑ j = 1 m γ j 1 x j ∑ j = 1 m γ j 1 = ( 0.491 ; 0.251 ) μ 2 , = ∑ j = 1 m γ j 2 x j ∑ j = 1 m γ j 2 = ( 0.571 ; 0.281 ) μ 3 , = ∑ j = 1 m γ j 3 x j ∑ j = 1 m γ j 3 = ( 0.534 ; 0.295 ) \mu_1^,=\frac{\sum_{j=1}^m\gamma_{j1}x_j}{\sum_{j=1}^m\gamma_{j1}}=(0.491;0.251)\\ \mu_2^,=\frac{\sum_{j=1}^m\gamma_{j2}x_j}{\sum_{j=1}^m\gamma_{j2}}=(0.571;0.281)\\ \mu_3^,=\frac{\sum_{j=1}^m\gamma_{j3}x_j}{\sum_{j=1}^m\gamma_{j3}}=(0.534;0.295)\\ μ1,=∑j=1mγj1∑j=1mγj1xj=(0.491;0.251)μ2,=∑j=1mγj2∑j=1mγj2xj=(0.571;0.281)μ3,=∑j=1mγj3∑j=1mγj3xj=(0.534;0.295)
计算新协方差矩阵
Σ 1 , = ∑ j = 1 m γ j 1 ( x j − μ 1 ) ( x j − μ 1 ) T ∑ j = 1 m γ j 1 = ( 0.025 0.004 0.004 0.016 ) \Sigma_1^,=\frac{\sum_{j=1}^m\gamma_{j1}(x_j-\mu_1)(x_j-\mu_1)^T}{\sum_{j=1}^m\gamma_{j1}}=\begin{pmatrix} 0.025 & 0.004 \\ 0.004 & 0.016 \\ \end{pmatrix} Σ1,=∑j=1mγj1∑j=1mγj1(xj−μ1)(xj−μ1)T=(0.0250.0040.0040.016)
Σ 2 , = ∑ j = 1 m γ j 2 ( x j − μ 2 ) ( x j − μ 2 ) T ∑ j = 1 m γ j 2 = ( 0.023 0.004 0.004 0.017 ) \Sigma_2^,=\frac{\sum_{j=1}^m\gamma_{j2}(x_j-\mu_2)(x_j-\mu_2)^T}{\sum_{j=1}^m\gamma_{j2}}=\begin{pmatrix} 0.023 & 0.004 \\ 0.004 & 0.017 \\ \end{pmatrix} Σ2,=∑j=1mγj2∑j=1mγj2(xj−μ2)(xj−μ2)T=(0.0230.0040.0040.017)
Σ 3 , = ∑ j = 1 m γ j 3 ( x j − μ 3 ) ( x j − μ 3 ) T ∑ j = 1 m γ j 3 = ( 0.024 0.005 0.005 0.016 ) \Sigma_3^,=\frac{\sum_{j=1}^m\gamma_{j3}(x_j-\mu_3)(x_j-\mu_3)^T}{\sum_{j=1}^m\gamma_{j3}}=\begin{pmatrix} 0.024 & 0.005 \\ 0.005 & 0.016 \\ \end{pmatrix} Σ3,=∑j=1mγj3∑j=1mγj3(xj−μ3)(xj−μ3)T=(0.0240.0050.0050.016)
计算新混合系数(此例中m=30,因为有30个样本)
α 1 , = ∑ j = 1 m γ j 1 m = 0.361 \alpha_1^,=\frac{\sum_{j=1}^m\gamma_{j1}}{m}=0.361 α1,=m∑j=1mγj1=0.361
α 2 , = ∑ j = 1 m γ j 2 m = 0.323 \alpha_2^,=\frac{\sum_{j=1}^m\gamma_{j2}}{m}=0.323 α2,=m∑j=1mγj2=0.323
α 3 , = ∑ j = 1 m γ j 3 m = 0.316 \alpha_3^,=\frac{\sum_{j=1}^m\gamma_{j3}}{m}=0.316 α3,=m∑j=1mγj3=0.316
之后进行不断循环迭代,直到收敛或者规定次数后停止。下图是进行5轮、10轮、20轮、50轮迭代的划分结果。
9.5 密度聚类
- 密度聚类的定义
- 密度聚类也称为"基于密度的聚类"。
- 此类算法假设聚类结构能通过样本分布的紧密程度来确定。
- 通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇来获得最终的聚类结果。
DBSCAN算法
- 是基于一组"邻域"参数
( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)
来刻画样本分布的紧密程度。
D = { x 1 , x 2 , . . , x n } D=\{x_1,x_2,..,x_n\} D={x1,x2,..,xn}
-
基本概念:
-
ϵ 领域 : 对样本 x j ∈ D ,其 ϵ 邻域包含样本集 D 中与 x j 的距离不大于 ϵ 的样本 \epsilon领域:对样本x_j\in D,其\epsilon邻域包含样本集D中与x_j的距离不大于\epsilon的样本 ϵ领域:对样本xj∈D,其ϵ邻域包含样本集D中与xj的距离不大于ϵ的样本
-
核心对象:若
样本 x j 的 ϵ 邻域 样本x_j的\epsilon邻域 样本xj的ϵ邻域至少包含MinPts个样本,则该样本点为一个核心对象
-
密度直达:
若样本 x j 位于样本 x i 的 ϵ 邻域中,且 x i 是一个核心对象,则称样本 x j 由 x i 密度直达 若样本x_j位于样本x_i的\epsilon邻域中,且x_i是一个核心对象,则称样本x_j由x_i密度直达 若样本xj位于样本xi的ϵ邻域中,且xi是一个核心对象,则称样本xj由xi密度直达 -
密度可达:
对样本 x i 与 x j , 若存在样本序列 p 1 , p 2 , . . . , p n , 其中 p 1 = x i , p n = x j , 且 p i + 1 由 p i 密度直达,则该 x j 由 x i 密度可达 ; 对样本x_i与x_j,若存在样本序列p_1,p_2,...,p_n,其中p_1=x_i,p_n=x_j,且p_{i+1}由p_i密度直达,则该x_j由x_i密度可达; 对样本xi与xj,若存在样本序列p1,p2,...,pn,其中p1=xi,pn=xj,且pi+1由pi密度直达,则该xj由xi密度可达; -
密度相连:
对样本 x i 与 x j , 若存在 x k 使得 x i 与 x j 均由 x k 密度可达,则称该两样本密度相连。 对样本x_i与x_j,若存在x_k使得x_i与x_j均由x_k密度可达,则称该两样本密度相连。 对样本xi与xj,若存在xk使得xi与xj均由xk密度可达,则称该两样本密度相连。
-
-
"簇"的定义
- 由密度可达关系导出的最大密度相连样本集合。
-
"簇"的形式化描述
-
给定邻域参数
( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)簇是满足以下性质的非空样本子集:
-
连接性:
x i ∈ C , x j ∈ C → x i 与 x j 密度相连 x_i\in C,x_j\in C→x_i与x_j密度相连 xi∈C,xj∈C→xi与xj密度相连 -
最大性:
x i ∈ C , x i 与 x j 密度可达 → x j ∈ C x_i\in C,x_i与x_j密度可达→x_j\in C xi∈C,xi与xj密度可达→xj∈C
-
-
实际上,若x为核心对象,由x密度可达的所有样本组成的集合记为
X = { x ′ ∈ D ∣ x ′ 由 x 密度可达 } X=\{x'\in D|x'由x密度可达\} X={x′∈D∣x′由x密度可达}则X为满足连接性与最大性的簇。
-
下图是西瓜数据集通过DBSCAN算法的聚类结果
-
优点
-
这种算法能够发现并排除噪声点的干扰
-
也比较稳定,多次的执行,结果大概率是一样的,就像图的广度优先遍历一样,最后形成的簇是固定的
-
算法执行速度快,因为属于一次性遍历结点。
-
-
缺点
-
需要不断调节参数
( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts) -
不适用样本不均匀的情况
-
样本较多的情况下,收敛时间会延长
-
9.6 层次聚类
-
层次聚类在不同层次对数据集进行划分,从而形成树形的聚类结构 。数据集划分既可采用"自底向上 "的聚合策略,也可采用"自顶向下"的分拆策略。
-
AGNES算法(自底向上的层次聚类算法)
- 首先,将样本中的每一个样本看做一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直到达到预设的聚类簇的个数。
-
两个聚类簇
C i 和 C j C_i和C_j Ci和Cj的距离,可以有3种度量方式
-
最小距离(单链接):
d m i n ( C i , C j ) = min x ∈ C i , z ∈ C j d i s t ( x , z d_{min}(C_i,C_j)=\min_{x\in C_i,z\in C_j}dist(x, z dmin(Ci,Cj)=x∈Ci,z∈Cjmindist(x,z -
最大距离(全链接):
d m a x ( C i , C j ) = max x ∈ C i , z ∈ C j d i s t ( x , z ) d_{max}(C_i,C_j)=\max_{x\in C_i,z\in C_j}dist(x,z) dmax(Ci,Cj)=x∈Ci,z∈Cjmaxdist(x,z) -
平均距离(均链接):
d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ z ∈ C j d i s t ( x , z ) d_{avg}(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum_{x\in C_i}\sum_{z\in C_j}dist(x,z) davg(Ci,Cj)=∣Ci∣∣Cj∣1x∈Ci∑z∈Cj∑dist(x,z)
-
AGNES算法如下:
现以一个具体例子为例,模拟AGNES算法流程
-
把5个样本分为5个簇
C 1 = { x 1 } 、 C 2 = { x 2 } 、 C 3 = { x 3 } 、 C 4 = { x 4 } 、 C 5 = { x 5 } C_1=\{x_1\}、C_2=\{x_2\}、C_3=\{x_3\}、C_4=\{x_4\}、C_5=\{x_5\} C1={x1}、C2={x2}、C3={x3}、C4={x4}、C5={x5} -
计算M距离矩阵(注意:是簇之间的距离)
1 2 3 4 5 1 0 1 √10 √20 3 2 1 0 √5 √17 2 3 √10 √5 0 √10 1 4 √20 √17 √10 0 √17 5 3 2 1 √17 0 -
设置当前聚类簇个数
q = 5 q=5 q=5 -
假设我们指定k=1(合并成一个簇),则接下来将开始合并
-
簇1和簇2距离最近(从编号小的开始扫描),则合并簇1和簇2,并将编号重新调整
C 1 = { x 1 , x 2 } 、 C 2 = { x 3 } 、 C 3 = { x 4 } 、 C 4 = { x 5 } C_1=\{x_1,x_2\}、C_2=\{x_3\}、C_3=\{x_4\}、C_4=\{x_5\} C1={x1,x2}、C2={x3}、C3={x4}、C4={x5}
-
矩阵M中需要将原先簇2的信息删除,并且需要将新的簇1信息进行更改
重新计算距离得到新的M矩阵
1 2 3 4 1 0 √5 √17 2 2 √5 0 √10 1 3 √17 √10 0 √17 4 2 1 √17 0 此时
q = 4 q=4 q=4 -
完成第一次的聚类,接着继续找到距离最近的两个簇,分别是簇2和簇4,进行合并,并对编号进行调整
C 1 = { x 1 , x 2 } 、 C 2 = { x 3 , x 5 } 、 C 3 = { x 4 } C_1=\{x_1,x_2\}、C_2=\{x_3,x_5\}、C_3=\{x_4\} C1={x1,x2}、C2={x3,x5}、C3={x4}
-
矩阵M中需要将原先簇4的信息删除,并且需要将新的簇2信息进行更改
重新计算距离得到新的M矩阵
1 2 3 1 0 2 √17 2 2 0 √10 3 √17 √10 0 此时
q = 3 q=3 q=3 -
完成第二次的聚类,接着继续找到距离最近的两个簇,分别是簇1和簇2,进行合并,并对编号进行调整
C 1 = { x 1 , x 2 , x 3 , x 5 } 、 C 2 = { x 4 } C_1=\{x_1,x_2,x_3,x_5\}、C_2=\{x_4\} C1={x1,x2,x3,x5}、C2={x4}
-
矩阵M中需要将原先簇2的信息删除,并且需要将新的簇1信息进行更改
重新计算距离得到新的M矩阵
1 2 1 0 √10 2 √10 0 此时
q = 2 q=2 q=2 -
完成第三次的聚类,接着继续找到距离最近的两个簇,此时只剩簇1和簇2,进行最后一次合并
C 1 = { x 1 , x 2 , x 3 , x 5 , x 4 } C_1=\{x_1,x_2,x_3,x_5,x_4\} C1={x1,x2,x3,x5,x4} -
完成第四次的聚类,结束
-
-
可以得到如下图所示的树状图
9.7 kmeans手动算法实现
- 导包
python
from numpy import *
import matplotlib. pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
- 导入数据
python
#鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类5个数据,每个数据包含4个属性。
#可通过花萼的长度、花萼的宽度、花瓣的长度、花瓣的宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Vixginica)三个种类中的哪一类。
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length','sepal-width','petal-length','petal-width','class']#花萼的长度、花萼的宽度、花瓣的长度、花瓣的宽度、类别
dataset = pd.read_csv(url,names=names)
dataset['class'][dataset['class']=='Iris-setosa']=0
dataset['class'][dataset['class']=='Iris-versicolor']=1
dataset['class'][dataset['class']=='Iris-virginica']=2
#对类别进行编码,3个类别分别赋值0,1,2
- 计算距离
python
def distEclud(vecA,vecB):
#两个向量间欧式距离
return sqrt(sum(power(vecA-vecB,2)))
- 初始化整类中心
python
def randChosenCent(dataset,k):
#样本数
m=shape(dataset)[0]
#初始化列表
centroidsIndex=[]
#生成类似子样本索引的列表
dataIndex=list(range(m))
for i in range(k):
#生成随机数
randIndex=random.randint(0,len(dataIndex))
#将随机产生的样本的索引放入centroidsIndex
centroidsIndex.append(dataIndex[randIndex])
#删除已经被抽中的样本
del dataIndex[randIndex]
#根据索引获取样本
centroids = dataset.iloc[centroidsIndex]
return mat(centroids)
- kMeans算法实现
python
def kMeans(dataset,k):
#料本总数
m=shape (dataset)[0] #150*2
#分配样本到最近的簇:存[簇序号,距离的平方]
# m行2列
c1usterAssment = mat(zeros((m,2)))
#step1:
#通过随机产生的祥本点初始化聚类中心
centroids = randChosenCent(dataset,k)
print('最初的中心=', centroids)
#标志位,如聚迭代前后样本分类发生变化值为True,否则为False
c1usterChanged = True
#查看迭代次数
iterTime=0
#所有样本分配结果不再改变,迭代终止
while c1usterChanged:
c1usterChanged = False
#step2:分配到最近的聚类中心对应的簇中
for i in range(m):
#初始定义距离为无穷大
minDist = inf
#初始化索引值
minIndex = -1
#计算每个样本与k个中心点距离
for j in range(k):
#计笄第i个样本到第j个中心点的距离
distJI = distEclud(centroids[j,:],dataset.values[i,:])
#判断距离是否为最小
if distJI < minDist:
#更新获取到最小距离
minDist = distJI
#获耽对应的簇序号
minIndex = j
#样本上次分配结果跟本次不一样,标志位clusterChanged置True
if c1usterAssment[i,0]!=minIndex:
clusterChanged = True
c1usterAssment[i,:] = minIndex, minDist**2#分配样本到最近的簇
iterTime+=1
sse=sum(c1usterAssment[:,1])
print('the SSE of %d'%iterTime+'th iteration is %f'%sse)
#step3:更新聚类中心
for cent in range(k):#样本分配结束后,重新计算聚类中心
#获取该簇所有的样本点
#nonzero函数是numpy中用于得到数组array中非零元素的位置
#它的返回值是一个长度为
ptsInClust=dataset.iloc[nonzero(c1usterAssment[:,0].A==cent)[0]]
#更新聚类中心,axis=0沿列方向求均值
centroids[cent,:]=mean(ptsInClust,axis=0)
return centroids,c1usterAssment
- 二维空间聚类效果显示
python
def datashow(dataSet, k, centroids,clusterAssment):
num,dim=shape (dataSet) #样本数num,维数dim
if dim!=2:
print ('sorry,the dimension of your dataset is not 2!')
return 1
marksamples=['or', 'ob', 'og', 'ok','"r','b', '<g']#样本图形标记
if k>len(marksamples):
print('sorry, your k is too large, please add length of the marksample!')
return 1
#绘所有样本
for i in range(num):
markindex=int(clusterAssment[i, 0])#矩阵形式转为int值,簇序号
#特征维对应坐标轴x,y;样本图形标记及大小
#区分iat,at, iloc, ioc ;
#iat,iloc按照索引的位置来进行选取
#at,loc是按照索引(index)的值来选取
plt.plot(dataSet.iat[i,0],dataSet.iat[i,1],marksamples[markindex],markersize=6)
#绘中心点
markcentroids=['o','w','^']#聚类中心图形标记
label=['0','i','2']
c=['yellow','pink','red']
for i in range(k):
plt.plot(centroids[i,0],centroids[i, 1], markcentroids[i], markersize=15,label=label[i],c=c[i])
plt.legend(loc = 'upper left')
plt.xlabel('sepal 1ength')
plt.ylabel('sepal width')
plt.title('k-means cluster result')#标题
plt.show()
- 实际图像
python
def trgartshow (dataset,k,labels):
from matplotlib import pyplot as plt
num,dim=shape (dataset)
label=['0','1','2']
marksamples=['ob','or','og','ok','r','b','<g']
#通过循环的方武,完成分组散点图的绘制
for i in range (num) :
plt.plot(datamat. iat[i,0],datamat.iat[i,1],marksamples[int(labels.iat[i,0])],markersize=6)
for i in range(0, num,50) :
plt.plot(datamat.iat[i,0],datamat.iat[i,1],marksamples[int(labels.iat[i,0])],markersize=6,label=label)
plt.legend(loc = 'upper left')
#添加轴标签和标题
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title(' iris true result')
plt.show()
#label=labels.iatli,03
- 聚类前原始样本点的绘制
python
def originalDatashow(dataset):
#样本的个数和特征维数
num,dim=shape(dataset)
marksamples=['ob'] #样本图形标记
for i in range(num):
plt.plot(datamat.iat[i,0],datamat.iat [i,1],marksamples[0],markersize=5)
plt.title('original dataset')
plt.xlabel('sepal length')
plt.ylabel('sepal width')#标题
plt.show()
python
if __name__=='__main__':
datamat=dataset.loc[:,['sepal-length','sepal-width']]
#真实的标签
labels=dataset.loc[:,['class']]
##原始数据显示
originalDatashow(datamat)
##kmeans聚类
k=3#用户定义聚类数
mycentroids,clusterAssment=kMeans(datamat,k)
#mycentroids,clustcrAssment=kMeansSSE(datamat,k)
#绘图显示
datashow(datamat,k,mycentroids,clusterAssment)
trgartshow(datamat,3,labels)
因为我们只取两个属性进行聚类分析,所以可以看到结果出现了一些偏差,可以看到聚类结果中第3类跟真实样本的结果差不多;因为第1类和第2类在真实的分类中,确实分隔得不太明显,所以对于聚类结果来说,第1类和第2类有点儿混在了一起,如果增加属性的维度,聚类的正确率可能会进一步提高
9.8 kmeans算法运用
- 导包
python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
- kmeans算法运用
python
plt.figure(figsize=(12,12))
n_samples=1500
random_state=170
X,y=make_blobs(n_samples=n_samples,random_state=random_state)
#sklearn.datasets.make_blobs(n_samples=100,n_features=2,center=3,cluster_std=1.0,center_box=(-10.0,10.0),shuffle=True,random_state=None)
#center=3:生成3个类
#Incorrect number if clusters
y_pred=KMeans(n_clusters=2,random_state=random_state).fit_predict(X)
plt.subplot(221)
plt.scatter(X[:,0],X[:,1],c=y_pred)
plt.title("Incorrect Number of Bolbs")
#Anisotropicly distributed data
transformation=[[0.60834549,-0.63667341],[-0.40887718,0.85253229]]
# transformation=[[0.6,-0.6],[-0.4,0.8]]
X_aniso=np.dot(X,transformation)#矩阵相乘
y_pred=KMeans(n_clusters=3,random_state=random_state).fit_predict(X_aniso)
plt.subplot(222)
plt.scatter(X_aniso[:,0],X_aniso[:,1],c=y_pred)
plt.title("Anisotropicly Distributed Blobs")
#Different variance
X_varied,y_varied=make_blobs(n_samples=n_samples,
cluster_std=[1.0,2.5,0.5],#三类数据的标准差
random_state=random_state)
y_pred=KMeans(n_clusters=3,random_state=random_state).fit_predict(X_varied)
plt.subplot(223)
plt.scatter(X_varied[:,0],X_varied[:,1],c=y_pred)
plt.title("Unequal Variance")
#Unevenly sized blobs
X_filtered=np.vstack((X[y==0][:500],X[y==1][:100],X[y==2][:10]))
y_pred=KMeans(n_clusters=3,random_state=random_state).fit_predict(X_filtered)
plt.subplot(224)
plt.scatter(X_filtered[:,0],X_filtered[:,1],c=y_pred)
plt.title("Unevenly Sized Blobs")
plt.show()
- 第一张图,我们错误设置了k的值,可以看到,k的值一旦设置错误,就算我们能够明显的看出这可以分成3类,但也无济于事
- 第二张图,我们将数据进行了一个拉伸,拉伸后的数据使得kmeans算法并不能很好的分辨出各自的类别
- 第三张图,我们设置了三组不同方差的数据,三撮数据的边缘并不能很好的进行归类,方差越大,该组的数据很容易就归为其他类
- 第4张图,我们取了不同大小的数据集,对kmeans算法的实现也产生了一定的影响