机器学习基石作业03:二阶泰勒展开,特征转换,逻辑回归

本文总结机器学习基石的第三次作业,主要包括误差函数、特征转换、二阶泰勒展开,以及线性回归,逻辑回归的实现。


问题1和问题2:关于线性回归问题中 E i n E_{in} Ein E o u t E_{out} Eout的理解。

关于含有噪声的目标 y = w f T x + ϵ y=w^T_fx+\epsilon y=wfTx+ϵ,其中的噪声 ϵ \epsilon ϵ均值为0,方差为 σ 2 \sigma^2 σ2,且相互独立。根据PPT上的讲解可知,闭式解 w l i n w_{lin} wlin E i n E_{in} Ein为:
E i n ( w l i n ) = 1 N ∣ ∣ y − y ^ ∣ ∣ 2 = 1 N ∣ ∣ ( I − X X † ) y ∣ ∣ 2 = 1 N ∣ ∣ ( I − H ) y ∣ ∣ 2 E_{in}(w_{lin})=\frac{1}{N}||\mathbb{y}-\hat{\mathbb{y}}||^2=\frac{1}{N}||(I-XX^{\dagger})\mathbb{y}||^2=\frac{1}{N}||(I-H)\mathbb{y}||^2 Ein(wlin)=N1yy^2=N1(IXX)y2=N1(IH)y2
在这里插入图片描述

从上图可知, ( I − H ) y = ( I − H ) n o i s e (I-H)\mathbb{y}=(I-H)noise (IH)y=(IH)noise(这是基于只有 f ( x ) f(x) f(x)含有噪声, x x x不含噪声的前提),从而问题转换为 E i n ( w l i n ) = 1 N ∣ ∣ ( I − H ) n o i s e ∣ ∣ 2 E_{in}(w_{lin})=\frac{1}{N}||(I-H)noise||^2 Ein(wlin)=N1(IH)noise2。为了简化起见,令 A = ( I − H ) , B = n o i s e → ∣ ∣ A B ∣ ∣ 2 = s c a l e r A=(I-H),B=noise\to ||AB||^2=scaler A=(IH)B=noiseAB2=scaler,从而可以获得下面的式子(其中用到 B B T = s c a l e r BB^T=scaler BBT=scaler):
∣ ∣ A B ∣ ∣ 2 = t r a c e ( ( A B ) T A B ) = t r a c e ( B B T A T A ) = B B T t r a c e ( A T A ) = ∣ ∣ n o i s e ∣ ∣ 2 t r a c e ( A T A ) ||AB||^2=trace((AB)^TAB)=trace(BB^TA^TA)\\ =BB^Ttrace(A^TA)=||noise||^2trace(A^TA) AB2=trace((AB)TAB)=trace(BBTATA)=BBTtrace(ATA)=noise2trace(ATA)
根据 H H H的性质(具体证明等见Q2)可得:
t r a c e ( ( I − H ) T ( I − H ) ) = t r a c e ( I − H ) = N − ( d + 1 ) trace((I-H)^T(I-H))=trace(I-H)=N-(d+1) trace((IH)T(IH))=trace(IH)=N(d+1)
所以,综上所述可得:
E i n ( w l i n ) = ( 1 − d + 1 N ) ∣ ∣ n o i s e ∣ ∣ 2 E_{in}(w_{lin})=(1-\frac{d+1}{N})||noise||^2 Ein(wlin)=(1Nd+1)noise2

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
σ = 0.1 ,   d = 8 \sigma=0.1,\ d=8 σ=0.1, d=8时,使得 E i n E_{in} Ein的数学期望 ≥ 0.008 \ge0.008 0.008的样本数是多少?(从选项中选择满足条件情况下最小的)

E i n E_{in} Ein的数学期望为:
E D [ E i n ( w l i n ) ] = ( 1 − d + 1 N ) σ 2 \mathbb{E}_D[E_{in}(w_{lin})]=(1-\frac{d+1}{N})\sigma^2 ED[Ein(wlin)]=(1Nd+1)σ2
从而相当于 ( 1 − 9 / N ) ∗ 0.01 ≥ 0.0008 → N = 45 (1-9/N)*0.01\ge 0.0008\to N=45 (19/N)0.010.0008N=45,从而选择N=100。
在这里插入图片描述
针对hat matrix H = X ( X T X ) − 1 X T H=X(X^TX)^{-1}X^T H=X(XTX)1XT性质的探究,以下哪些性质是 H H H所具有的?

结论: H H H是①对称 ②幂等性 ③半正定 ④有d+1个特征值为1。

证明:

  • ①对称性: H = ( X ( X T X ) − 1 X T ) T = X ( X T X ) − 1 X T = H H=(X(X^TX)^{-1}X^T)^T=X(X^TX)^{-1}X^T=H H=(X(XTX)1XT)T=X(XTX)1XT=H(其中有用到 ( ( A B ) − 1 ) T = ( ( A B ) T ) − 1 ((AB)^{-1})^T=((AB)^T)^{-1} ((AB)1)T=((AB)T)1,这条式子有可逆作为先决条件);
  • ②幂等性: H 2 = X ( X T X ) − 1 X T X ( X T X ) − 1 X T = X ( X T X ) − 1 X T = H H^2=X(X^TX)^{-1}X^TX(X^TX)^{-1}X^T=X(X^TX)^{-1}X^T=H H2=X(XTX)1XTX(XTX)1XT=X(XTX)1XT=H
  • ③半正定:假设存在特征值和特征向量 H w = λ w Hw=\lambda w Hw=λw,则 λ w = H w = H 2 w = λ H w = λ 2 w \lambda w=Hw=H^2w=\lambda Hw=\lambda^2w λw=Hw=H2w=λHw=λ2w,从而 λ 2 w = λ w → λ = 0   o r   1 \lambda^2w=\lambda w\to \lambda=0\ or \ 1 λ2w=λwλ=0 or 1,所以全部特征值均 ≥ 0 \ge 0 0
  • ④存在d+1个特征值为1: t r a c e ( H ) = t r a c e ( X ( X T X ) − 1 X T ) = t r a c e ( ( X T X ) − 1 X T X ) = t r a c e ( I d + 1 × d + 1 ) = d + 1 trace(H)=trace(X(X^TX)^{-1}X^T)=trace((X^TX)^{-1}X^TX)=trace(I_{d+1\times d+1})=d+1 trace(H)=trace(X(XTX)1XT)=trace((XTX)1XTX)=trace(Id+1×d+1)=d+1,又根据 t r a c e ( H ) = ∑ λ i trace(H)=\sum\lambda_i trace(H)=λi(该项需要半正定和对称性作为条件,具体证明可见AI圣经PRML),从而可知 λ = 1 \lambda=1 λ=1对应有 d + 1 d+1 d+1个。

这些结论可以用来证明 t r a c e ( I − H ) = N − ( d + 1 ) trace(I-H)=N-(d+1) trace(IH)=N(d+1)


问题3-5:主要考察损失判据和随机梯度下降。
在这里插入图片描述
在这里插入图片描述
上述损失判据中,哪个是0/1判据 s i g n ( w T x ) ≠ y sign(w^Tx)\ne y sign(wTx)=y的上界( y ∈ { − 1 , + 1 } y\in \{-1,+1\} y{1,+1})?

通过上述图像易知,err3(本题D项,绘图存疑)即为0/1判据的上界。


在这里插入图片描述
上述损失判据中,哪个并不是处处可微分的?

由上图得,err2(本题D项)即在0处不可微分。


在这里插入图片描述
对上述损失判据计算SGD(忽略不可微分的情况),哪个损失判据恰好是PLA中采用的(即其求梯度函数恰好为PLA中更新参数时用到的)?

由第二节课件可知,PLA的参数更新方程为 w ← w + y x    i f   s i g n ( w T x ) ≠ y w\gets w+yx\ \ if\ sign(w^Tx)\neq y ww+yx  if sign(wTx)=y,可等价为 y w T x > 0 ,   ∇ E = 0 ,      y w T x < 0 ,   ∇ E = − y x yw^Tx\gt 0,\ \nabla E=0,\ \ \ \ yw^Tx\lt 0,\ \nabla E=-yx ywTx>0, E=0,    ywTx<0, E=yx,从而推出 e r r ( w ) = m a x ( 0 , − y w T x ) err(w)=max(0,-yw^Tx) err(w)=max(0,ywTx)


问题6-10:主要考查二元情况下的导数和二阶泰勒展开。

一阶导数: ∇ f ( x , y ) = [ ∂ f ∂ x , ∂ f ∂ y ] T \nabla f(x,y)=[\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}]^T f(x,y)=[xf,yf]T
二阶导数: ∇ 2 f ( x , y ) = [ ∂ 2 f ∂ x 2 , ∂ 2 f ∂ y ∂ x ; ∂ 2 f ∂ y ∂ x , ∂ 2 f ∂ y 2 ] \nabla^2 f(x,y)=[\frac{\partial^2 f}{\partial x^2},\frac{\partial^2 f}{\partial y\partial x}; \frac{\partial^2 f}{\partial y\partial x},\frac{\partial^2 f}{\partial y^2}] 2f(x,y)=[x22f,yx2f;yx2f,y22f]
二阶泰勒展开:
f ( x + Δ x , y + Δ y ) = f ( x , y ) + Δ x ∂ f ( x , y ) ∂ x + Δ y ∂ f ( x , y ) ∂ y + 1 2 ! [ ( Δ x ) 2 ∂ 2 f ( x , y ) ∂ x 2 + 2 Δ x Δ y ∂ 2 f ( x , y ) ∂ x ∂ y + ( Δ y ) 2 ∂ 2 f ( x , y ) ∂ y 2 ] f(x+\Delta x, y+\Delta y)=f(x,y)+\Delta x\frac{\partial f(x,y)}{\partial x}+\Delta y\frac{\partial f(x,y)}{\partial y}\\ +\frac{1}{2!}\big[(\Delta x)^2\frac{\partial^2 f(x,y)}{\partial x^2}+2\Delta x\Delta y\frac{\partial^2 f(x,y)}{\partial x\partial y}+(\Delta y)^2\frac{\partial^2 f(x,y)}{\partial y^2}\big] f(x+Δx,y+Δy)=f(x,y)+Δxxf(x,y)+Δyyf(x,y)+2!1[(Δx)2x22f(x,y)+2ΔxΔyxy2f(x,y)+(Δy)2y22f(x,y)]
题设表达式:
E ( u , v ) = e u + e 2 v + e u v + u 2 − 2 u v + 2 v 2 − 3 u − 2 v E(u,v)=e^u+e^{2v}+e^{uv}+u^2-2uv+2v^2-3u-2v E(u,v)=eu+e2v+euv+u22uv+2v23u2v
在这里插入图片描述
∇ E ( u , v ) \nabla E(u,v) E(u,v) ( u , v ) = ( 0 , 0 ) (u,v)=(0,0) (u,v)=(0,0)处的值时多少?

根据一阶导数可得:
∂ E ( u , v ) ∂ u = e u + v e u v + 2 u − 2 v − 3 ∂ E ( u , v ) ∂ v = 2 e 2 v + u e u v − 2 u + 4 v − 2 \frac{\partial E(u,v)}{\partial u}=e^u+ve^{uv}+2u-2v-3\\ \frac{\partial E(u,v)}{\partial v}=2e^{2v}+ue^{uv}-2u+4v-2 uE(u,v)=eu+veuv+2u2v3vE(u,v)=2e2v+ueuv2u+4v2
( u , v ) = ( 0 , 0 ) (u,v)=(0,0) (u,v)=(0,0)代入可得 ∇ E ( 0 , 0 ) = ( − 2 , 0 ) \nabla E(0,0)=(-2,0) E(0,0)=(2,0)


在这里插入图片描述
根据梯度下降算法(如下式所示),对参数进行迭代更新,求 η = 0.01 , ( u 0 , v 0 ) = ( 0 , 0 ) \eta=0.01,(u_0,v_0)=(0,0) η=0.01,(u0,v0)=(0,0)经过五次迭代后的结果 ( u 5 , v 5 ) (u_5,v_5) (u5,v5) E ( u 5 , v 5 ) E(u_5,v_5) E(u5,v5)
( u t + 1 , v t + 1 ) = ( u t , v t ) − η ∇ E ( u t , v t ) (u_{t+1},v_{t+1})=(u_t,v_t)-\eta \nabla E(u_t,v_t) (ut+1,vt+1)=(ut,vt)ηE(ut,vt)
由程序推出: u = 0.0941 , v = 0.0018 , E = 2.825 u= 0.0941,v= 0.0018,E=2.825 u=0.0941,v=0.0018,E=2.825


在这里插入图片描述
如果采用二阶泰勒展开 E ^ 2 ( Δ u , Δ v ) \hat{E}_2(\Delta u,\Delta v) E^2(Δu,Δv)来近似 E ( u + Δ u , v + Δ v ) E(u+\Delta u, v+\Delta v) E(u+Δu,v+Δv),求下述表达式中的参数在 ( u , v ) = ( 0 , 0 ) (u,v)=(0,0) (u,v)=(0,0)处的值?
E ^ 2 ( Δ u , Δ v ) = b u u ( Δ u ) 2 + b v v ( Δ v ) 2 + b u v ( Δ u ) ( Δ v ) + b u Δ u + b v Δ v + b \hat{E}_2(\Delta u,\Delta v)=b_{uu}(\Delta u)^2+b_{vv}(\Delta v)^2+b_{uv}(\Delta u)(\Delta v)+b_u\Delta u+b_v\Delta v+b E^2(Δu,Δv)=buu(Δu)2+bvv(Δv)2+buv(Δu)(Δv)+buΔu+bvΔv+b
根据二阶导数的情况:
∂ 2 E ∂ u 2 = e u + v 2 e u v + 2 ∂ 2 E ∂ v 2 = 4 e 2 v + u 2 e u v + 4 ∂ 2 E ∂ u ∂ v = e u v + v u e u v − 2 \frac{\partial^2 E}{\partial u^2}=e^u+v^2e^{uv}+2\\ \frac{\partial^2 E}{\partial v^2}=4e^{2v}+u^2e^{uv}+4\\ \frac{\partial^2 E}{\partial u\partial v}=e^{uv}+vue^{uv}-2 u22E=eu+v2euv+2v22E=4e2v+u2euv+4uv2E=euv+vueuv2
将上式代入二阶泰勒展开,推出: ( 1.5 , 4 , − 1 , − 2 , 0 , 3 ) (1.5,4,-1,-2,0,3) (1.5,4,1,2,0,3)


在这里插入图片描述
将黑塞/海森矩阵(Hessian Matrix)表示为 ∇ 2 E ( u , v ) \nabla^2E(u,v) 2E(u,v),并假设该矩阵是正定的。以下哪个时最佳的 ( Δ u , Δ v ) (\Delta u,\Delta v) (Δu,Δv)使得 E ^ 2 \hat E_2 E^2取到最小值?(这个方向称之为Newton Direction)

找使得 E ^ 2 \hat E_2 E^2最小的 ( Δ u , Δ v ) (\Delta u,\Delta v) (Δu,Δv),可以直接通过求导获得。分别对 Δ u \Delta u Δu Δ v \Delta v Δv求导,结果如下:
∂ E 2 ∂ Δ u = ∂ E ∂ u + Δ u ∂ 2 E ∂ u 2 + Δ v ∂ 2 E ∂ u ∂ v = 0 ∂ E 2 ∂ Δ v = ∂ E ∂ v + Δ v ∂ 2 E ∂ v 2 + Δ u ∂ 2 E ∂ u ∂ v = 0 \frac{\partial E_2}{\partial \Delta u}=\frac{\partial E}{\partial u}+\Delta u\frac{\partial^2 E}{\partial u^2}+\Delta v\frac{\partial^2 E}{\partial u\partial v}=0\\ \frac{\partial E_2}{\partial \Delta v}=\frac{\partial E}{\partial v}+\Delta v\frac{\partial^2 E}{\partial v^2}+\Delta u\frac{\partial^2 E}{\partial u\partial v}=0 ΔuE2=uE+Δuu22E+Δvuv2E=0ΔvE2=vE+Δvv22E+Δuuv2E=0
联立上述两式,并将 ( Δ u , Δ v ) (\Delta u,\Delta v) (Δu,Δv)以向量形式提取出来可以化简为:
( Δ u , Δ v ) T = − ( ∇ 2 E ) − 1 ∇ E (\Delta u,\Delta v)^T=-(\nabla^2E)^{-1}\nabla E (Δu,Δv)T=(2E)1E


在这里插入图片描述
( u 0 , v 0 ) (u_0,v_0) (u0,v0)利用Newton Direction(无 η \eta η)进行参数更新,五轮更新后 ( u 5 , v 5 ) (u_5,v_5) (u5,v5) E E E 结果为?

通过简单的程序可得: u = 0.6118 , v = 0.0705 , E = 2.3608 u= 0.6118,v= 0.0705,E=2.3608 u=0.6118,v=0.0705,E=2.3608

从该结果可以看出,Newton Direction更新速度更快,但是代价是求Hessian矩阵引入的复杂性。


问题11-12:关于特征转换的问题。
在这里插入图片描述
考虑二维空间上的6个点,采用含有二次函数,线性函数的hypotheses集合,最多能shatter其中的几个点。shatter的意思是说将输入样本点完全二分。看下图:
在这里插入图片描述
使用上述六条线可以将六个样本点shatter。


在这里插入图片描述
假设转换之前预先“偷看”了所有 N N N个数据,并定义一种特殊的特征转换,将 x ∈ R d → z ∈ R N x\in \mathbb{R}^d\to z\in\mathbb{R}^N xRdzRN
( Φ ( x ) ) n = z n = [ x = x n ] (\Phi(x))_n=z_n=[x=x_n] (Φ(x))n=zn=[x=xn]
这题的关键在于理解这种“奇葩”的特征转换,举个例子,如第1个数据 x 1 x_1 x1,根据上述规则则变为 [ 1 , 0 , . . . , 0 ] T [1,0,...,0]^T [1,0,...,0]T,(矩阵大小 N × 1 N\times1 N×1)就是将第几个数对应的行置为1,其他行均为0。显然,不管多少数,其转换后的向量是两两正交的,正交的向量一定是线性无关的,因此均可以被shatter,所以 d v c ( H Φ ) = ∞ d_{vc}(H_\Phi)=\infty dvc(HΦ)=。所以答案为C。


问题13-15:主要关于线性回归问题和特征转换。

数据产生:数据集大小 N = 1000 N=1000 N=1000,且 X = [ − 1 , 1 ] × [ − 1 , 1 ] \mathcal{X}=[-1,1]\times[-1,1] X=[1,1]×[1,1],每个数据的 x \mathbb{x} x均等概率的从 X \mathcal{X} X中提取。而对应的 y y y则根据 f ( x 1 , x 2 ) = s i g n ( x 1 2 + x 2 2 − 0.6 ) f(x_1,x_2)=sign(x_1^2+x_2^2-0.6) f(x1,x2)=sign(x12+x220.6)来确定,且对数据集中的 10 % 10\% 10%的数据的 y y y进行反转(相当于添加噪声)。

先对线性回归算法进行简单的说明:

函数集: y = w T x y=w^T\mathbb{x} y=wTx

损失函数: E i n ( w ) = 1 N ∑ n = 1 N ( w T x n − y n ) 2 E_{in}(w)=\frac{1}{N}\sum_{n=1}^N(w^T\mathbb{x}_n-y_n)^2 Ein(w)=N1n=1N(wTxnyn)2

梯度: ∇ E i n ( w ) = 2 N ( X T X w − X T y ) \nabla E_{in}(w)=\frac{2}{N}(X^TXw-X^T\mathbb{y}) Ein(w)=N2(XTXwXTy)

“目的”:寻找 w w w使得损失函数最小

Linear Regression

①获得数据 ( x 1 , y 1 ) , . . . , ( x N , y N ) (\mathbb{x}_1,y_1),...,(\mathbb{x}_N,y_N) (x1,y1),...,(xN,yN)
②采用闭式解公式求出最佳 w w w w l i n = ( X T X ) − 1 X T y w_{lin}=(X^TX)^{-1}X^T\mathbb{y} wlin=(XTX)1XTy
③返回 w l i n w_{lin} wlin

如果还有预测过程,直接 y ^ = w l i n T x \hat{y}=w_{lin}^Tx y^=wlinTx


在这里插入图片描述
不进行特征转换,只采用特征 ( 1 , x 1 , x 2 ) (1, x_1,x_2) (1,x1,x2),利用Linear Regression获得最佳的 w l i n w_{lin} wlin。将其直接运用到分类问题上面(利用 s i g n ( w T x ) sign(w^Tx) sign(wTx)),在利用 0 / 1 0/1 0/1判据来衡量训练样本误差 E i n E_{in} Ein。进行1000次实验,取误差的平均。

Ein: 0.5036

通过上面结果可知,直接利用Linear Regression(利用square error)再运用到分类问题上结果很差!


问题14-15:将数据的特征进行转换,转换为 ( 1 , x 1 , x 2 , x 1 x 2 , x 1 2 , x 2 2 ) (1,x_1,x_2,x_1x_2,x_1^2,x_2^2) (1,x1,x2,x1x2,x12,x22)这6项,再利用Linear Regression获得最佳的 w l i n w_{lin} wlin,求该 w l i n w_{lin} wlin以及将其运用到测试集上的测试误差 E o u t E_{out} Eout(衡量方式与Q13相同)。
在这里插入图片描述

theta:[[-1.01626639 0.07325707 0.02834912 -0.0155599 1.63387468 1.52477431]]
选项中最接近的为:
g ( x 1 , x 2 ) = s i g n ( − 1 − 0.05 x 1 + 0.08 x 2 + 0.13 x 1 x 2 + 1.5 x 1 2 + 1.5 x 2 2 ) g(x_1,x_2)=sign(-1-0.05x_1+0.08x_2+0.13x_1x_2+1.5x_1^2+1.5x_2^2) g(x1,x2)=sign(10.05x1+0.08x2+0.13x1x2+1.5x12+1.5x22)


在这里插入图片描述
在14题得到的最优w的基础上,产生1000个测试样本,计算误差。重复1000次求平均。

Eout: 0.125225


问题16-17:关于多类别logistics regression问题。针对K类别分类问题,我们定义输出空间 Y = { 1 , 2 , . . . , K } \mathcal{Y}=\{1,2,...,K\} Y={1,2,...,K},MLR的函数集可以视为由一系列(K个)权值向量 ( w 1 , . . . , w K ) (w_1,...,w_K) (w1,...,wK)构成,其中每个权值向量均为 d + 1 d+1 d+1维。每种假设函数可以表示为:
h y ( x ) = e x p ( w y T x ) ∑ i = 1 K e x p ( w i T x ) h_y(x)=\frac{exp(w^T_y\mathbb{x})}{\sum_{i=1}^Kexp(w_i^T\mathbb{x})} hy(x)=i=1Kexp(wiTx)exp(wyTx)
且可以用来近似潜在的目标分布函数 P ( y ∣ x ) P(y|\mathbb{x}) P(yx)。MLR的“目标”就是从假设函数集中寻找使得似然函数最大的额假设函数。
在这里插入图片描述

类似Lecture10中最小化 − l o g ( l i k e l i h o o d ) -log(likelihood) log(likelihood)一样,推导 E i n ( w 1 , . . . , w K ) E_{in}(w_1,...,w_K) Ein(w1,...,wK)

采用同样的处理方式
m a x   1 N ∏ i = 1 N h y ( x ) → m i n   − 1 N ∑ i = 1 N l o g ( h y ( x ) ) max\ \frac{1}{N}\prod_{i=1}^Nh_y(\mathbb{x})\to min\ -\frac{1}{N}\sum_{i=1}^Nlog(h_y(\mathbb{x})) max N1i=1Nhy(x)min N1i=1Nlog(hy(x))
将MLR的假设函数代入上式并化简可得:
1 N ∑ n = 1 N ( l n ( ∑ i = 1 K e x p ( w i T x n ) ) − w y n T x n ) \frac{1}{N}\sum_{n=1}^N\big(ln(\sum_{i=1}^Kexp(w_i^T\mathbb{x}_n))-w^T_{y_n}\mathbb{x}_n\big) N1n=1N(ln(i=1Kexp(wiTxn))wynTxn)


在这里插入图片描述
针对上述的 E i n E_{in} Ein,它的一阶导数 ∇ E i n \nabla E_{in} Ein可以表示为 ( ∂ E i n ∂ w 1 , ∂ E i n ∂ w 2 , , . . . , ∂ E i n ∂ w K ) \big(\frac{\partial E_{in}}{\partial w_1},\frac{\partial E_{in}}{\partial w_2,},...,\frac{\partial E_{in}}{\partial w_K}\big) (w1Ein,w2,Ein,...,wKEin),求 ∂ E i n ∂ w i \frac{\partial E_{in}}{\partial w_i} wiEin

直接对A16的答案的式子进行求导,就可以得到下式:
1 N ∑ n = 1 N ( ( h i ( x n ) − [ y n = i ] x n ) \frac{1}{N}\sum_{n=1}^N\big((h_i(\mathbb{x}_n)-[y_n=i]\mathbb{x}_n\big) N1n=1N((hi(xn)[yn=i]xn)


问题18-20:关于logistic regression实现的问题。

首先看一下算法:

函数集: s = ∑ i = 0 d w i x i s=\sum_{i=0}^dw_ix_i s=i=0dwixi h ( x ) = θ ( s ) = 1 1 + e − s h(\mathbb{x})=\theta(s)=\frac{1}{1+e^{-s}} h(x)=θ(s)=1+es1

损失函数: E i n ( w ) = 1 N ∑ i = 1 N l n ( 1 + e x p ( − y n w T x n ) ) E_{in}(w)=\frac{1}{N}\sum_{i=1}^Nln(1+exp(-y_nw^T\mathbb{x}_n)) Ein(w)=N1i=1Nln(1+exp(ynwTxn))

梯度: ∇ E i n = 1 N ∑ i = 1 N θ ( − y n w T x n ) ( − y n x n ) \nabla E_{in}=\frac{1}{N}\sum_{i=1}^N\theta\big(-y_nw^T\mathbb{x}_n\big)(-y_n\mathbb{x}_n) Ein=N1i=1Nθ(ynwTxn)(ynxn)

目标:寻找一个最佳假设函数使得损失函数最小

(注: h ( x ) h(\mathbb{x}) h(x)来近似 P ( y ∣ x ) P(y|\mathbb{x}) P(yx)上述的损失函数通过cross-entropy可推导出来)

Logistic Regression:

初始化 w w w
For t=0,1,…
① 计算 ∇ E i n ( w ) \nabla E_{in}(w) Ein(w)
② 更新参数: w ← w − η ∇ E i n ( w ) w\gets w-\eta\nabla E_{in}(w) wwηEin(w)
返回 w w w

(上述 η \eta η可以视为一个超参数,可以通过cross-validation来确定)


在这里插入图片描述
针对 η = 0.001 ,   T = 2000 \eta=0.001,\ T=2000 η=0.001, T=2000的情况,采用梯度下降法获得 w w w后,在测试集上的错误率是多少?(利用0/1判据)

Ein = 0.466;Eout = 0.475。


在这里插入图片描述
针对 η = 0.01 ,   T = 2000 \eta=0.01,\ T=2000 η=0.01, T=2000的情况,采用梯度下降法获得 w w w后,在测试集上的错误率是多少?(利用0/1判据)

Ein = 0.197;Eout = 0.22。


在这里插入图片描述
针对 η = 0.001 ,   T = 2000 \eta=0.001,\ T=2000 η=0.001, T=2000的情况,采用随机梯度下降法(此处采用按顺序每次选择元素,更通常的做法是随机选择元素)获得 w w w后,在测试集上的错误率是多少?(利用0/1判据)

Ein = 0.464;Eout = 0.473。


import numpy as np
import pandas as pd
import math
import scipy.linalg as lin # 该模块包含线性代数的函数
import matplotlib.pyplot as plt

# Q3:4种不同的误差衡量和0/1误差
plt.figure(dpi=150)
plt.style.use('science')
z = np.arange(-2, 2, 0.01)

err0 = z.copy()
err0[err0 >= 0] = 0
err0[err0 < 0] = 1

err1 = 1-z.copy()
err1[err1 < 0] = 0

err2 = -z.copy()
err2[err2 < 0] = 0

err3 = 1-z.copy()
err3[err3 < 0] = 0
err3 = np.power(err3, 2)

err4 = 1/2 * (np.exp(-z))

plt.plot(z, err0, label='err0/1')
plt.plot(z, err1, label='err1')
plt.plot(z, err2, label='err2')
plt.plot(z, err3, label='err3')
plt.plot(z, err4, label='err4')

plt.legend()
plt.show()
# Q7
u = 0
v = 0
eta = 0.01
for i in range(5):
    du = math.exp(u) + v*math.exp(u*v) + 2*u-2*v-3
    dv = 2*math.exp(2*v) + u*math.exp(u*v) - 2*u + 4*v-2
    u -= eta*du
    v -= eta*dv
print('u=', np.round(u,decimals=4))
print('v=', np.round(v,decimals=4))
E = math.exp(u)+math.exp(2*v)+math.exp(u*v)+u**2-2*u*v+2*v**2-3*u-2*v
print(np.round(E,decimals=4))
# Q10
u = 0; v = 0
uv = np.array([[0], [0]])

for i in range(5):
    du = math.exp(u) + v*math.exp(u*v) + 2*u - 2*v - 3
    dv = 2*math.exp(2*v) + u*math.exp(u*v) - 2*u + 4*v-2

    du2 = math.exp(u) + v**2*math.exp(u*v) + 2
    dv2 = 4*math.exp(2*v) + u**2*math.exp(u*v) + 4
    dudv = math.exp(u*v) + v*u*math.exp(u*v) - 2
    
    ddE = np.array([[du2, dudv], [dudv, dv2]])
    dE = np.array([[du], [dv]])
    uv = uv-lin.inv(ddE).dot(dE) # linalg.inv():矩阵求逆
    u = uv[0, 0]
    v = uv[1, 0]
print('u and v: ',uv.T)
E = math.exp(u) + math.exp(2*v) + math.exp(u*v) + u**2 - 2*u*v + 2*v**2 - 3*u -2*v
print('E: ',E)
# 数据生成函数
def generate_data(num):
    axeX = np.random.uniform(-1, 1, num) # 在[-1,1)内随机采样
    axeY = np.random.uniform(-1, 1, num)
    
    # np.c_:按【列】连接两个矩阵,要求行数相等。np.r_:按【行】连接两个矩阵,要求列数相等;
    Xtemp = np.c_[axeX, axeY]
    X = np.c_[np.ones((num, 1)), Xtemp]
    
    Ytemp = np.sign(np.power(axeX, 2)+np.power(axeY, 2)-0.6)
    Ytemp[Ytemp == 0] = -1
    
    pos = np.random.permutation(num)
    Ytemp[pos[0: round(0.1*num)]] *= -1
    
    Y = Ytemp.reshape((num, 1))
    
    return X, Y
totalerr = 0
for i in range(1000):
    X, Y = generate_data(1000)
    
    theta = lin.pinv(X.T.dot(X)).dot(X.T).dot(Y) # linalg.pinv矩阵伪逆
    
    ypred = np.sign(X.dot(theta))
    
    err = np.sum(ypred!=Y)/1000
    
    totalerr += err
    
print('Ein: ', totalerr/1000)
# 特征转换函数
def transform(X):
    row, col = X.shape
    Xback = np.zeros((row, 6))
    Xback[:, 0:col] = X
    Xback[:, col] = X[:, 1]*X[:, 2]
    Xback[:, col+1] = X[:, 1]**2
    Xback[:, col+2] = X[:, 2]**2
    return Xback

# Q14
totalerr = 0
for i in range(1000):
    X, Y = generate_data(1000)
    Xtran = transform(X)
    
    theta = lin.pinv(Xtran.T.dot(Xtran)).dot(Xtran.T).dot(Y)
    
    Xtest, Ytest = generate_data(1000)
    
    Xback = transform(Xtest)
    
    ypred = np.sign(Xback.dot(theta))
    
    err = np.sum(ypred!=Ytest)/1000
    
    totalerr += err
    
print('theta: ', theta.T)
print('Ein: ', totalerr/1000)
# sigmoid函数
def sigmoid(z):
    zback = 1/(1+np.exp(-1*z))
    return zback


# Logistic Regression
def logistic_regression(X, Y, eta, numiter, flag=0):
    row, col = X.shape
    theta = np.zeros((col, 1))
    num = 0
    for i in range(numiter):
        if flag == 0:
            derr = (-1*X*Y).T.dot(sigmoid(-1*X.dot(theta)*Y))/row
        else:
            if num >= row:
                num = 0
            derr = -Y[num, 0]*X[num: num+1, :].T*sigmoid(-1*X[num, :].dot(theta)[0]*Y[num, 0])
            num += 1
        theta -= eta*derr
    return theta

# 导入数据函数
def load_data(filename):
    data = pd.read_csv(filename, sep='\s+', header=None)
    col, row = data.shape
    X = np.c_[np.ones((col, 1)), data.iloc[:, 0: row-1]]
    Y = data.iloc[:, row-1:row].values
    return X, Y

# 误差计算函数
def mistake(X, Y, theta):
    yhat = X.dot(theta)
    yhat[yhat > 0] = 1
    yhat[yhat <= 0] = -1
    err = np.sum(yhat != Y)/len(Y)
    return err

X, Y = load_data('hw3_train.dat')
testX, testy = load_data('hw3_test.dat')
# Q18
eta = 0.001; T = 2000; flag = 0
theta = logistic_regression(X, Y, eta, T, flag)
errin = mistake(X, Y, theta)
errout = mistake(testX, testy, theta)
print(f'Ein = {errin};', 'Eout = ', errout)
# Q19
eta = 0.01; T = 2000; flag = 0
theta = logistic_regression(X, Y, eta, T, flag)
errin = mistake(X, Y, theta)
errout = mistake(testX, testy, theta)
print(f'Ein = {errin};', 'Eout = ', errout)
# Q20
eta = 0.001; T = 2000; flag = 1
theta = logistic_regression(X, Y, eta, T, flag)
errin = mistake(X, Y, theta)
errout = mistake(testX, testy, theta)
print(f'Ein = {errin};', 'Eout = ', errout)

参考:
机器学习基石作业3:https://github.com/AceCoooool/MLF-MLT

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

datamonday

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值