1. 描述
在这个练习中,你将实现正则化的线性回归和正则化的逻辑回归。
2. 数据
首先,下载data3.zip和从压缩文件中提取文件。这个数据包包含两组数据,一组用于线性回归(ex3Linx.dat和ex3Liny.dat),另一个用于逻辑回归(x3Logx.dat和ex3Logy.dat)。还包含一个名为"map_feature"的辅助函数。将用于逻辑回归。确保这个函数的m文件位于您计划编写代码的相同工作目录中。
3. 正则化线性回归
本练习第一部分着重于正规线性回归和正规方程。加载数据文件"ex3Linx.dat"和"ex3Liny.dat"。在你的程序中,这对应你要开始的变量x和y。注意,在这个数据中,输入"x"是一个单独的特征,因此你可以将y作为x的函数绘制在二维图上(你可以自己尝试):从这个图上可以看出来,拟合直线可能过于简单。相反,我们将尝试对数据拟合一个高阶多项式,以捕捉更多点的变化。
我们试试五阶多项式。我们的假设是(1) h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 + θ 5 x 5
h _ { \theta } ( x ) = \theta _ { 0 } + \theta _ { 1 } x + \theta _ { 2 } x ^ { 2 } + \theta _ { 3 } x ^ { 3 } + \theta _ { 4 } x ^ { 4 } + \theta _ { 5 } x ^ { 5 }
\tag{1}
h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 + θ 5 x 5 ( 1 )
这意味着有六个特征的假设,因为x 0 , x 1 , … , x 5 x_0,x_1,\dots,x_5 x 0 , x 1 , … , x 5 是我们回归的所以特征。注意,即使我们得到了一个多项式拟合,我们仍有一个线性回归的问题因为每个特征的假设都是线性的。
由于我们将一个5阶多项式拟合到一个只有7个点的数据集,因此很可能出现过拟合。为了防止这种情况,我们将在模型中使用正则化。回想一下正则化问题,目标是最小化关于θ \theta θ 的代价函数(2) J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ]
J ( \theta ) = \frac { 1 } { 2 m } \left[ \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) ^ { 2 } + \lambda \sum _ { j = 1 } ^ { n } \theta _ { j } ^ { 2 } \right]
\tag{2}
J ( θ ) = 2 m 1 [ i = 1 ∑ m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ j = 1 ∑ n θ j 2 ] ( 2 )
其中λ \lambda λ 是正则化参数。正则化参数λ \lambda λ 是控制在你的拟合参数。随着拟合参数的增大,对成本函数的惩罚也会增大,这个点球是依赖于参数的平方以及λ \lambda λ 的大小。同时,求和后λ \lambda λ 不包括θ 0 2 \theta_0^2 θ 0 2 。
现在,我们将使用正规方程找到模型的最佳参数。回想一下正则化线性回归的正规方程解是θ = ( X T X + λ [ 0 1 ⋱ 1 ] ) − 1 X T y ⃗
\theta = ( X ^ { T } X + \lambda \left[ \begin{array} { c c c c } { 0 } & { } & { } \\ { } & { 1 } & { } \\ { } & { } & { \ddots } & { } \\ { } & { } & { } & { 1 } \end{array} \right] ) ^ { - 1 } X ^ { T } \vec { y }
θ = ( X T X + λ ⎣ ⎢ ⎢ ⎡ 0 1 ⋱ 1 ⎦ ⎥ ⎥ ⎤ ) − 1 X T y
跟在λ \lambda λ 后的矩阵是一个左上角一个0和剩余对角线元素为1的对角(n+1)×(n+1)矩阵(记住,n是特征的数量)。向量y y y 和矩阵X X X 对于非正则回归有相同的定义。
使用这个方程,找出使用以下三个正则化参数θ \theta θ 的值
λ = 0 \lambda=0 λ = 0
λ = 1 \lambda=1 λ = 1
λ = 10 \lambda=10 λ = 1 0
当你实现你的程序时,请记住,X X X 是一个m × ( n + 1 ) m \times (n+1) m × ( n + 1 ) 矩阵,因为有m m m 个训练样本和n n n 个特征,加上一个x 0 = 1 x_0 = 1 x 0 = 1 的截距项。在提供给这个练习的数据中,你只是给出x x x 的一次方。你需要在你的向量X X X 中给出其它x x x 的平方,这意味着X X X 的第一列都是1,第二列是x x x 的一次方,第三列是x x x 的二次方,依次进行下去。你可以使用Matlab/Octave命令如下
x = [ ones ( m, 1 ) , x, x. ^ 2 , x. ^ 3 , x. ^ 4 , x. ^ 5 ] ;
显示在不同λ \lambda λ 时θ \theta θ 的值。同时,画出不同λ \lambda λ 对应的多项式图像。例如,如果λ = 0 \lambda=0 λ = 0 会得到和图2类似。从这些结果中,你能了解正则化参数λ \lambda λ 是如何影响你的模型的吗?
4. 正则化逻辑回归
在练习的第二部分中,你将使用牛顿方法实现正则逻辑回归。首先,在你的程序中加载文件ex3Logx.dat和ex3Logy.dat。该数据表示具有两个特征的逻辑回归问题的训练集。为了避免后面的混淆,我们将引用"ex3Logx.dat"中包含的两个输入特性作为u和v。所以在"ex3Logx.dat"文件中,第一列的数字代表特征u,在横轴上绘制,第二列特征代表v,在纵轴上绘制。
加载数据后,使用不同的标记绘制点,以区分两种分类。Matlab/Octave中的命令为
x = load ( 'ex3Logx.dat' ) ;
y = load ( 'ex3Logy.dat' ) ;
figure
% Find the indices for the 2 calsses
pos = find ( y == 1 ) ; neg = find ( y == 0 ) ;
plot ( x ( pos, 1 ) , x ( pos, 2 ) , '+' ) ;
hold on
plot ( x ( neg, 1 ) , x ( neg, 2 ) , '+' ) ;
绘制完图片后,应该是这样的:
现在我们将为这些数据拟合一个规范化的回归模型。回想一下,在Logistic回归中,假设函数为h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x = P ( y = 1 ∣ x ; θ )
h _ { \theta } ( x ) = g \left( \theta ^ { T } x \right) = \frac { 1 } { 1 + e ^ { - \theta ^ { T } x } } = P ( y = 1 | x ; \theta )
h θ ( x ) = g ( θ T x ) = 1 + e − θ T x 1 = P ( y = 1 ∣ x ; θ )
在这次练习中,我们将分配x x x 的所有单项(即多项式计算)的u和v的6次方:x = [ 1 u v u 2 u v v 2 u 3 ⋮ u v 5 v 6 ]
x = \left[ \begin{array} { c } { 1 } \\ { u } \\ { v } \\ { u ^ { 2 } } \\ { u v } \\ { v ^ { 2 } } \\ { u ^ { 3 } } \\ { \vdots } \\ { u v ^ { 5 } } \\ { v ^ { 6 } } \end{array} \right]
x = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 u v u 2 u v v 2 u 3 ⋮ u v 5 v 6 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
为了澄清这个符号,我们做了一个28个特征的向量x x x ,其中x 0 = 1 , x 2 = v , … , x 28 = v 6 x_0=1,x_2=v,\dots,x_{28}=v^6 x 0 = 1 , x 2 = v , … , x 2 8 = v 6 。记住,u是在"ex3Logx.dat"中的第一列数字,v是第二列。从现在开始,我们把x x x 的元素记作x 0 , x 1 x_0,x_1 x 0 , x 1 等等,而不是它们的值用u和v表示。
为了避免枚举所有x x x 项的麻烦,我们包含了一个Matlab/Octave辅助函数,名为"map_feature",它将原始数据映射到特征向量。这个函数使用于单个训练示例,也适用于整个训练示例。为了使用这个函数,将"map_feature.m"放在你的工作目录中
x = map_feature ( u, v)
假设这两个原始特征存储在名为"u"和"v"的列向量中。如果只有一个训练示例,那么每个列向量都是标量。函数将输出存储在"x"中的新的特征数组。当然,您可以为参数和输出使用任何你想要的名称。只要确保两个参数是相同大小的列向量即可。
在建立这个模型之前,回想一下我们的目标是最小化正则化逻辑回归的最小代价函数:J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2
J ( \theta ) = - \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left[ y ^ { ( i ) } \log \left( h _ { \theta } \left( x ^ { ( i ) } \right) \right) + \left( 1 - y ^ { ( i ) } \right) \log \left( 1 - h _ { \theta } \left( x ^ { ( i ) } \right) \right) \right] + \frac { \lambda } { 2 m } \sum _ { j = 1 } ^ { n } \theta _ { j } ^ { 2 }
J ( θ ) = − m 1 i = 1 ∑ m [ y ( i ) log ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] + 2 m λ j = 1 ∑ n θ j 2
注意,这看起来像非正则逻辑回归的成本函数,除了最后有一个正则项。现在我们用牛顿法求这个函数的最小值。回想一下牛顿方法的更新规则是θ ( t + 1 ) = θ ( t ) − H − 1 ∇ θ J
\theta ^ { ( t + 1 ) } = \theta ^ { ( t ) } - H ^ { - 1 } \nabla _ { \theta } J
θ ( t + 1 ) = θ ( t ) − H − 1 ∇ θ J
这与练习4中用于非正则逻辑回归的规则相同,但因为你现在实现正则化,梯度∇ θ J \nabla_\theta J ∇ θ J 和海森矩阵H H H 有不同的形式(3) ∇ θ J = [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) + λ m θ 1 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) + λ m θ 2 ⋮ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x n ( i ) + λ m θ n ]
\nabla _ { \theta } J = \left[ \begin{array} { c } { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) x _ { 0 } ^ { ( i ) } } \\ { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) x _ { 1 } ^ { ( i ) } + \frac { \lambda } { m } \theta _ { 1 } } \\ { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) x _ { 2 } ^ { ( i ) } + \frac { \lambda } { m } \theta _ { 2 } } \\ { \vdots } \\ { \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \left( h _ { \theta } \left( x ^ { ( i ) } \right) - y ^ { ( i ) } \right) x _ { n } ^ { ( i ) } + \frac { \lambda } { m } \theta _ { n } } \end{array} \right]
\tag{3}
∇ θ J = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ m 1 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) m 1 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) + m λ θ 1 m 1 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 2 ( i ) + m λ θ 2 ⋮ m 1 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x n ( i ) + m λ θ n ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ( 3 ) (4) H = 1 m [ ∑ i = 1 m h θ ( x ( i ) ) ( 1 − h θ ( x ( i ) ) ) x ( i ) ( x ( i ) ) T ] + λ m [ 0 1 ⋱ 1 ]
H = \frac { 1 } { m } \left[ \sum _ { i = 1 } ^ { m } h _ { \theta } \left( x ^ { ( i ) } \right) \left( 1 - h _ { \theta } \left( x ^ { ( i ) } \right) \right) x ^ { ( i ) } \left( x ^ { ( i ) } \right) ^ { T } \right] + \frac { \lambda } { m } \left[ \begin{array} { c c c c } { 0 } & { } & { } \\ { } & { 1 } & { } \\ { } & { } & { \ddots } & { } \\ { } & { } & { } & { 1 } \end{array} \right]
\tag{4}
H = m 1 [ i = 1 ∑ m h θ ( x ( i ) ) ( 1 − h θ ( x ( i ) ) ) x ( i ) ( x ( i ) ) T ] + m λ ⎣ ⎢ ⎢ ⎡ 0 1 ⋱ 1 ⎦ ⎥ ⎥ ⎤ ( 4 )
注意,如果你把λ = 0 \lambda = 0 λ = 0 代入这些表达式,您将看到和非正则化逻辑回归有相同的公式,在这些公式中,
x ( i ) x^{(i)} x ( i ) 是你的特征向量,在这个练习中这是一个28×1的向量。
∇ θ J \nabla_\theta J ∇ θ J 是28×1的向量。
x ( i ) ( x ( i ) ) T x^{(i)}(x^{(i)})^T x ( i ) ( x ( i ) ) T 和H H H 是28×28的矩阵。
y ( i ) y^{(i)} y ( i ) 和h θ ( x ( i ) ) h_\theta(x^{(i)}) h θ ( x ( i ) ) 是标量。
λ m \frac{\lambda}{m} m λ 后面的矩阵在海森公式中是一个左上角一个0和剩余对角线元素为1的对角28×28矩阵。
现在在这个数据集上使用如下的λ \lambda λ 值运行牛顿法
a. λ = 0 \lambda = 0 λ = 0 (这是和非正则化线性回归相同的例子)
b. λ = 1 \lambda = 1 λ = 1
c. λ = 10 \lambda = 10 λ = 1 0
打印每次迭代中的J ( θ ) J(\theta) J ( θ ) 值,为了确定牛顿法是否已经收敛。J ( θ ) J(\theta) J ( θ ) 不应该在使用牛顿法中的任何时候都减少,如果是,检查你是否正确定义了J ( θ ) J(\theta) J ( θ ) ,还要检查梯度和海森的定义,以确保正则化部分没有错误。
收敛后,用θ \theta θ 的值找出分类问题中的决策边界。决策边界定义为其中的直线P ( y = 1 ∣ x ; θ ) = 0.5 ⟹ θ T x = 0
P ( y = 1 | x ; \theta ) = 0.5 \quad \Longrightarrow \quad \theta ^ { T } x = 0
P ( y = 1 ∣ x ; θ ) = 0 . 5 ⟹ θ T x = 0
在此处绘制决策边界比在线性回归中绘制最佳拟合曲线更为棘手。您需要通过绘制轮廓来绘制θ T x = 0 \theta^Tx = 0 θ T x = 0 线的隐含性。这可以通过在表示原始u和v输入的点网格上θ T x \theta^Tx θ T x 值,然后绘制θ T x \theta^Tx θ T x 值为零的线来完成。使用以下代码在θ \theta θ 的不同值下绘制决策边界。
% Define the ranges of the grid
u = linspace ( - 1 , 1.5 , 200 ) ;
v = linspace ( - 1 , 1.5 , 200 ) ;
% Initialize space for the values to be plotted
z = zeros ( length ( u) , length ( v) ) ;
% Evaluate z = theta* x over the grid
for i = 1 : length ( u)
for j = 1 : length ( v)
% Notice the order of j , i here!
z ( j, i) = map_feature ( u ( i) , v ( j) ) * theta ;
end
end
% Because of the way that contour plotting works
% in Matlab , we need to transpose z , or
% else the axis orientation will be flipped!
z = z '
% Plot z = 0 by specifying the range [ 0 , 0 ]
contour ( u , v , z , [ 0 , 0 ] , ' LineWidth ' , 2 )
最后,因为有28个元素θ \theta θ ,我们不会提供一个解决方案中的元素比较。相反,使用norm(θ \theta θ )来计算θ \theta θ 的L2范数,检查它的标准解决方案。λ \lambda λ 是如何影响结果的?