Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模

线性分类模型之判别函数的几何建模

文章目录

  • 线性分类模型之判别函数的几何建模
        • 1. 判别函数
          • 1.1 两类问题
          • 1.2 多类问题
          • 1.3 Fisher 线性判别 LDA 算法
          • 1.3 代码实现
          • 1.4 结果输出
          • **注释:**
        • 2. 感知机方法
        • 3. 小结

分类问题是将输入向量 x ∈ R d \mathbf{x}\in R^d xRd 分配到 K K K 个离散的类 { C k ∣ k = 1 , ⋯   , k } \{\mathcal{C}_k|k=1,\cdots,k\} {Ckk=1,,k} 中,通常,一个输入只能分配且只能分配到唯一的一个类。输入空间被分界面分割成不同的决策域,如果分类面是输入向量 x \mathbf{x} x 的线性函数时,此分类面可以看作是 D D D 维空间中的 D − 1 D-1 D1 维分类面,即数据集被超平面严格分开,称为 线性可分

分类问题可以分为两分类和多分类问题,对于输入向量 x \mathbf{x} x,二分类的输出为 t ∈ { 0 , 1 } t\in\{0,1\} t{0,1},对于多分类问题,出输出采用 One-hot 的方式,如 5 类问题的第二类 t = ( 0 , 1 , 0 , 0 , 0 ) \mathbf{t}=(0,1,0,0,0) t=(0,1,0,0,0).

构造分类函数的方法主要有三种:

(1)直接构造判别函数 y ( x ) = f ( w T x + w 0 ) y(\mathbf{x})=f(\mathbf{w}^T\mathbf{x}+w_0) y(x)=f(wTx+w0).

(2)通过概率构造 p ( C k ∣ x ) p(\mathcal{C}_k\vert\mathbf{x}) p(Ckx),通过概率的大小确定类别。

(3)通过概率构造生成模型,通过先验和似然获取后验概率,即
p ( C k ∣ x ) = p ( x ∣ C k ) p ( C k ) p ( x ) p(\mathcal{C}_k\vert\mathbf{x})=\frac{p(\mathbf{x}\vert\mathcal{C}_k)p(\mathcal{C}_k)}{p(\mathbf{x})} p(Ckx)=p(x)p(xCk)p(Ck)

1. 判别函数

在线性回归模型中,通过 y ( x ) = w T x + w 0 y(\mathbf{x})=\mathbf{w}^T\mathbf{x}+w_0 y(x)=wTx+w0 来获取一个实数值,如果需要判断一个类别时,我们可以通过构造一种函数,将函数值限制在 [ 0 , 1 ] [0,1] [0,1] 中,为了达到这种效果,我们可以借助于一个非线性函数 f ( ⋅ ) f(\cdot) f() 来构造参数 w \mathbf{w} w 的线性函数
y ( x ) = f ( w T x + w 0 ) y(\mathbf{x})=f(\mathbf{w}^T\mathbf{x}+w_0) y(x)=f(wTx+w0)
在机器学习中, f ( ⋅ ) f(\cdot) f() 称为激活函数,在统计学中该函数的拟函数称为连接函数。相应地,决策面函数为
y ( x ) = constant y(\mathbf{x})=\text{constant} y(x)=constant
也可以写作
w T x + w 0 = constant (1) \mathbf{w}^T\mathbf{x}+w_0=\text{constant}\tag{1} wTx+w0=constant(1)
因此,尽管 f ( ⋅ ) f(\cdot) f() 是非线性函数,但是分界面公式(1)仍然是关于 x \mathbf{x} x 一个线性函数,称为广义线性模型

1.1 两类问题

线性判别函数最简单的表示是通过取输入向量 x \mathbf{x} x 的线性函数来获得的
y ( x ) = w T x + w 0 y(\mathbf{x})=\mathbf{w}^T\mathbf{x}+w_0 y(x)=wTx+w0
其中 w w w 被称为权重向量, w 0 w_0 w0 是偏置(不要与统计学意义上的偏差混淆)。如果输入向量 x \mathbf{x} x 对应的函数值 y ( x ) ≥ 0 y(\mathbf{x})\geq 0 y(x)0,则被分配到第一类 x ∈ C 1 \mathbf{x}\in \mathcal{C}_1 xC1,否则, x ∈ C 2 \mathbf{x}\in \mathcal{C}_2 xC2. 因此,对应的判定边界由函数 y ( x ) = 0 y(\mathbf{x}) = 0 y(x)=0 确定,该关系对应于 D D D 维输入空间内的 ( D − 1 ) (D-1) (D1) 维超平面。考虑位于决策面上的两个点 x A \mathbf{x}_A xA x B \mathbf{x}_B xB,由于 y ( x A ) = y ( x B ) = 0 y(\mathbf{x}_A)=y(\mathbf{x}_B)=0 y(xA)=y(xB)=0,因此有 w T ( x A − x B ) = 0 \mathbf{w}^T(\mathbf{x}_A−\mathbf{x}_B)=0 wT(xAxB)=0,因此向量 w \mathbf{w} w 与位于决策曲面内的每个向量正交, w \mathbf{w} w 确定决策曲面的方向(即向量 w \mathbf{w} w 是决策面的法向量)。类似地,如果 x \mathbf{x} x 是决策曲面上的一个点,那么 y ( x ) = 0 y(\mathbf{x}) = 0 y(x)=0 ,即
w T x ∣ ∣ w ∣ ∣ = − w 0 ∣ ∣ w ∣ ∣ \frac{\mathbf{w}^T\mathbf{x}}{\vert\vert\mathbf{w}\vert\vert}=\frac{-w_0}{\vert\vert\mathbf{w}\vert\vert} wwTx=ww0
**注释:**上式表明分界面上的向量在绿色直线上的投影,即原点到分界面的距离。
Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第1张图片

对于空间中任意一点 x \mathbf{x} x,可以表示为
x = x ⊥ + r ⋅ w ∥ w ∥ (2) \mathbf{x}=\mathbf{x}_\perp + r\cdot\frac{\mathbf{w}}{\Vert\mathbf{w}\Vert}\tag{2} x=x+rww(2)
公式(2)两边左乘 w T \mathbf{w}^T wT,然后加上 w 0 w_0 w0,得
w T x + w 0 = w T x ⊥ + w 0 + r ⋅ w T w ∥ w ∥ \mathbf{w}^T\mathbf{x}+w_0=\mathbf{w}^T\mathbf{x}_\perp+w_0 + r\cdot\frac{\mathbf{w}^T\mathbf{w}}{\Vert\mathbf{w}\Vert} wTx+w0=wTx+w0+rwwTw
即,点到直线的距离 r r r
r = y ( x ) ∥ w ∥ r = \frac{y(\mathbf{x})}{\Vert\mathbf{w}\Vert} r=wy(x)

注释: 公式(2)中的系数 r r r 可看作是向量的模。

为了书写更加简洁,可引入哑变量 x 0 = 1 x_0=1 x0=1,然后定义 w ~ = ( w 0 , w ) \widetilde{\mathbf{w}}=(w_0,\mathbf{w}) w =(w0,w) x ~ = ( x 0 , x ) \widetilde{\mathbf{x}}=(x_0,\mathbf{x}) x =(x0,x),则
y ( x ) = w ~ T x ~ y(\mathbf{x})=\widetilde{\mathbf{w}}^T\widetilde{\mathbf{x}} y(x)=w Tx

1.2 多类问题

y k ( x ) = w k T x + w k 0 y_k(\mathbf{x})=\mathbf{w}_k^T\mathbf{x}+w_{k0} yk(x)=wkTx+wk0

( w k − w j ) T x + ( w k 0 − w j 0 ) = 0 (\mathbf{w}_k-\mathbf{w}_j)^T\mathbf{x}+(w_{k0}-w_{j0})=0 (wkwj)Tx+(wk0wj0)=0

x ^ = λ x A + ( 1 − λ ) x B \hat{\mathbf{x}}=\lambda\mathbf{x}_A+(1-\lambda)\mathbf{x}_B x^=λxA+(1λ)xB

y k ( x ^ ) = λ y k ( x A ) + ( 1 − λ ) y k ( x B ) y_k(\hat{\mathbf{x}})=\lambda y_k(\mathbf{x}_A)+(1-\lambda)y_k(\mathbf{x}_B) yk(x^)=λyk(xA)+(1λ)yk(xB)

多分类问题的最小二乘法:
y k ( x ) = w k T x + w k 0 y_k(\mathbf{x})=\mathbf{w}_k^T\mathbf{x}+w_{k0} yk(x)=wkTx+wk0

y ( x ) = ( y 1 ( x ) y 2 ( x ) ⋮ y K ( x ) ) = ( w ~ 1 T w ~ 2 T ⋮ w ~ K T ) x ~ = W ~ T x ~ \boldsymbol{y}(\mathbf{x})=\left( \begin{array}{c} %该矩阵一共3列,每一列都居中放置 y_1(\mathbf{x})\\ %第一行元素 y_2(\mathbf{x})\\ %第二行元素 \vdots \\ y_K(\mathbf{x}) \end{array} \right)=\left( \begin{array}{c} %该矩阵一共3列,每一列都居中放置 \widetilde{\mathbf{w}}_1^T\\ %第一行元素 \widetilde{\mathbf{w}}_2^T\\ %第二行元素 \vdots \\ \widetilde{\mathbf{w}}_K^T \end{array} \right)\widetilde{\mathbf{x}}=\widetilde{\mathbf{W}}^T\widetilde{\mathbf{x}} y(x)=y1(x)y2(x)yK(x)=w 1Tw 2Tw KTx =W Tx

E D ( W ~ ) = 1 2 T r { ( X ~ W ~ − T ) T ( X ~ W ~ − T ) } E_D(\widetilde{\mathbf{W}})=\frac{1}{2}Tr\Big\{(\widetilde{\mathbf{X}}\widetilde{\mathbf{W}}-\mathbf{T})^T(\widetilde{\mathbf{X}}\widetilde{\mathbf{W}}-\mathbf{T})\Big\} ED(W )=21Tr{(X W T)T(X W T)}

∂ E D ( W ~ ) ∂ W ~ = X ~ T ( X ~ W ~ − T ) = X ~ T X ~ W ~ − X ~ T T = 0 \frac{\partial E_D(\widetilde{\mathbf{W}})}{\partial \widetilde{\mathbf{W}}}=\widetilde{\mathbf{X}}^T(\widetilde{\mathbf{X}}\widetilde{\mathbf{W}}-\mathbf{T})=\widetilde{\mathbf{X}}^T\widetilde{\mathbf{X}}\widetilde{\mathbf{W}}-\widetilde{\mathbf{X}}^T\mathbf{T}=\boldsymbol{0} W ED(W )=X T(X W T)=X TX W X TT=0

W ~ = ( X ~ T X ~ ) − 1 X ~ T ⏟ X ~ † T = X ~ † T \widetilde{\mathbf{W}}=\underbrace{(\widetilde{\mathbf{X}}^T\widetilde{\mathbf{X}})^{-1}\widetilde{\mathbf{X}}^T}_{\widetilde{\mathbf{X}}^\dagger}\mathbf{T}=\widetilde{\mathbf{X}}^\dagger\mathbf{T} W =X (X TX )1X TT=X T

y ( x ) = W ~ T x ~ = T T ( X ~ † ) T x ~ \boldsymbol{y}(\mathbf{x})=\widetilde{\mathbf{W}}^T\widetilde{\mathbf{x}}=\mathbf{T}^T(\widetilde{\mathbf{X}}^\dagger)^T\widetilde{\mathbf{x}} y(x)=W Tx =TT(X )Tx

1.3 Fisher 线性判别 LDA 算法

分类面在空间中的表示方法:

Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第2张图片

过原点的直线(法向量为 w \mathbf{w} w)
w T x = 0 \mathbf{w}^T\mathbf{x}=0 wTx=0
不过原点的直线(法向量为 w \mathbf{w} w)
w T x = c \mathbf{w}^T\mathbf{x}=c wTx=c
有一种分类建模的方法是从降维的角度认识的,将 D D D 维空间上的输入向量 x \mathbf{x} x 投影到一维直线上,可通过内积形式完成
y = w T x y=\mathbf{w}^T\mathbf{x} y=wTx
可对y设置一个阈值进行分类,当 y ≥ − w 0 y\geq -w_0 yw0 则认为是类 C 1 \mathcal{C}_1 C1,否则为类 C 2 \mathcal{C}_2 C2. 一般来说,投影到一维上会导致大量的信息丢失,并且在原始的D维空间中很好地分离的类可能在一维中变得很强地重叠。然而,通过调整权重向量 w \mathbf{w} w 的分量,我们可以选择最大化类分离的投影。

Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第3张图片

对于一个两类问题,其中有 C 1 \mathcal{C}_1 C1 类的 N 1 N_1 N1 个点和 C 2 \mathcal{C}_2 C2 类的 N 2 N_2 N2 个点,因此这两类的平均向量表示为
m 1 = 1 N 1 ∑ n ∈ C 1 x n ,                                      m 2 = 1 N 1 ∑ n ∈ C 2 x n \mathbf{m}_1=\frac{1}{N_1}\sum_{n\in\mathcal{C}_1}\mathbf{x}_n,\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\mathbf{m}_2=\frac{1}{N_1}\sum_{n\in\mathcal{C}_2}\mathbf{x}_n m1=N11nC1xn,m2=N11nC2xn
两个中心点到直线上的投影分别为
m 1 = w T m 1 ,                            m 2 = w T m 2 m_1=\mathbf{w}^T\mathbf{m}_1,\;\;\;\;\;\;\;\;\;\;\;\;\;m_2=\mathbf{w}^T\mathbf{m}_2 m1=wTm1,m2=wTm2
为使得两类尽可能的分开,最直接的方式是满足两个中心点的投影距离最大,即
max ⁡ w      ( m 2 − m 1 ) 2 = { w T ( m 2 − m 1 ) } { w T ( m 2 − m 1 ) } T = w T { ( m 2 − m 1 ) ( m 2 − m 1 ) T } w = w T S B w \max_{\mathbf{w}}\;\;(m_2-m_1)^2 = \Big\{\mathbf{w}^T(\mathbf{m}_2-\mathbf{m}_1)\Big\}\Big\{\mathbf{w}^T(\mathbf{m}_2-\mathbf{m}_1)\Big\}^T \\ =\mathbf{w}^T\Big\{(\mathbf{m}_2-\mathbf{m}_1)(\mathbf{m}_2-\mathbf{m}_1)^T\Big\}\mathbf{w} \\ =\mathbf{w}^T\mathbf{S}_B\mathbf{w} wmax(m2m1)2={wT(m2m1)}{wT(m2m1)}T=wT{(m2m1)(m2m1)T}w=wTSBw
为了防止两类投影点有重叠现象,我们希望每一类的投影方差是最小的,即
s 1 2 = ∑ n ∈ C 1 ( y n − m 1 ) 2 = ∑ n ∈ C 1 ( w T x n − w T m 1 ) 2 = ∑ n ∈ C 1 { w T ( x n − m 1 ) } 2 = w T { ∑ n ∈ C 1 ( x n − m 1 ) ( x n − m 1 ) T } w s_1^2=\sum_{n\in\mathcal{C}_1}(y_n-m_1)^2 \\ =\sum_{n\in\mathcal{C}_1}(\mathbf{w}^T\mathbf{x}_n-\mathbf{w}^T\mathbf{m}_1)^2 \\ =\sum_{n\in\mathcal{C}_1}\Big\{\mathbf{w}^T(\mathbf{x}_n-\mathbf{m}_1)\Big\}^2 \\ =\mathbf{w}^T\Big\{\sum_{n\in\mathcal{C}_1}(\mathbf{x}_n-\mathbf{m}_1)(\mathbf{x}_n-\mathbf{m}_1)^T\Big\}\mathbf{w} s12=nC1(ynm1)2=nC1(wTxnwTm1)2=nC1{wT(xnm1)}2=wT{nC1(xnm1)(xnm1)T}w
相似地,
s 2 2 = ∑ n ∈ C 2 ( y n − m 2 ) 2 = ∑ n ∈ C 2 ( w T x n − w T m 2 ) 2 = ∑ n ∈ C 2 { w T ( x n − m 2 ) } 2 = w T { ∑ n ∈ C 2 ( x n − m 2 ) ( x n − m 2 ) T } w s_2^2=\sum_{n\in\mathcal{C}_2}(y_n-m_2)^2 \\ =\sum_{n\in\mathcal{C}_2}(\mathbf{w}^T\mathbf{x}_n-\mathbf{w}^T\mathbf{m}_2)^2 \\ =\sum_{n\in\mathcal{C}_2}\Big\{\mathbf{w}^T(\mathbf{x}_n-\mathbf{m}_2)\Big\}^2 \\ =\mathbf{w}^T\Big\{\sum_{n\in\mathcal{C}_2}(\mathbf{x}_n-\mathbf{m}_2)(\mathbf{x}_n-\mathbf{m}_2)^T\Big\}\mathbf{w} s22=nC2(ynm2)2=nC2(wTxnwTm2)2=nC2{wT(xnm2)}2=wT{nC2(xnm2)(xnm2)T}w
综合以上两式,需要类内方差和最小,即
min ⁡ w      s 1 2 + s 2 2 = w T { ∑ n ∈ C 1 ( x n − m 1 ) ( x n − m 1 ) T } w + w T { ∑ n ∈ C 2 ( x n − m 2 ) ( x n − m 2 ) T } w = w T { ∑ n ∈ C 1 ( x n − m 1 ) ( x n − m 1 ) T + ∑ n ∈ C 2 ( x n − m 2 ) ( x n − m 2 ) T } w = w T S W w (6) \min_{\mathbf{w}}\;\;s_1^2+s_2^2=\mathbf{w}^T\Big\{\sum_{n\in\mathcal{C}_1}(\mathbf{x}_n-\mathbf{m}_1)(\mathbf{x}_n-\mathbf{m}_1)^T\Big\}\mathbf{w}+\mathbf{w}^T\Big\{\sum_{n\in\mathcal{C}_2}(\mathbf{x}_n-\mathbf{m}_2)(\mathbf{x}_n-\mathbf{m}_2)^T\Big\}\mathbf{w} \\ =\mathbf{w}^T\Big\{\sum_{n\in\mathcal{C}_1}(\mathbf{x}_n-\mathbf{m}_1)(\mathbf{x}_n-\mathbf{m}_1)^T+\sum_{n\in\mathcal{C}_2}(\mathbf{x}_n-\mathbf{m}_2)(\mathbf{x}_n-\mathbf{m}_2)^T\Big\}\mathbf{w} \\ =\mathbf{w}^T\mathbf{S}_W\mathbf{w} \tag{6} wmins12+s22=wT{nC1(xnm1)(xnm1)T}w+wT{nC2(xnm2)(xnm2)T}w=wT{nC1(xnm1)(xnm1)T+nC2(xnm2)(xnm2)T}w=wTSWw(6)
综合(3)和(6),分类的目标函数为
max ⁡ w    J = w T S B w w T S W w (7) \max_{\mathbf{w}}\;J=\frac{\mathbf{w}^T\mathbf{S}_B\mathbf{w}}{\mathbf{w}^T\mathbf{S}_W\mathbf{w}}\tag{7} wmaxJ=wTSWwwTSBw(7)
为求公式(7)的极值点,可通过对其进行求导获得
∂ J ∂ w = ( w T S B w ) S W w − ( w T S W w ) S B w w T S W w w T S W w = 0 \frac{\partial J}{\partial\mathbf{w}}=\frac{(\mathbf{w}^T\mathbf{S}_B\mathbf{w})\mathbf{S}_W\mathbf{w}-(\mathbf{w}^T\mathbf{S}_W\mathbf{w})\mathbf{S}_B\mathbf{w}}{\mathbf{w}^T\mathbf{S}_W\mathbf{w}\mathbf{w}^T\mathbf{S}_W\mathbf{w}}=0 wJ=wTSWwwTSWw(wTSBw)SWw(wTSWw)SBw=0

( w T S B w ) S W w = ( w T S W w ) S B w (8) (\mathbf{w}^T\mathbf{S}_B\mathbf{w})\mathbf{S}_W\mathbf{w}=(\mathbf{w}^T\mathbf{S}_W\mathbf{w})\mathbf{S}_B\mathbf{w}\tag{8} (wTSBw)SWw=(wTSWw)SBw(8)
由于 S B w = ( m 2 − m 1 ) ( m 2 − m 1 ) T w = constant ⋅ ( m 2 − m 1 ) \mathbf{S}_B\mathbf{w} = (\mathbf{m}_2-\mathbf{m}_1)(\mathbf{m}_2-\mathbf{m}_1)^T\mathbf{w}=\text{constant}\cdot(\mathbf{m}_2-\mathbf{m}_1) SBw=(m2m1)(m2m1)Tw=constant(m2m1)

又因为我们只关心w的方向,而不关心它的长度,可认为 w T S B w = constant 1 \mathbf{w}^T\mathbf{S}_B\mathbf{w}=\text{constant}_1 wTSBw=constant1 w T S w w = constant 2 \mathbf{w}^T\mathbf{S}_w\mathbf{w}=\text{constant}_2 wTSww=constant2,因此,公式(8)可改写为
S W w = constant ⋅ ( m 2 − m 1 ) (9) \mathbf{S}_W\mathbf{w}=\text{constant}\cdot(\mathbf{m}_2-\mathbf{m}_1)\tag{9} SWw=constant(m2m1)(9)
公式(9)两边同时左乘 S W − 1 \mathbf{S}_W^{-1} SW1,得
w ∝ S W − 1 ⋅ ( m 2 − m 1 ) (10) \mathbf{w}\propto \mathbf{S}_W^{-1}\cdot(\mathbf{m}_2-\mathbf{m}_1)\tag{10} wSW1(m2m1)(10)
公式(10)就是著名的 Fisher 判别法 (Linear Discriminant Analysis, LDA),此时,只给出了求投影直线的方法,并没有进行分类。确定分类面,我们还需要确定一个阈值 y 0 y_0 y0,判断 w T x \mathbf{w}^T\mathbf{x} wTx 与阈值的大小关系

  • w T x ≥ y 0 \mathbf{w}^T\mathbf{x}\geq y_0 wTxy0,则 x ∈ C 1 \mathbf{x}\in \mathcal{C}_1 xC1

  • w T x < y 0 \mathbf{w}^T\mathbf{x}< y_0 wTx<y0,则 x ∈ C 2 \mathbf{x}\in \mathcal{C}_2 xC2

1.3 代码实现
# 利用 linear Descriminant Analysis (LDA, 又称 Fisher判别分析) 方法进行二分类,
# 结果中的直线不是分类线,是投影直线;阈值是需要事先设定的,此处是利用的投影均值。

import numpy as np
import matplotlib.pyplot as plt

# 生成两类数据集
def createDataSet():
    # 类别1
    X1 = np.mat(np.random.random((50, 2)) * 5 + 15)
    # 类别2
    X2 = np.mat(np.random.random((40, 2)) * 5 + 2)
    return X1, X2

#
def average(dataset):
    ave = []
    a, b = np.shape(dataset)
    for i in range(b):
        n = np.sum(dataset[:, i]) / a
        ave.append(n)
    return np.array(ave)

def compute_sw(dataset, ave):
    sw = 0
    a, b = np.shape(dataset)
    for i in range(a - 1):
        sw += np.dot(dataset[i, :] - ave, (dataset[i, :] - ave).T)
    return np.array(sw)


x1_x, x2_x = createDataSet()
x1_x_ave = average(x1_x)
x2_x_ave = average(x2_x)

x1_sw = compute_sw(x1_x, x1_x_ave)
x2_sw = compute_sw(x2_x, x2_x_ave)
Sw = x1_sw + x2_sw

# 求广义逆
pinv = np.linalg.pinv(Sw)
w = np.multiply(x1_x_ave - x2_x_ave, pinv)[0, :]
print('w 的值为:', w)


data = np.vstack((x1_x,x2_x))
y = np.dot(w,data.T)

thresh = np.mean(y)
a=np.array(y>thresh)
ind1 = a[0,:]
a=np.array(y<thresh)
ind2 = a[0,:]
print('两类数据的类标号', ind1)

x1_x = np.array(x1_x)
x2_x = np.array(x2_x)
data = np.vstack((x1_x,x2_x))

test = np.array([15,10])
test =test.reshape((-1,1))
cls = np.dot(w,test)>thresh
print('测试为第一类的结果为:',cls)

# 画图
plt.figure()
plt.scatter(data[:,0],data[:,1])
x = np.arange(-5,10,0.01)
y = -w[0]*x/w[1]
plt.plot(x,y)
plt.scatter(data[ind1,0],data[ind1,1])
plt.scatter(data[ind2,0],data[ind2,1])


plt.show()
1.4 结果输出
w 的值为: [0.03483013 0.03467873]
两类数据的类标号 [ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False]
测试为第一类的结果为: [ True]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5HjlEHab-1669101371512)(Img/Fisher.png)]

注释:

LDA算法既可以用来降维,又可以用来分类,但是目前来说,主要还是用于降维。在我们进行图像识别图像识别相关的数据分析时,LDA是一个有力的工具。下面总结下LDA算法的优缺点。

  • LDA算法的主要优点有:

    1)在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。

    2)LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优。

  • LDA算法的主要缺点有:

    1)LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。

    2)LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题。

    3)LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。

    4)LDA可能过度拟合数据。

2. 感知机方法

2.1 回顾分类面在空间中的表示方法:

Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第4张图片

过原点的直线(法向量为 w \mathbf{w} w)
w T x = 0 \mathbf{w}^T\mathbf{x}=0 wTx=0
不过原点的直线(法向量为 w \mathbf{w} w)
w T x = c          或            w T x − c = 0 \mathbf{w}^T\mathbf{x}=c \;\;\;\;或\;\;\;\;\;\mathbf{w}^T\mathbf{x}-c=0 wTx=cwTxc=0
x ′ \mathbf{x}' x 带入上式得
w T x ′ − c > 0 \mathbf{w}^T\mathbf{x}'-c > 0 wTxc>0
x ′ ′ \mathbf{x}'' x 带入上式得
w T x ′ ′ − c < 0 \mathbf{w}^T\mathbf{x}''-c < 0 wTxc<0
由上可知,令 x ′ \mathbf{x}' x 对应的类为正类,即 t ′ = + 1 t'=+1 t=+1 x ′ ′ \mathbf{x}'' x 对应的类为负类,即 t ′ ′ = − 1 t''=-1 t=1 则有

正确分类的情形:
t ′ ( w T x ′ − c ) > 0      ,        t ′ ′ ( w T x ′ ′ − c ) > 0 t'(\mathbf{w}^T\mathbf{x}'-c) > 0 \;\;,\;\;\; t''(\mathbf{w}^T\mathbf{x}''-c) > 0 t(wTxc)>0t(wTxc)>0
错误分类的情形:
t ′ ′ ( w T x ′ − c ) < 0      ,        t ′ ( w T x ′ ′ − c ) < 0 t''(\mathbf{w}^T\mathbf{x}'-c) < 0 \;\;,\;\;\; t'(\mathbf{w}^T\mathbf{x}''-c) < 0 t(wTxc)<0t(wTxc)<0
综上可知,对于任意的数据 ( x i , t i ) (\mathbf{x}_i,t_i) (xi,ti),错分的总和为
∑ i = 1 N t i ( w T x i − c ) < 0 \sum_{i=1}^N t_i(\mathbf{w}^T\mathbf{x}_i-c) < 0 i=1Nti(wTxic)<0
由于上式中的误差和为负数,可构造相反数变成正数,同时令 − c = b -c=b c=b,则对于错误分类的集合 M M M,损失函数(感知机学习的经验风险函数或错误率)为

E ( w , b ) = − ∑ x i ∈ M y i ( w T x i + b ) (11) E(\textbf{w},b)=-\sum_{\textbf{x}_i\in M}y_i(\textbf{w}^T\textbf{x}_i+b)\tag{11} E(w,b)=xiMyi(wTxi+b)(11)
注释: 公式(11)只考虑错误分类的数据,对于正确分类的视而不见,即正确分类数据不影响参数 w \textbf{w} w

公式(11)的极小化问题为
( w ^ , b ^ ) = arg ⁡ min ⁡ w , b E ( w , b ) (\hat{\mathbf{w}},\hat{b})=\arg\min_{\textbf{w},b} E(\mathbf{w},b) (w^,b^)=argw,bminE(w,b)
关于 w \textbf{w} w求偏导数
∂ E ( w , b ) ∂ w = − ∑ x i ∈ M y i x i \frac{\partial E(\textbf{w},b)}{\partial \textbf{w}}=-\sum_{x_i\in M}y_i\textbf{x}_i wE(w,b)=xiMyixi
关于 b b b 求偏导
∂ E ( w , b ) ∂ b = − ∑ x i ∈ M t i \frac{\partial E(\textbf{w},b)}{\partial b}=-\sum_{x_i\in M}t_i bE(w,b)=xiMti

对于错分数据集(根据 t i ( w T x i − c ) < 0 t_i(\mathbf{w}^T\mathbf{x}_i-c) < 0 ti(wTxic)<0 判断),由于采用随机梯度下降,一次随机选取一个误分类点 ( x i , t i ) (\mathbf{x}_i , t_i ) (xi,ti) 的参数更新公式为:
w ← w + η t i x i b ← b + η ∑ x i ∈ M t i \textbf{w}\leftarrow \textbf{w}+\eta t_i\textbf{x}_i \\ b\leftarrow b+\eta \sum_{x_i\in M}t_i ww+ηtixibb+ηxiMti
2.2 感知机算法:

初始化 w 0 \textbf{w}_0 w0 b 0 b_0 b0

步1:如果误分类,即 t i ( w T x i + b ) < 0 t_i(\textbf{w}^T\textbf{x}_i+b)<0 ti(wTxi+b)<0

步2:执行 w \textbf{w} w b b b 的更新\

步3:返回步1,直至没有误分点

# !/usr/bin/env python
# -*- coding:utf-8 -*-

"""
author:LEE CZ

The form of perceptron
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

# 可视化展示分类结果
def plotResult(dataMat, labelMat, weight, bias,fig):
    
    axes = fig.add_subplot(111)
    # 设置坐标轴的显示范围
    plt.xlim(-5, 10)
    plt.ylim(-5, 10)
    
    axes.scatter(dataMat[:,0],dataMat[:,1],c=labelMat[:])
    

    y = (0.1 * -weight[0] / weight[1] + -bias / weight[1], 4.0 * -weight[0] / weight[1] + -bias / weight[1])
    axes.add_line(Line2D((0.1, 4.0), y, linewidth=1, color='blue'))

    plt.xlabel('X')
    plt.ylabel('Y')

    plt.pause(1)
    plt.cla()
    


# 感知机算法
def trainPerceptron(dataMat, labelMat, eta,fig):
    m, n = dataMat.shape
    weight = np.zeros(n)
    bias = 0

    flag = True
    while flag:
        for i in range(m):
            if np.any(labelMat[i] * (np.dot(weight, dataMat[i]) + bias) <= 0):
                weight = weight + eta * labelMat[i] * dataMat[i].T
                bias = bias + eta * labelMat[i]
                print('weight is {}, bias is {}'.format(weight, bias))

                plotResult(dataMat, labelMat, weight, bias,fig)
                flag = True
                break
            else:
                flag = False

    return weight, bias


if __name__ == "__main__":
    # 导入数据,并确定X和y
    data = np.loadtxt('testSet.txt')
    dataMat = data[:, 0:2]
    labelMat = data[:, 2]
    eta = 1 # 步长,或学习率
    
    fig = plt.figure()
    
    weight, bias = trainPerceptron(dataMat, labelMat, 1,fig)
    plotResult(dataMat, labelMat, weight, bias,fig)
    print(labelMat)
    print('The final weight is {}, the final bias is {}'.format(weight, bias))

Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第5张图片

weight is [3. 3.], bias is -1.0
weight is [2. 2.], bias is -2.0
weight is [1. 1.], bias is -3.0
weight is [ 0. -1.], bias is -4.0
weight is [3. 2.], bias is -3.0
weight is [2. 1.], bias is -4.0
weight is [0.  0.5], bias is -5.0
weight is [3.  3.5], bias is -4.0
weight is [2.  2.5], bias is -5.0
weight is [0. 2.], bias is -6.0
weight is [3. 5.], bias is -5.0
weight is [2. 4.], bias is -6.0
weight is [1. 3.], bias is -7.0
weight is [0. 1.], bias is -8.0
weight is [3. 4.], bias is -7.0
weight is [2. 3.], bias is -8.0
weight is [1. 1.], bias is -9.0
weight is [4. 4.], bias is -8.0
weight is [3. 3.], bias is -9.0
weight is [2. 1.], bias is -10.0
weight is [5. 4.], bias is -9.0
weight is [4. 3.], bias is -10.0
weight is [3. 1.], bias is -11.0
weight is [6. 3.], bias is -10.0
weight is [4.  2.5], bias is -11.0
[-1. -1.  1.  1. -1.  1.  1. -1.]
The final weight is [4.  2.5], the final bias is -11.0

2.3 感知机模型的对偶

误分点的更新过程
w : = w + η t i x i b : = b + η t i \mathbf{w}:=\mathbf{w}+\eta t_i\mathbf{x}_i\\ b:=b+\eta t_i w:=w+ηtixib:=b+ηti
( x i , t i ) (\mathbf{x}_i,t_i) (xi,ti) n i n_i ni 次循环中均被看做误分点,(不失一般性,设 w 0 = 0 , b 0 = 0 \mathbf{w}_0=\mathbf{0},b_0=0 w0=0,b0=0),则 w , b \mathbf{w},b w,b 关于点 ( x i , t i ) (\mathbf{x}_i,t_i) (xi,ti) 的增量分别为 ( n i η ) t i x i (n_i\eta) t_i \mathbf{x}_i (niη)tixi ( n i η ) t i (n_i\eta) t_i (niη)ti

w , b \mathbf{w},b w,b 关于 ( x i , y i ) (\mathbf{x}_i,y_i) (xi,yi) 点的增量可记为(令 α i = n i η \alpha_i=n_i\eta αi=niη )
Δ w ( x i , y i ) = α i t i x i Δ b ( x i , y i ) = α i t i Δ α i = η \Delta \mathbf{w}_{(x_i,y_i)}=\alpha_i t_i \mathbf{x}_i\\ \Delta b_{(x_i,y_i)}=\alpha_i t_i\\ \Delta\alpha_i=\eta Δw(xi,yi)=αitixiΔb(xi,yi)=αitiΔαi=η

从全数据的执行,最终学到的 w \mathbf{w} w b b b 分别为
w = ∑ i = 1 N α i t i x i b = ∑ i = 1 N α i t i \mathbf{w}=\sum_{i=1}^N\alpha_i t_i \mathbf{x}_i\\ b=\sum_{i=1}^N\alpha_i t_i w=i=1Nαitixib=i=1Nαiti
则判断准则 t i ( w T x i + b ) < 0 t_i(\mathbf{w}^T\mathbf{x}_i+b)<0 ti(wTxi+b)<0 可重写为
t i ( ∑ j = 1 N α j t j x j T x i + b ) < 0 t_i\Big(\sum_{j=1}^N\alpha_jt_j\mathbf{x}_j^T\mathbf{x}_i+b\Big)<0 ti(j=1NαjtjxjTxi+b)<0

t i ( ∑ j = 1 N α j t j ( x j , x i ) ⏟ 向 量 的 内 积 + b ) < 0 t_i\Big(\sum_{j=1}^N\alpha_jt_j\underbrace{(\mathbf{x}_j,\mathbf{x}_i)}_{向量的内积}+b\Big)<0 ti(j=1Nαjtj (xj,xi)+b)<0
更新过程:
α i : = α i + η b : = b + η t i \alpha_i:=\alpha_i+\eta\\ b:=b+\eta t_i αi:=αi+ηb:=b+ηti
直至所有点均无误分的情况

注:对偶方法的优势在于只计算内积 ( x i , x j ) (\mathbf{x}_i,\mathbf{x}_j) (xi,xj),内积矩阵为Gram矩阵,因此在引入核函数时非常有利,无需知道 y = ϕ ( x ) y=\phi(\mathbf{x}) y=ϕ(x) 的形式。

"""
author:LeeCZ

The dual form of perceptron
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D


# 载入数据集
def loadData():
    data = np.loadtxt('testSet.txt')
    dataMat = data[:, 0:2]
    labelMat = data[:, 2]
    labelMat = labelMat.reshape((labelMat.shape[0], 1))
    return dataMat, labelMat


"""
训练模型
b:bias
eta:learning rate
"""
def trainModel(dataMat, labelMat, alpha, b, eta):
    flag = True
    while flag:
        for i in range(m):
            if (labelMat[i, 0] * (np.sum((alpha * labelMat * np.dot(dataMat, dataMat[i].T).reshape((m, 1)))) + b)) <= 0:
                alpha[i] = alpha[i] + eta
                b = b + eta * labelMat[i]
                flag = True
                break
            else:
                flag = False
    w = np.dot(dataMat.T, alpha * labelMat)
    return w, b


# 可视化结果
def plotResult(dataMat, labelMat, weight, bias):
    fig = plt.figure()
    axes = fig.add_subplot(111)

    axes.scatter(dataMat[:,0],dataMat[:,1],c=labelMat[:,0])

    y = (0.1 * -weight[0] / weight[1] + -bias / weight[1], 4.0 * -weight[0] / weight[1] + -bias / weight[1])
    axes.add_line(Line2D((0.1, 4.0), y, linewidth=1, color='blue'))

    plt.xlabel('X')
    plt.ylabel('Y')

    plt.show()

   

# 主函数
if __name__ == "__main__":
    dataMat, labelMat = loadData()
    m, n = dataMat.shape
    alpha = np.zeros((m, 1))
    b = 0
    eta = 1
    w, b = trainModel(dataMat, labelMat, alpha, b, eta)
    print('weight is {}, \n bias is {}'.format(w, b))
 
    plotResult(dataMat, labelMat, w, b)

结果
Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模_第6张图片

weight is [[4. ]
 [2.5]], 
 bias is [-11.]

3. 小结

你可能感兴趣的:(PRML,分类,人工智能)