机器学习:Experiment 5: Regularization

实验目的

在本练习中,您将实现正则化线性回归和正则化逻辑回归.

实验步骤与内容

1.数据加载

a.首先,下载ex5Data.zip并从zip文件中解压缩文件。 这个数据包包含两组数据,一组用于线性回归,另一组用于逻辑回归。它还包括一个名为“map_feature.m”的辅助函数,它将用于logistic回归。确保这个函数的m文件放在计划编写代码的同一个工作目录中。

2.线性回归的正则化

a. 这个练习的第一部分着重于正则化线性回归和正规方程。将数据文件ex5Linx.datex5Liny.dat加载到程序中。这些对应于开始时的x和y变量。 请注意,在这些数据中,输入“x”是一个单一的特征,因此你可以在二维图上将y绘成x的函数(自己尝试)。从这张图片来看,拟合一条直线似乎是一种过于简单的近似。然而,我们将尝试对数据拟合一个高阶多项式,以捕捉更多的点的变化。
figure
b.我们来试试五阶多项式。我们的假设是 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 + θ 5 x 5 h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4+\theta_5x^5 hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4+θ5x5

这意味着我们有一个六个特征的假设,因为x0,x1,…x5现在都是我们回归的特征。 请注意,即使我们正在产生多项式拟合,我们仍然有一个线性回归问题,因为假设在每个特征中都是线性的。

c.由于我们将一个5阶多项式拟合到一个只有7个点的数据集,因此可能会发生过拟合。 为了防止这种情况,我们将在我们的模型中使用正则化。 回想一下,在正则化问题中,目标是最小化与θ有关的代价函数:
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J(\theta)=\frac{1}{2m}[\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2] J(θ)=2m1[i=1m(hθ(x(i))y(i))2+λj=1nθj2]

其中λ是正则化参数。 正则化参数λ是对拟合参数的控制。 随着拟合参数的增大,成本函数的惩罚也会增大。这种惩罚取决于参数的平方以及λ的大小。 另外,请注意,λ后的求和不包括 θ 0 2 \theta_0^2 θ02.

d.现在我们将使用正规方程找到模型的最佳参数。回想一下正则化线性回归的正规方程的解是:
θ = ( X T X + λ [ 0   1     .       .         .             1 ] ) − 1 X T y ⃗ \theta=(X^TX+\lambda\begin{bmatrix}0\\ ~ & 1\\~&~&.\\~&~&~&.\\~&~&~&~&.\\~&~&~&~&~&~&1\end{bmatrix})^{-1}X^T\vec{y} θ=(XTX+λ0     1    .   .  .  1)1XTy

与λ对应的矩阵是一个(n + 1)×(n + 1)对角线矩阵,左上方为0,其他对角线项为1。(请记住,n是特性的数量,不包括未处理项)。向量y和矩阵X的定义与非正则回归相同。

e.利用这个方程,用下面的三个正则化参数找到θ的值:
① λ = 0        ( t h i s i s t h e s a m e c a s e a s n o n − r e g u l a r i z e d l i n e a r r e g r e s s i o n ) ① \lambda=0~~~~~~(this is the same case as non-regularized linear regression) λ=0      (thisisthesamecaseasnonregularizedlinearregression)

②     λ = 1 ② ~~~\lambda=1    λ=1

③     λ = 10 ③ ~~~\lambda=10    λ=10

在执行程序时,请记住X是一个m×(n + 1)矩阵,因为有m个训练示例和n个特征,加上x0 = 1这个截距项。 在为本练习提供的数据中,您只给出了x的第一个幂。 您将需要在特征向量X中包含x的其他幂,这意味着第一列将包含所有的幂,下一列将包含第一个幂,下一列将包含第二个幂,以此类推。你可以在Matlab/Octave中使用命令执行此操作。

x_1 = [ ones(length(y),1), x , x.^ 2 , x .^ 3 , x .^ 4 , x .^ 5] %the second lamda
lamda = 0;
metri  = eye(6);
metri(1,1) = 0;
%扩维
theta =(inv(x_1'*x_1 + lamda*metri))*x_1'*y;
disp('theta')
disp(theta)
x_1 = -1:0.01:1;
x_1 = x_1';
m  = length(x_1);
X = [ ones(m,1), x_1 , x_1.^ 2 , x_1 .^ 3 , x_1 .^ 4 , x_1 .^ 5];
plot(x_1,X*theta, '--b','Linewidth',2);

除了列出θ向量的每个元素 θ j θ_j θj的值外,我们还将提供θ的L2范数,这样您就可以快速检查您的答案是否正确。在Matlab/Octave中,您可以使用命令norm(x)计算向量x的L2 -范数。同时,绘制每个数据的多重拟合。你将得到与以下图形类似的图形:
figure
通过这个图形,关于正则化参数λ对模型的影响你能得出什么结论?

(补充,上诉图片大图为:)
figure
figure

figure

3.正则化逻辑回归

在练习的第二部分,你将使用牛顿方法实现正则化逻辑回归。 首先,将文件“ex5Logx.dat”和“ex5Logy.dat”加载到程序中。该数据集表示具有两个特征的Logistic回归问题的训练集。 为了避免以后的混淆,我们将把“ex5Logx.dat”中包含的两个输入特性称为u和v。因此,在“ex5Logx.dat”文件中,第一列数字表示特征u,你将在水平轴上绘制该特征,而第二个特征表示v,你将在垂直轴上绘制该特征。

加载数据后,用不同的标记绘制点来区分这两种分类。在Matlab/Octave中的命令为:

x=load('ex5Logx.dat'); 
y=load('ex5Logy.dat');
figure
% Find the indices for the 2 classes
pos = find(y); 
neg = find(y == 0);
plot(x(pos ,1),x(pos , 2 ),'+','MarkerSize',8)
hold on
plot(x(neg ,1),x(neg ,2),'o','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8)
title('Training data');
xlabel('u');
ylabel('v');
legend('y=1','y=0');

在绘制你的图像后,它应该看起来像这样:
f
现在我们将为该数据拟合一个正则化的回归模型。回想一下,在logistic回归中,假设函数是:
h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x = P ( y = 1 ∣ x ; θ ) h_\theta(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}=P(y=1|x;\theta) hθ(x)=g(θTx)=1+eθTx1=P(y=1x;θ)
在这个练习中,我们将x赋值为所有单项式(意义多项式)u和v,直到第六次幂:
x = [ 1 u v u 2 u v v 2 u 3 ⋅ ⋅ ⋅ u v 5 v 6 ] x=\begin{bmatrix}1\\u\\v\\u^2\\uv\\v^2\\u^3\\·\\·\\·\\uv^5\\v^6\end{bmatrix} x=1uvu2uvv2u3uv5v6

为了说明该理论,我们定义了28个特征向量X,表示为 x 0 = 1 , x 1 = u , x 2 = v , … , x 28 = v 6 x_0=1,x_1=u,x_2=v,…,x_{28}=v^6 x0=1,x1=u,x2=v,,x28=v6 请记住,u是“ex5Logx.dat”文件中的第一列数字,v是第二列。从现在开始,我们只将x的条目称为x0、x1等,而不是它们在u和v方面的值。 为了节省枚举x的所有项的麻烦,我们包含了一个名为“map_feature”的Matlab/Octave助手函数,它将原始输入映射到特征向量。 此函数适用于单个训练示例以及整个训练。 若要使用此函数,请将“map_feature.m”放置在工作目录中并调用

x = map_feature(u,v);

这假设两个原始特征存储在名为“u”和“v”的列向量中。 如果只有一个训练示例,则每个列向量都是标量。 该函数将输出存储在变量“x”中的新特征数组。 当然,您可以为参数和输出使用任何您想要的名称。 只需确保您的两个参数是相同大小的列向量。
在建立这个模型之前,请记住,我们的目标是最小化正则化Logistic回归中的成本函数:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 J(θ)=m1i=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+2mλj=1nθj2

请注意,这看起来像非正则Logistic回归的成本函数,除了末尾有一个正则化项。 我们现在将使用牛顿方法最小化这个函数。

回想一下牛顿更新规则是:
θ ( t + 1 ) = θ ( t ) − H − 1 ∇ θ J \theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_\theta{J} θ(t+1)=θ(t)H1θJ

这是与练习4中用于非正则Logistic回归的相同规则。 但由于您现在正在实现正则化,梯度∇θ(J)和HessianH有不同的形式:

∇ θ 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}=\begin{bmatrix}\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_1^{(i)}+\frac{\lambda}{m}\theta_1\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_2^{(i)}+\frac{\lambda}{m}\theta_2\\·\\·\\·\\\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_n^{(i)}+\frac{\lambda}{m}\theta_n\end{bmatrix} θJ=m1i=1m(hθ(x(i))y(i))x0(i)m1i=1m(hθ(x(i))y(i))x1(i)+mλθ1m1i=1m(hθ(x(i))y(i))x2(i)+mλθ2m1i=1m(hθ(x(i))y(i))xn(i)+mλθn

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}[\sum_{i=1}^mh_\theta(x^{(i)})(1-h_\theta(x^{(i)}))x^{(i)}(x^{(i)})^T+\frac{\lambda}{m}\begin{bmatrix}0\\~&1\\~&~&·\\~&~&~&·\\~&~&~&~&·\\~&~&~&~&~&1\end{bmatrix}] H=m1[i=1mhθ(x(i))(1hθ(x(i)))x(i)(x(i))T+mλ0     1          1]

请注意,如果您将λ=0替换为这些表达式,您将看到与非正则Logistic回归相同的公式。 另外,记住在这些公式中,
figure

这5点就用不着翻译了吧,挺好懂的了。

现在使用下面的lambda的三个值在这个数据集上运行牛顿方法:
a.λ=0(这与非正则化线性回归是同一种情况)
b.λ=1
c. λ=10
为了确定牛顿方法是否收敛,它可能有助于打印出J(θ)在每次迭代中的值。
在牛顿法中,J(θ)不应在任何一点上下降。 如果是,请检查您是否正确定义了J(θ)。 还要检查梯度和Hessian的定义,以确保正则化部分没有错误。
收敛后,使用θ的值在分类问题中找到决策边界。 判定边界定义为所在线
P ( y = 1 ∣ x ; θ ) = 0.5     ⇒     θ T x = 0 P(y=1|x;\theta)=0.5~~~\Rightarrow~~~\theta^Tx=0 P(y=1x;θ)=0.5      θTx=0

在线性回归中,绘制决策边界比绘制最佳拟合曲线更困难。 您将需要绘制 θ T x = 0 θ^Tx=0 θTx=0线隐式,通过绘制等高线。 这可以通过在表示原始u和v输入的一个点网格上评估 θ T x θ^Tx θTx来实现,然后绘制 θ T x = 0 θ^Tx=0 θTx=0的曲线。
下面给出了Matlab/Octave的绘图实现。 要获得最佳的查看结果,请使用与这里相同的绘图范围。

figure
当你完成时,you的λ的三个值的绘图应该类似于下面的绘图
f1
f2
f3

结论分析与体会:

Regularized Linear Regression:

1.通过这个图形,关于正则化参数λ对模型的影响你能得出什么结论?
f
结论:
1.由图片可以看出,当λ=0时,训练集上曲线很好地拟合了每个样本点,灵活度较高。但是在测试集上,就出现了过拟合的现象。
2.当λ=10的时候,训练集上的曲线未能很好地拟合样本点,这又造成了欠拟合现象。
故如果λ过小,会出现过拟合,如果λ过大,会出现欠拟合,所以应该通过训练,比较错误率,选择最优的λ

Regularized Logistic Regression:

最后,由于θ有28个元素,所以我们不会在结果逐个元素地作比较。而是使用norm(theta)计算θ的L2范数,并将其与解中的范数进行检查。λ的值如何影响结果?
结论:
由下面的实验结果可知,当迭代次数足够,损失函数区域稳定后,λ的值会影响损失值,当λ越小,稳定后的损失值就越小,当λ越大,稳定后的损失值就越大。对应的J(θ)值分析如下:
f
f
f
对应的J值:
J = 0.693147     J = 0.349069     J = 0.304406     J = 0.286945     J = 0.265515     J = 0.249631 J = 0.240259     J = 0.228778     J = 0.207278     J = 0.201609     J = 0.200301     J = 0.199871 J = 0.199838     J = 0.199837     J = 0.199837     J = 0.693147     J = 0.529750     J = 0.524692 J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633 J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633     J = 0.524633 J = 0.693147     J = 0.647602     J = 0.647584     J = 0.647584     J = 0.647584     J = 0.647584 J = 0.647584     J = 0.647584     J = 0.647584     J = 0.647584     J = 0.647584     J = 0.647584 J = 0.647584     J = 0.647584     J = 0.647584 J=0.693147~~~J=0.349069~~~J=0.304406~~~J=0.286945~~~J=0.265515~~~J=0.249631\\J=0.240259~~~J=0.228778~~~J=0.207278~~~J=0.201609~~~J=0.200301~~~J=0.199871\\J=0.199838~~~J=0.199837~~~J=0.199837~~~J=0.693147~~~J=0.529750~~~J=0.524692\\J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633\\J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633~~~J=0.524633\\J=0.693147~~~J=0.647602~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584\\J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584~~~J=0.647584\\J=0.647584~~~J=0.647584~~~J=0.647584 J=0.693147   J=0.349069   J=0.304406   J=0.286945   J=0.265515   J=0.249631J=0.240259   J=0.228778   J=0.207278   J=0.201609   J=0.200301   J=0.199871J=0.199838   J=0.199837   J=0.199837   J=0.693147   J=0.529750   J=0.524692J=0.524633   J=0.524633   J=0.524633   J=0.524633   J=0.524633   J=0.524633J=0.524633   J=0.524633   J=0.524633   J=0.524633   J=0.524633   J=0.524633J=0.693147   J=0.647602   J=0.647584   J=0.647584   J=0.647584   J=0.647584J=0.647584   J=0.647584   J=0.647584   J=0.647584   J=0.647584   J=0.647584J=0.647584   J=0.647584   J=0.647584

体会:

本次实验的重点就在于实现线性分类和非线性的逻辑回归分类任务。在训练集上训练出的结果与测试集上的结果不一定全部很好地符合。训练集上如果模型灵活度过高,那么很有可能在测试集上出现过拟合的现象。如果训练集上拟合效果特别差,那么在测试集上也可能会出现欠拟合现象,因此,通过本实验,我们要找到一个最优解,但是通常情况下一般是在取某个范围内的λ值,从而得到结果。

Codes

map_feature.m

function out = map_feature(feat1, feat2)
% MAP_FEATURE    Feature mapping function for Exercise 4
%
%   map_feature(feat1, feat2) maps the two input features
%   to higher-order features as defined in Exercise 4.
%
%   Returns a new feature array with more features
%
%   Inputs feat1, feat2 must be the same size
%
% Note: this function is only valid for Ex 4, since the degree is
% hard-coded in.
    degree = 6;
    out = ones(size(feat1(:,1)));
    for i = 1:degree
        for j = 0:i
            out(:, end+1) = (feat1.^(i-j)).*(feat2.^j);
        end
    end

Regularized Linear Regression

%加载数据
x = load('ex5Linx.dat');
y = load('ex5Liny.dat');
figure
%显示原始数据
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r')
title('Training data');
xlabel('x');
ylabel('y');
%将特征值变成训练样本矩阵
x_1 = [ones(length(x),1) x x.^2 x.^3 x.^4 x.^5];  
[m n] = size(x_1);
n = n -1;
figure
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
title('Training data');
xlabel('x');
ylabel('y');
%计算参数sidta,并且绘制出拟合曲线
rm = diag([0;ones(n,1)]);%lamda后面的矩阵
lamda = [0 1 10]';
colortype = {'g','b','r'};
sida = zeros(n+1,3); %初始化参数sida
xrange = linspace(min(x_1(:,2)),max(x_1(:,2)))';
hold on;
for i = 1:3
    sida(:,i) = inv(x_1'*x_1+lamda(i).*rm)*x_1'*y;%计算参数sida
    norm_sida = norm(sida) % norm 求sida的2阶范数
    yrange = [ones(size(xrange)) xrange xrange.^2 xrange.^3,...
        xrange.^4 xrange.^5]*sida(:,i);
    plot(xrange',yrange,char(colortype(i)))
    hold on
end
legend('traning data', '\lambda=0', '\lambda=1','\lambda=10')
hold off
figure
hold on
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
title('Training data');
xlabel('x');
ylabel('y');
 
x_1 = [ ones(length(y),1), x , x.^ 2 , x .^ 3 , x .^ 4 , x .^ 5] %the second lamda
lamda = 10;
metri  = eye(6);
metri(1,1) = 0;
%扩维
theta =(inv(x_1'*x_1 + lamda*metri))*x_1'*y;
disp('theta')
disp(theta)
x_1 = -1:0.01:1;
x_1 = x_1';
m  = length(x_1);
X = [ ones(m,1), x_1 , x_1.^ 2 , x_1 .^ 3 , x_1 .^ 4 , x_1 .^ 5];
plot(x_1,X*theta, '--b','Linewidth',2);

Regularized Logistic Regression

clc,clear
x=load('ex5Logx.dat'); 
y=load('ex5Logy.dat');
figure
% Find the indices for the 2 classes
pos = find(y); 
neg = find(y == 0);
plot(x(pos ,1),x(pos , 2 ),'+','MarkerSize',8)
hold on
plot(x(neg ,1),x(neg ,2),'o','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8)
title('Training data');
xlabel('u');
ylabel('v');
legend('y=1','y=0')
hold off
figure
xx=x;
x = map_feature(x(:,1),x(:,2));
[m, n] = size(x);
lambda = [0;1;10];
L = eye(n,n);
L(1,1) = 0;
g=@(z) 1.0 ./ (1+exp(-z)); 
for k=1:length(lambda)
    theta = zeros(n,1);
    for i = 1:15
       %Calculate the hypothesis function
       z = x*theta;
       h = g(z);
       %Calculate the cost function
       J = -(1/m)*sum(y.*log(h)+(1-y).*log(1-h))+(lambda(k,1)/(2*m))*sum(theta(2:end).^2);
       %Calculate Hession matrix
       H = (1/m).*x'*diag(h)*diag(1-h)*x + (lambda(k,1)/m)*L;
       %Calculate gradient
       G = (lambda(k,1)/m).*theta; 
       G(1,1) = 0;
       J_delta = (1/m).*x'*(h-y) + G;
       %Update the value of theta
       theta = theta - H^(-1)*J_delta;
       store(i,k)=J;
       fprintf('J=%f\n',J);
    end
    % 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
    b = zeros(length(u),length(v));
    % Evaluate z = theta*x over the grid
    for i = 1:length(u)
        for j = 1:length(v)
            b(i,j) = map_feature(u(i), v(j))*theta;
        end
    end
    plot ( xx ( pos , 1 ) , xx ( pos , 2 ) , '+','MarkerSize',8 );
    hold on;
    plot ( xx ( neg , 1 ) , xx ( neg , 2 ) , ' o ','MarkerEdgeColor','y','MarkerFaceColor','y','MarkerSize',8 );
    b = b';
    contour(u, v, b, [0, 0], 'LineWidth', 2);
    legend('y = 1', 'y = 0', 'Decision boundary');
    xlabel('x')
    ylabel('y')
    title(sprintf('\\lambda = %g', lambda(k,1)), 'FontSize', 10);
    figure;
end
 for i=1:length(lambda)
     plot(1:15,store(:,i),'o--','MarkerFaceColor', 'r');
     title(sprintf('\\lambda = %g', lambda(i,1)), 'FontSize', 10);
     legend('J(\theta)');
     if i == length(lambda)
         break;
     end
     figure;
 end
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值