200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Bishop 模式识别与机器学习读书笔记 || 线性分类模型之判别函数的几何建模

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

时间:2022-02-27 14:30:44

相关推荐

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

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

文章目录

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

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

分类问题可以分为两分类和多分类问题,对于输入向量 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(wTx+w0)y(\mathbf{x})=f(\mathbf{w}^T\mathbf{x}+w_0)y(x)=f(wTx+w0​).

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

(3)通过概率构造生成模型,通过先验和似然获取后验概率,即

p(Ck∣x)=p(x∣Ck)p(Ck)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(Ck​∣x)=p(x)p(x∣Ck​)p(Ck​)​

1. 判别函数

在线性回归模型中,通过 y(x)=wTx+w0y(\mathbf{x})=\mathbf{w}^T\mathbf{x}+w_0y(x)=wTx+w0​ 来获取一个实数值,如果需要判断一个类别时,我们可以通过构造一种函数,将函数值限制在 [0,1][0,1][0,1] 中,为了达到这种效果,我们可以借助于一个非线性函数 f(⋅)f(\cdot)f(⋅) 来构造参数 w\mathbf{w}w 的线性函数

y(x)=f(wTx+w0)y(\mathbf{x})=f(\mathbf{w}^T\mathbf{x}+w_0) y(x)=f(wTx+w0​)

在机器学习中, f(⋅)f(\cdot)f(⋅) 称为激活函数,在统计学中该函数的拟函数称为连接函数。相应地,决策面函数为

y(x)=constanty(\mathbf{x})=\text{constant} y(x)=constant

也可以写作

wTx+w0=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)=wTx+w0y(\mathbf{x})=\mathbf{w}^T\mathbf{x}+w_0 y(x)=wTx+w0​

其中 www 被称为权重向量,w0w_0w0​ 是偏置(不要与统计学意义上的偏差混淆)。如果输入向量 x\mathbf{x}x 对应的函数值 y(x)≥0y(\mathbf{x})\geq 0y(x)≥0,则被分配到第一类 x∈C1\mathbf{x}\in \mathcal{C}_1x∈C1​,否则, x∈C2\mathbf{x}\in \mathcal{C}_2x∈C2​. 因此,对应的判定边界由函数 y(x)=0y(\mathbf{x}) = 0y(x)=0 确定,该关系对应于 DDD 维输入空间内的 (D−1)(D-1)(D−1) 维超平面。考虑位于决策面上的两个点 xA\mathbf{x}_AxA​ 和 xB\mathbf{x}_BxB​,由于 y(xA)=y(xB)=0y(\mathbf{x}_A)=y(\mathbf{x}_B)=0y(xA​)=y(xB​)=0,因此有 wT(xA−xB)=0\mathbf{w}^T(\mathbf{x}_A−\mathbf{x}_B)=0wT(xA​−xB​)=0,因此向量 w\mathbf{w}w 与位于决策曲面内的每个向量正交, w\mathbf{w}w 确定决策曲面的方向(即向量 w\mathbf{w}w 是决策面的法向量)。类似地,如果 x\mathbf{x}x 是决策曲面上的一个点,那么 y(x)=0y(\mathbf{x}) = 0y(x)=0 ,即

wTx∣∣w∣∣=−w0∣∣w∣∣\frac{\mathbf{w}^T\mathbf{x}}{\vert\vert\mathbf{w}\vert\vert}=\frac{-w_0}{\vert\vert\mathbf{w}\vert\vert} ∣∣w∣∣wTx​=∣∣w∣∣−w0​​

**注释:**上式表明分界面上的向量在绿色直线上的投影,即原点到分界面的距离。

对于空间中任意一点 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⊥​+r⋅∥w∥w​(2)

公式(2)两边左乘 wT\mathbf{w}^TwT,然后加上 w0w_0w0​,得

wTx+w0=wTx⊥+w0+r⋅wTw∥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​+r⋅∥w∥wTw​

即,点到直线的距离 rrr 为

r=y(x)∥w∥r = \frac{y(\mathbf{x})}{\Vert\mathbf{w}\Vert} r=∥w∥y(x)​

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

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

y(x)=w~Tx~y(\mathbf{x})=\widetilde{\mathbf{w}}^T\widetilde{\mathbf{x}} y(x)=wTx

1.2 多类问题

yk(x)=wkTx+wk0y_k(\mathbf{x})=\mathbf{w}_k^T\mathbf{x}+w_{k0} yk​(x)=wkT​x+wk0​

(wk−wj)Tx+(wk0−wj0)=0(\mathbf{w}_k-\mathbf{w}_j)^T\mathbf{x}+(w_{k0}-w_{j0})=0 (wk​−wj​)Tx+(wk0​−wj0​)=0

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

yk(x^)=λyk(xA)+(1−λ)yk(xB)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​)

多分类问题的最小二乘法:

yk(x)=wkTx+wk0y_k(\mathbf{x})=\mathbf{w}_k^T\mathbf{x}+w_{k0} yk​(x)=wkT​x+wk0​

y(x)=(y1(x)y2(x)⋮yK(x))=(w~1Tw~2T⋮w~KT)x~=W~Tx~\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)​⎠⎟⎟⎟⎞​=⎝⎜⎜⎜⎛​w1T​w2T​⋮wKT​​⎠⎟⎟⎟⎞​x=WTx

ED(W~)=12Tr{(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)=21​Tr{(XW−T)T(XW−T)}

∂ED(W~)∂W~=X~T(X~W~−T)=X~TX~W~−X~TT=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)​=XT(XW−T)=XTXW−XTT=0

W~=(X~TX~)−1X~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†(XTX)−1XT​​T=X†T

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

1.3 Fisher 线性判别 LDA 算法

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

过原点的直线(法向量为 w\mathbf{w}w)

wTx=0\mathbf{w}^T\mathbf{x}=0 wTx=0

不过原点的直线(法向量为 w\mathbf{w}w)

wTx=c\mathbf{w}^T\mathbf{x}=c wTx=c

有一种分类建模的方法是从降维的角度认识的,将 DDD 维空间上的输入向量 x\mathbf{x}x 投影到一维直线上,可通过内积形式完成

y=wTxy=\mathbf{w}^T\mathbf{x}y=wTx

可对y设置一个阈值进行分类,当 y≥−w0y\geq -w_0y≥−w0​ 则认为是类 C1\mathcal{C}_1C1​,否则为类C2\mathcal{C}_2C2​. 一般来说,投影到一维上会导致大量的信息丢失,并且在原始的D维空间中很好地分离的类可能在一维中变得很强地重叠。然而,通过调整权重向量 w\mathbf{w}w 的分量,我们可以选择最大化类分离的投影。

对于一个两类问题,其中有 C1\mathcal{C}_1C1​ 类的 N1N_1N1​ 个点和 C2\mathcal{C}_2C2​ 类的 N2N_2N2​ 个点,因此这两类的平均向量表示为

m1=1N1∑n∈C1xn,m2=1N1∑n∈C2xn\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​=N1​1​n∈C1​∑​xn​,m2​=N1​1​n∈C2​∑​xn​

两个中心点到直线上的投影分别为

m1=wTm1,m2=wTm2m_1=\mathbf{w}^T\mathbf{m}_1,\;\;\;\;\;\;\;\;\;\;\;\;\;m_2=\mathbf{w}^T\mathbf{m}_2 m1​=wTm1​,m2​=wTm2​

为使得两类尽可能的分开,最直接的方式是满足两个中心点的投影距离最大,即

max⁡w(m2−m1)2={wT(m2−m1)}{wT(m2−m1)}T=wT{(m2−m1)(m2−m1)T}w=wTSBw\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​(m2​−m1​)2={wT(m2​−m1​)}{wT(m2​−m1​)}T=wT{(m2​−m1​)(m2​−m1​)T}w=wTSB​w

为了防止两类投影点有重叠现象,我们希望每一类的投影方差是最小的,即

s12=∑n∈C1(yn−m1)2=∑n∈C1(wTxn−wTm1)2=∑n∈C1{wT(xn−m1)}2=wT{∑n∈C1(xn−m1)(xn−m1)T}ws_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​=n∈C1​∑​(yn​−m1​)2=n∈C1​∑​(wTxn​−wTm1​)2=n∈C1​∑​{wT(xn​−m1​)}2=wT{n∈C1​∑​(xn​−m1​)(xn​−m1​)T}w

相似地,

s22=∑n∈C2(yn−m2)2=∑n∈C2(wTxn−wTm2)2=∑n∈C2{wT(xn−m2)}2=wT{∑n∈C2(xn−m2)(xn−m2)T}ws_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​=n∈C2​∑​(yn​−m2​)2=n∈C2​∑​(wTxn​−wTm2​)2=n∈C2​∑​{wT(xn​−m2​)}2=wT{n∈C2​∑​(xn​−m2​)(xn​−m2​)T}w

综合以上两式,需要类内方差和最小,即

min⁡ws12+s22=wT{∑n∈C1(xn−m1)(xn−m1)T}w+wT{∑n∈C2(xn−m2)(xn−m2)T}w=wT{∑n∈C1(xn−m1)(xn−m1)T+∑n∈C2(xn−m2)(xn−m2)T}w=wTSWw(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} wmin​s12​+s22​=wT{n∈C1​∑​(xn​−m1​)(xn​−m1​)T}w+wT{n∈C2​∑​(xn​−m2​)(xn​−m2​)T}w=wT{n∈C1​∑​(xn​−m1​)(xn​−m1​)T+n∈C2​∑​(xn​−m2​)(xn​−m2​)T}w=wTSW​w(6)

综合(3)和(6),分类的目标函数为

max⁡wJ=wTSBwwTSWw(7)\max_{\mathbf{w}}\;J=\frac{\mathbf{w}^T\mathbf{S}_B\mathbf{w}}{\mathbf{w}^T\mathbf{S}_W\mathbf{w}}\tag{7} wmax​J=wTSW​wwTSB​w​(7)

为求公式(7)的极值点,可通过对其进行求导获得

∂J∂w=(wTSBw)SWw−(wTSWw)SBwwTSWwwTSWw=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 ∂w∂J​=wTSW​wwTSW​w(wTSB​w)SW​w−(wTSW​w)SB​w​=0

(wTSBw)SWw=(wTSWw)SBw(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} (wTSB​w)SW​w=(wTSW​w)SB​w(8)

由于 SBw=(m2−m1)(m2−m1)Tw=constant⋅(m2−m1)\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)SB​w=(m2​−m1​)(m2​−m1​)Tw=constant⋅(m2​−m1​),

又因为我们只关心w的方向,而不关心它的长度,可认为 wTSBw=constant1\mathbf{w}^T\mathbf{S}_B\mathbf{w}=\text{constant}_1wTSB​w=constant1​,wTSww=constant2\mathbf{w}^T\mathbf{S}_w\mathbf{w}=\text{constant}_2wTSw​w=constant2​,因此,公式(8)可改写为

SWw=constant⋅(m2−m1)(9)\mathbf{S}_W\mathbf{w}=\text{constant}\cdot(\mathbf{m}_2-\mathbf{m}_1)\tag{9} SW​w=constant⋅(m2​−m1​)(9)

公式(9)两边同时左乘 SW−1\mathbf{S}_W^{-1}SW−1​,得

w∝SW−1⋅(m2−m1)(10)\mathbf{w}\propto \mathbf{S}_W^{-1}\cdot(\mathbf{m}_2-\mathbf{m}_1)\tag{10} w∝SW−1​⋅(m2​−m1​)(10)

公式(10)就是著名的 Fisher 判别法 (Linear Discriminant Analysis, LDA),此时,只给出了求投影直线的方法,并没有进行分类。确定分类面,我们还需要确定一个阈值 y0y_0y0​,判断 wTx\mathbf{w}^T\mathbf{x}wTx 与阈值的大小关系

如 wTx≥y0\mathbf{w}^T\mathbf{x}\geq y_0wTx≥y0​,则 x∈C1\mathbf{x}\in \mathcal{C}_1x∈C1​

如 wTx<y0\mathbf{w}^T\mathbf{x}< y_0wTx<y0​,则 x∈C2\mathbf{x}\in \mathcal{C}_2x∈C2​

1.3 代码实现

# 利用 linear Descriminant Analysis (LDA, 又称 Fisher判别分析) 方法进行二分类,# 结果中的直线不是分类线,是投影直线;阈值是需要事先设定的,此处是利用的投影均值。import numpy as npimport matplotlib.pyplot as plt# 生成两类数据集def createDataSet():# 类别1X1 = np.mat(np.random.random((50, 2)) * 5 + 15)# 类别2X2 = 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]) / aave.append(n)return np.array(ave)def compute_sw(dataset, ave):sw = 0a, 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)>threshprint('测试为第一类的结果为:',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 TrueTrue True True True True True True True True True True TrueTrue True True True True True True True True True True TrueTrue True True True True True True True True True True TrueTrue True False False False False False False False False False FalseFalse False False False False False False False False False False FalseFalse False False False False False False False False False False FalseFalse 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回顾分类面在空间中的表示方法:

过原点的直线(法向量为 w\mathbf{w}w)

wTx=0\mathbf{w}^T\mathbf{x}=0 wTx=0

不过原点的直线(法向量为 w\mathbf{w}w)

wTx=c或wTx−c=0\mathbf{w}^T\mathbf{x}=c \;\;\;\;或\;\;\;\;\;\mathbf{w}^T\mathbf{x}-c=0 wTx=c或wTx−c=0

则 x′\mathbf{x}'x′ 带入上式得

wTx′−c>0\mathbf{w}^T\mathbf{x}'-c > 0 wTx′−c>0

则 x′′\mathbf{x}''x′′ 带入上式得

wTx′′−c<0\mathbf{w}^T\mathbf{x}''-c < 0 wTx′′−c<0

由上可知,令 x′\mathbf{x}'x′ 对应的类为正类,即 t′=+1t'=+1t′=+1, x′′\mathbf{x}''x′′ 对应的类为负类,即 t′′=−1t''=-1t′′=−1 则有

正确分类的情形:

t′(wTx′−c)>0,t′′(wTx′′−c)>0t'(\mathbf{w}^T\mathbf{x}'-c) > 0 \;\;,\;\;\; t''(\mathbf{w}^T\mathbf{x}''-c) > 0 t′(wTx′−c)>0,t′′(wTx′′−c)>0

错误分类的情形:

t′′(wTx′−c)<0,t′(wTx′′−c)<0t''(\mathbf{w}^T\mathbf{x}'-c) < 0 \;\;,\;\;\; t'(\mathbf{w}^T\mathbf{x}''-c) < 0 t′′(wTx′−c)<0,t′(wTx′′−c)<0

综上可知,对于任意的数据 (xi,ti)(\mathbf{x}_i,t_i)(xi​,ti​),错分的总和为

∑i=1Nti(wTxi−c)<0\sum_{i=1}^N t_i(\mathbf{w}^T\mathbf{x}_i-c) < 0 i=1∑N​ti​(wTxi​−c)<0

由于上式中的误差和为负数,可构造相反数变成正数,同时令 −c=b-c=b−c=b,则对于错误分类的集合MMM,损失函数(感知机学习的经验风险函数或错误率)为

E(w,b)=−∑xi∈Myi(wTxi+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)=−xi​∈M∑​yi​(wTxi​+b)(11)

注释:公式(11)只考虑错误分类的数据,对于正确分类的视而不见,即正确分类数据不影响参数 w\textbf{w}w。

公式(11)的极小化问题为

(w^,b^)=arg⁡min⁡w,bE(w,b)(\hat{\mathbf{w}},\hat{b})=\arg\min_{\textbf{w},b} E(\mathbf{w},b) (w^,b^)=argw,bmin​E(w,b)

关于w\textbf{w}w求偏导数

∂E(w,b)∂w=−∑xi∈Myixi\frac{\partial E(\textbf{w},b)}{\partial \textbf{w}}=-\sum_{x_i\in M}y_i\textbf{x}_i ∂w∂E(w,b)​=−xi​∈M∑​yi​xi​

关于 bbb 求偏导

∂E(w,b)∂b=−∑xi∈Mti\frac{\partial E(\textbf{w},b)}{\partial b}=-\sum_{x_i\in M}t_i ∂b∂E(w,b)​=−xi​∈M∑​ti​

对于错分数据集(根据 ti(wTxi−c)<0t_i(\mathbf{w}^T\mathbf{x}_i-c) < 0ti​(wTxi​−c)<0 判断),由于采用随机梯度下降,一次随机选取一个误分类点 (xi,ti)(\mathbf{x}_i , t_i )(xi​,ti​) 的参数更新公式为:

w←w+ηtixib←b+η∑xi∈Mti\textbf{w}\leftarrow \textbf{w}+\eta t_i\textbf{x}_i \\ b\leftarrow b+\eta \sum_{x_i\in M}t_i w←w+ηti​xi​b←b+ηxi​∈M∑​ti​

2.2 感知机算法:

初始化 w0\textbf{w}_0w0​ 和 b0b_0b0​

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

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

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

# !/usr/bin/env python# -*- coding:utf-8 -*-"""author:LEE CZThe form of perceptron"""import numpy as npimport matplotlib.pyplot as pltfrom 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.shapeweight = np.zeros(n)bias = 0flag = Truewhile 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].Tbias = bias + eta * labelMat[i]print('weight is {}, bias is {}'.format(weight, bias))plotResult(dataMat, labelMat, weight, bias,fig)flag = Truebreakelse:flag = Falsereturn weight, biasif __name__ == "__main__":# 导入数据,并确定X和ydata = 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))

weight is [3. 3.], bias is -1.0weight is [2. 2.], bias is -2.0weight is [1. 1.], bias is -3.0weight is [ 0. -1.], bias is -4.0weight is [3. 2.], bias is -3.0weight is [2. 1.], bias is -4.0weight is [0. 0.5], bias is -5.0weight is [3. 3.5], bias is -4.0weight is [2. 2.5], bias is -5.0weight is [0. 2.], bias is -6.0weight is [3. 5.], bias is -5.0weight is [2. 4.], bias is -6.0weight is [1. 3.], bias is -7.0weight is [0. 1.], bias is -8.0weight is [3. 4.], bias is -7.0weight is [2. 3.], bias is -8.0weight is [1. 1.], bias is -9.0weight is [4. 4.], bias is -8.0weight is [3. 3.], bias is -9.0weight is [2. 1.], bias is -10.0weight is [5. 4.], bias is -9.0weight is [4. 3.], bias is -10.0weight is [3. 1.], bias is -11.0weight is [6. 3.], bias is -10.0weight 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+ηtixib:=b+ηti\mathbf{w}:=\mathbf{w}+\eta t_i\mathbf{x}_i\\ b:=b+\eta t_i w:=w+ηti​xi​b:=b+ηti​

若 (xi,ti)(\mathbf{x}_i,t_i)(xi​,ti​) 在 nin_ini​ 次循环中均被看做误分点,(不失一般性,设 w0=0,b0=0\mathbf{w}_0=\mathbf{0},b_0=0w0​=0,b0​=0),则 w,b\mathbf{w},bw,b 关于点(xi,ti)(\mathbf{x}_i,t_i)(xi​,ti​) 的增量分别为 (niη)tixi(n_i\eta) t_i \mathbf{x}_i(ni​η)ti​xi​ 和 (niη)ti(n_i\eta) t_i(ni​η)ti​

即 w,b\mathbf{w},bw,b 关于 (xi,yi)(\mathbf{x}_i,y_i)(xi​,yi​) 点的增量可记为(令 αi=niη\alpha_i=n_i\etaαi​=ni​η )

Δw(xi,yi)=αitixiΔb(xi,yi)=αitiΔα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​)​=αi​ti​xi​Δb(xi​,yi​)​=αi​ti​Δαi​=η

从全数据的执行,最终学到的 w\mathbf{w}w 和 bbb 分别为

w=∑i=1Nαitixib=∑i=1Nαiti\mathbf{w}=\sum_{i=1}^N\alpha_i t_i \mathbf{x}_i\\ b=\sum_{i=1}^N\alpha_i t_i w=i=1∑N​αi​ti​xi​b=i=1∑N​αi​ti​

则判断准则 ti(wTxi+b)<0t_i(\mathbf{w}^T\mathbf{x}_i+b)<0ti​(wTxi​+b)<0 可重写为

ti(∑j=1NαjtjxjTxi+b)<0t_i\Big(\sum_{j=1}^N\alpha_jt_j\mathbf{x}_j^T\mathbf{x}_i+b\Big)<0 ti​(j=1∑N​αj​tj​xjT​xi​+b)<0

ti(∑j=1Nαjtj(xj,xi)⏟向量的内积+b)<0t_i\Big(\sum_{j=1}^N\alpha_jt_j\underbrace{(\mathbf{x}_j,\mathbf{x}_i)}_{向量的内积}+b\Big)<0 ti​(j=1∑N​αj​tj​向量的内积(xj​,xi​)​​+b)<0

更新过程:

αi:=αi+ηb:=b+ηti\alpha_i:=\alpha_i+\eta\\ b:=b+\eta t_i αi​:=αi​+ηb:=b+ηti​

直至所有点均无误分的情况

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

"""author:LeeCZThe dual form of perceptron"""import numpy as npimport matplotlib.pyplot as pltfrom 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:biaseta:learning rate"""def trainModel(dataMat, labelMat, alpha, b, eta):flag = Truewhile 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] + etab = b + eta * labelMat[i]flag = Truebreakelse:flag = Falsew = 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.shapealpha = np.zeros((m, 1))b = 0eta = 1w, b = trainModel(dataMat, labelMat, alpha, b, eta)print('weight is {}, \n bias is {}'.format(w, b))plotResult(dataMat, labelMat, w, b)

结果

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

3. 小结

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。