吴恩达机器学习---编程练习5

博主只是初学机器学习的新人一枚,这篇博客旨在分享一下吴恩达机器学习课程编程练习5的答案,同时也是相当于自己对这一章的内容做一个回顾,让自己理解的更加的透彻,理性讨论,不喜勿喷

本章的主题是Regularized Linear Regression and Bias v.s. Variance,也就是正则化线性回归和偏差/方差,本章主要讨论的问题就是在线性回归问题中,由于选择的模型不同,对于不同的训练集可能会出现欠拟合以及过拟合问题的出现,针对这类问题,采用正则化的方法来解决以期得到一个能对数据集进行较好拟合和预测的模型。
根据指导文档,我们可以把整个作业分成许多个小作业来完成:

  1. 代价函数/梯度以及最佳θ求解
    该部分主要内容是编写代价函数以及梯度的求解,以及最后的根据代价函数和梯度来求解使代价函数取值最小的θ值,和前面的内容一致,代价函数公式如下
    在这里插入图片描述
    梯度公式如下
    在这里插入图片描述
    注意此处的j=0时,相应的求导操作时不需要进行正则化操作的,对这一个问题我的处理方法是令theta(1) = 0,代码片段如下

    %This is linear regression, not logistic, so don't need sigmoid function
    hypothesis = X * theta;
    
    theta(1) = 0;
    J = sum((hypothesis - y).^2) / (2*m) + (lambda/(2*m)) * sum(theta.^2);
    grad = ((hypothesis - y)'*X)' / m + (lambda/m) * theta;
    

    其中:J为代价函数,grad为梯度值
    随后使用matlab自带的fmincg函数求取使J(θ)值最小的θ值,具体的代码段在trainLinearReg.m中

  2. 学习曲线
    本部分的问题就涉及到了我们的主题—偏差和方差问题,对于一个模型来说,如果具有高的偏差,可能意味着模型过于简单,不能很号的去拟合数据集;同样的,如果模型具有高方差则以为这模型对数据集存在过度拟合现象的存在,因此应该选择一个合适的模型。学习曲线有助于我们对当前的模型进行判断其是否适合于我们的数据集。
    学习曲线主要是画出在取不同的样本时交叉验证的偏差值以及训练的偏差值,通过曲线的走向来判断当前的模型是否存在高偏差/高方差问题,进而帮助我们去决定下一步的走向。其中,训练误差和交叉验证误差的公式如下
    在这里插入图片描述
    其中:Xcv和ycv分别交叉验证数据集的数据,要注意的是,在求解训练误差时,我们想要求解的是针对当前模型对某一部分数据集的误差值,而在求解交叉验证误差时,我们想要求解的是针对整个交叉验证数据集的误差值,因此在使用前面的误差函数时传入的值时不同的,具体代码如下

    for i = 1:m
        theta = trainLinearReg(X(1:i,:),y(1:i),lambda);
        [error_train(i),~] = linearRegCostFunction(X(1:i,:),y(1:i),theta,0);
        [error_val(i),~] = linearRegCostFunction(Xval,yval,theta,lambda);
    end
    

    学习曲线如下图所示
    在这里插入图片描述
    通过该学习曲线,我们可以看到,随着训练样本数的增加,交叉验证的错误值和训练错误值都很高,这表示我们选择的线性回归模型过于简单,特征值太少,并不能很好的拟合数据,也就是模型中存在高偏差问题。因此,我们应该为模型选择更多的特征值(即θ)来增强模型对数据集的拟合程度。

  3. 多项式回归
    通过前面的讨论,我们已经知道了现在模型存在的问题是特征值过少,模型过于的简单,事实上也正是这样,我们之前选用的模型中预测函数是
    hθ(x) = θ0 + θ1x
    实际上这是一条直线,显然不能对我们的数据进行一个较好的拟合,因此我们需要选取更多的特征值,同时对训练数据集进行扩充,假设我们选取的特征值个数为p,则此时的预测函数是
    hθ(x) = θ0 + θ1x + θ2x2 + θ3x3 + … + + θpxp
    通过这种方法,我们得到了一个更加复杂的模型,但是,随之而来的就是另一个问题—高方差问题,事实上,我们对拟合曲线进行绘制也可以发现这个问题,如下
    在这里插入图片描述
    从图中我们可以发现,虽然这个模型对数据集具有很好的拟合性,具有很低的训练误差,但是曲线过去复杂,而且在末端出现随着x增大y减小的情况,这显示是不符合实际情况的,也就是说现在的模型虽然对已有的数据集具有很好的拟合性,但是并不具有良好的预测性,也就是出现了高方差的问题,利用交叉验证误差曲线也可以看出来,如下
    在这里插入图片描述
    我们可以看到,随着训练样本数的增加,交叉验证偏差值依旧处于一个较高的值,甚至于在图像的末端出现随着训练样本数的增加交叉验证误差值增大的情况,为了解决高方差问题,一种典型的解决办法就是正规化方法。
    本部分扩充数据集代码如下

    [m,~] = size(X);
    for i = 1:m
        for j = 1:p
            X_poly(i,j) = X(i).^j;
        end
    end
    
  4. 正规化
    正规化的关键点在于选取合适的lambda值,通常来说,我们会默认选取lambda为0,也就是没有正规化,但是也不绝对,为了选取合适的lambda值,我们创建一个向量

    lambda_vec = [0 0.001 0.003 0.01 0.03 0.1 0.3 1 3 10]';
    

    然后,通过循环取值,计算当lambda取不同值时,训练误差和交叉验证误差值的情况,相应的代码和图片如下

    for i = 1:length(lambda_vec)
        lambda = lambda_vec(i);
        theta = trainLinearReg(X,y,lambda);
        [error_train(i),~] = linearRegCostFunction(X,y,theta,lambda);
        [error_val(i),~] = linearRegCostFunction(Xval,yval,theta,lambda);
    end
    

    在这里插入图片描述
    从图中我们可以看出,交叉验证误差值在lambda取值为3时具有最小值,因此可知,最合适的正规化lambda取值为3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值