本文总结机器学习基石的第三次作业,主要包括误差函数、特征转换、二阶泰勒展开,以及线性回归,逻辑回归的实现。
问题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)=N1∣∣y−y^∣∣2=N1∣∣(I−XX†)y∣∣2=N1∣∣(I−H)y∣∣2
从上图可知,
(
I
−
H
)
y
=
(
I
−
H
)
n
o
i
s
e
(I-H)\mathbb{y}=(I-H)noise
(I−H)y=(I−H)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∣∣(I−H)noise∣∣2。为了简化起见,令
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=(I−H),B=noise→∣∣AB∣∣2=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)
∣∣AB∣∣2=trace((AB)TAB)=trace(BBTATA)=BBTtrace(ATA)=∣∣noise∣∣2trace(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((I−H)T(I−H))=trace(I−H)=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)=(1−Nd+1)∣∣noise∣∣2
当
σ
=
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)]=(1−Nd+1)σ2
从而相当于
(
1
−
9
/
N
)
∗
0.01
≥
0.0008
→
N
=
45
(1-9/N)*0.01\ge 0.0008\to N=45
(1−9/N)∗0.01≥0.0008→N=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(I−H)=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 w←w+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)=[∂x∂f,∂y∂f]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)=[∂x2∂2f,∂y∂x∂2f;∂y∂x∂2f,∂y2∂2f]
二阶泰勒展开:
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)+Δx∂x∂f(x,y)+Δy∂y∂f(x,y)+2!1[(Δx)2∂x2∂2f(x,y)+2ΔxΔy∂x∂y∂2f(x,y)+(Δy)2∂y2∂2f(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+u2−2uv+2v2−3u−2v
∇
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
∂u∂E(u,v)=eu+veuv+2u−2v−3∂v∂E(u,v)=2e2v+ueuv−2u+4v−2
将
(
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
∂u2∂2E=eu+v2euv+2∂v2∂2E=4e2v+u2euv+4∂u∂v∂2E=euv+vueuv−2
将上式代入二阶泰勒展开,推出:
(
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
∂Δu∂E2=∂u∂E+Δu∂u2∂2E+Δv∂u∂v∂2E=0∂Δv∂E2=∂v∂E+Δv∂v2∂2E+Δu∂u∂v∂2E=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)−1∇E
对
(
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
x∈Rd→z∈RN
(
Φ
(
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+x22−0.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)=N1∑n=1N(wTxn−yn)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(XTXw−XTy)
“目的”:寻找 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(−1−0.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(y∣x)。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=1∏Nhy(x)→min −N1i=1∑Nlog(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=1∑N(ln(i=1∑Kexp(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)
(∂w1∂Ein,∂w2,∂Ein,...,∂wK∂Ein),求
∂
E
i
n
∂
w
i
\frac{\partial E_{in}}{\partial w_i}
∂wi∂Ein。
直接对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=1∑N((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+e−s1
损失函数: 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)=N1∑i=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=N1∑i=1Nθ(−ynwTxn)(−ynxn)
目标:寻找一个最佳假设函数使得损失函数最小
(注: h ( x ) h(\mathbb{x}) h(x)来近似 P ( y ∣ x ) P(y|\mathbb{x}) P(y∣x)上述的损失函数通过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) w←w−η∇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