【机器学习第9章——聚类】

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 {Cll=1,2,...k}D=l=1kCl,Cl,l,=lCl=
      相应地,用
      λ ∈ { 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} xjCλ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^*对应的簇标记向量 λλ分别表示与CC对应的簇标记向量
我们将样本两两配对考虑,定义
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(m1)=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+baa+ca

    • Rand指数(RI)
      R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m1)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(C1)21ijCdist(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)=max1ijCdist(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)=minxiCi,xjCjdist(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=1kj=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=1ikmin{j=imax(max1lkdiam(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=1nxiuxjup)p1

      • 例如

        ageheightweight
        小明1417250
        小红1316448

        小明记为样本 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)=((1413)p+(172164)p+(5048)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=1k mu,amu,a,imu,bmu,b,i p

      • 例如

        ageheightweightmode
        小明1417250飞机
        小红1316448汽车
        小白1517049火车

        经过统计,班级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)=20151515p+205150p

    • 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=1ncxiuxjup+u=nc+1nVDMp(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)=(ω1xi1xj1p+...+ωnxinxjnp)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=1kxCi∣∣xμi22μi是簇Ci的均值向量(Ci1xCix)xCi∣∣xμi22为簇中的所有点距离中心点的距离和
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.6970.403)2+(0.4600.237)2 =0.369(样本1到簇1的距离)d12=(0.6970.343)2+(0.4600.099)2 =0.506(样本1到簇2的距离)d13=(0.6970.532)2+(0.4600.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,xj2=∣∣pi+η(xjpi)xj2=(1η)∣∣pixj2
如果样本标记与预设标记不一致,之间的距离为
∣ ∣ 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,xj2=∣∣piη(xjpi)xj2=(1+η)∣∣pixj2
例如,我们以西瓜数据集为例

在这里插入图片描述

虽然瓜可以只分为两类(好瓜和坏瓜),但是学习向量量化算法可以划分为更具体的子类,所以我们可以想让它划分为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.6970.556)2+(0.4600.215)2 =0.283(x1p1的距离)d12=(0.6970.343)2+(0.4600.099)2 =0.506(x1p2的距离)d13=(0.6970.359)2+(0.4600.188)2 =0.434(x1p3的距离)d14=(0.6970.483)2+(0.4600.312)2 =0.260(x1p4的距离)d15=(0.6970.725)2+(0.4600.445)2 =0.032(x1p5的距离)
发现样本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+η(x1p5)=(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∣Σ211e21(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=1kp(zj=i)p(xjzj=i)=i=1kαip(xμi,Σi)全概率公式展开k个高斯分布共同构成一个x向量其中,μiΣi是第i高斯混合成分的参数。αi>0为相应的混合系数,i=1kα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属于哪一个高斯分布) zj1,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=ixj)简记为γji=p(xj)p(zj=i)p(xjzj=i)=p(xj)αip(xjμi,Σi)=l=1kp(zj=l)p(xjzj=l)αip(xjμi,Σi)=l=1kαlp(xjμl,Σl)αip(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=1kp(xj))=j=1mln(i=1kαip(xjμi,Σi))

    • 对均值求偏导,并令其等于零进行求解
      ∂   L L ( D ) ∂   μ i \frac{\partial\,LL(D)}{\partial\,\mu_i} μiLL(D)
      在这里插入图片描述

    • 对协方差矩阵求偏导,并令其等于零进行求解
      ∂   L L ( D ) ∂   Σ i \frac{\partial\,LL(D)}{\partial\,\Sigma_i} ΣiLL(D)
      在这里插入图片描述

      在这里插入图片描述

    • 接着需要用拉格朗日对
      α i \alpha_i αi
      求解,并且条件满足
      α i ≥ 0 , ∑ i = 1 k α i = 1 \alpha_i\geq0,\sum_{i=1}^k\alpha_i=1 αi0,i=1kα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=1kαi1)
      对其求导,并令其等于零进行求解

      在这里插入图片描述

算法流程如下:

在这里插入图片描述

还是以西瓜数据集为例,假设我们要划分成三类,也就是高斯混合成分的个数
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αlp(x1μl,Σl)α1p(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} 分子:α1p(x1μ1,Σ1)=31(2π)22 0.1000.1 211e21((0.697;0.460)(0.403;0.237))T(0.1000.1)1((0.697;0.460)(0.403;0.237))=312π0.11e21(0.2940.223)(100010)(0.2940.223)=0.6π1e0.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=13αlp(x1μl,Σl)=α1p(x1μ1,Σ1)+α2p(x1μ2,Σ2)+α3p(x1μ3,Σ3)=31(2π)22 0.1000.1 211e21((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 211e21((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 211e21((0.697;0.460)(0.532;0.472))T(0.1000.1)1((0.697;0.460)(0.532;0.472))=312π0.11e21(0.2940.223)(100010)(0.2940.223)+312π0.11e21(0.0170.114)(100010)(0.0170.114)+312π0.11e21(0.1650.012)(100010)(0.1650.012)=0.6π1(e0.680825+e0.066425+e0.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(e0.680825+e0.066425+e0.136845)0.6π1e0.6808250.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αlp(x1μl,Σl)α1p(x1μ2,Σ2)=0.6π1(e0.680825+e0.066425+e0.136845)0.6π1e0.0664250.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αlp(x1μl,Σl)α1p(x1μ2,Σ2)=0.6π1(e0.680825+e0.066425+e0.136845)0.6π1e0.1368450.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γj1j=1mγj1xj=(0.491;0.251)μ2,=j=1mγj2j=1mγj2xj=(0.571;0.281)μ3,=j=1mγj3j=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γj1j=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γj2j=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γj3j=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,=mj=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,=mj=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,=mj=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的样本 ϵ领域:对样本xjD,其ϵ邻域包含样本集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是一个核心对象,则称样本xjxi密度直达

    • 密度可达:
      对样本 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密度可达; 对样本xixj,若存在样本序列p1,p2,...,pn,其中p1=xi,pn=xj,pi+1pi密度直达,则该xjxi密度可达;

    • 密度相连:
      对样本 x i 与 x j , 若存在 x k 使得 x i 与 x j 均由 x k 密度可达,则称该两样本密度相连。 对样本x_i与x_j,若存在x_k使得x_i与x_j均由x_k密度可达,则称该两样本密度相连。 对样本xixj,若存在xk使得xixj均由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密度相连 xiC,xjCxixj密度相连

      • 最大性:
        x i ∈ C , x i 与 x j 密度可达 → x j ∈ C x_i\in C,x_i与x_j密度可达→x_j\in C xiC,xixj密度可达xjC

    • 实际上,若x为核心对象,由x密度可达的所有样本组成的集合记为
      X = { x ′ ∈ D ∣ x ′ 由 x 密度可达 } X=\{x'\in D|x'由x密度可达\} X={xDxx密度可达}
      则X为满足连接性与最大性的簇。

在这里插入图片描述

下图是西瓜数据集通过DBSCAN算法的聚类结果

  • 优点

    • 这种算法能够发现并排除噪声点的干扰

    • 也比较稳定,多次的执行,结果大概率是一样的,就像图的广度优先遍历一样,最后形成的簇是固定的

    • 算法执行速度快,因为属于一次性遍历结点。

  • 缺点

    • 需要不断调节参数
      ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)

    • 不适用样本不均匀的情况

    • 样本较多的情况下,收敛时间会延长

在这里插入图片描述

9.6 层次聚类

  • 层次聚类在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集划分既可采用“自底向上”的聚合策略,也可采用“自顶向下”的分拆策略。

  • AGNES算法(自底向上的层次聚类算法)

    • 首先,将样本中的每一个样本看做一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直到达到预设的聚类簇的个数。
  • 两个聚类簇
    C i 和 C j C_i和C_j CiCj
    的距离,可以有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)=xCi,zCjmindist(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)=xCi,zCjmaxdist(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∣∣Cj1xCizCjdist(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距离矩阵(注意:是簇之间的距离)

    12345
    101√10√203
    210√5√172
    3√10√50√101
    4√20√17√100√17
    5321√170
  • 设置当前聚类簇个数
    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矩阵

      1234
      10√5√172
      2√50√101
      3√17√100√17
      421√170

      此时
      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矩阵

      123
      102√17
      220√10
      3√17√100

      此时
      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矩阵

      12
      10√10
      2√100

      此时
      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手动算法实现

  • 导包
from numpy import *
import matplotlib. pyplot as plt
import pandas as pd
from matplotlib import pyplot as plt
  • 导入数据
#鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含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
  • 计算距离
def distEclud(vecA,vecB):
    #两个向量间欧式距离
    return sqrt(sum(power(vecA-vecB,2)))
  • 初始化整类中心
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算法实现
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
  • 二维空间聚类效果显示
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()
  • 实际图像
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

  • 聚类前原始样本点的绘制
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()
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算法运用

  • 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
  • kmeans算法运用
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()

在这里插入图片描述

  1. 第一张图,我们错误设置了k的值,可以看到,k的值一旦设置错误,就算我们能够明显的看出这可以分成3类,但也无济于事
  2. 第二张图,我们将数据进行了一个拉伸,拉伸后的数据使得kmeans算法并不能很好的分辨出各自的类别
  3. 第三张图,我们设置了三组不同方差的数据,三撮数据的边缘并不能很好的进行归类,方差越大,该组的数据很容易就归为其他类
  4. 第4张图,我们取了不同大小的数据集,对kmeans算法的实现也产生了一定的影响
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值