作业文件:

machine-learning-ex5

1. 正则化线性回归

在本次练习的前半部分,我们将会正则化的线性回归模型来利用水库中水位的变化预测流出大坝的水量,后半部分我们对调试的学习算法进行了诊断,并检查了偏差和方差的影响。

1.1 可视化数据集

x表示水位变化,y表示水流量。整个数据集分成三个部分

  • 模型的训练集,用来从X,y中学习参数。
  • 交叉验证集,从Xval, yval中决定正则化参数
  • 测试集,用来预测的样本,从数据集为 Xtest, ytest。

绘制的图像如图1

1.2 正则化线性回归的代价函数。

代价函数如下:

lambda是正则化参数。注意我们不应该正则化theta0,因为其代表偏置值。

在linearRegCostFunction.m文件中完成代码。对于theta初始化为[1;1].我们的输出值应该为303.993

linearRegCostFunction.m内代码:

J = 1/2/m*sum((X*theta-y).^2)+lambda/2/m*sum(theta(2:end).^2);

1.3 正则化线性回归梯度

正则化的梯度表示为:

在 linearRegCostFunction.m中添加计算梯度的代码,对于theta初始化为[1;1],我们应该看到结果

梯度值为[-15.30; 598.250]

linearRegCostFunction.m文件中代码:

J = 1/2/m*sum((X*theta-y).^2)+lambda/2/m*sum(theta(2:end).^2);
grad = 1/m*(X'*(X*theta-y));
grad(2:end) = grad(2:end)+lambda/m*theta(2:end);

1.4 拟合线性回归

我们将使用 fmincg优化器来求解参数值。将lambda的值设置为0,因为只有两个参数,不会有过度拟合情况。增大lambda的值只会惩罚theta的值。用求解的参数值绘图如图2所示。

如图所示可视化最佳拟合是一种可能的方式调试学习算法。但是可视化数据和模型通常不是容易的。下面部分我们将实现一个函数来产生学习曲线,来帮助我们调试我们的学习算法,即使我们的数据不容易可视化。

2. 偏差和方差

在机器学习中一个重要的概念是方差偏差的权衡。有高偏差的模型一般比较简单不够拟合数据。有高方差的数据一般会过度拟合训练集。在这一节我们将会在学习曲线上绘制训练与测试误差来诊断偏差和方差问题。

2.1 学习曲线

现在我们将实现代码绘制学习曲线,来帮助我们调试学习算法。我们的任务是完learningCurve.m 文件中的代码,可以返回下训练集和交叉验证集的误差向量。

绘制学习曲线我们需要获得不同大小训练集的训练误差与交叉验证误差。获得不同大小的训练集我们可以使用X(1:i,:),y(1:i),i表示训练集的大小。将这些数据给前面实现的trainLinearReg函数来获得参数theta的值。在通过theta来获得训练误差与交叉验证误差。训练误差定义为

注意:训练误差是不包括正则化项的,我们可以将lambda的值设置为 0.对于训练集误差我们应该使用不同大小的训练集。对于交叉验证误差,我们应该使用所有的交叉验证数据集。

learningCurve.m 文件中代码:

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,0);
end

运行代码执行结果如图3所示

3 多项式回归

我们线性回归模型的一个问题是,模型对于数据二维太简单了,不能够好的拟合数据(有高偏差)。在这一部分练习,我们将通过添加更多特征来解决这个问题。对于多项式回归我们的假设函数是这个形式:

对于此的多项式回归。我们得到一个线性回归模型,其中特征是原始值的各种幂

现在我们将使用对数据集已经存在的特征x使用更高次幂来获得更多特种。我们的任务是完成polyFeatures.m的代码,通过这个函数映射m*1的原始数据矩阵X成为m*p的的数据矩阵。如第1列是原始数据的1次幂,第2列是原始数据的2次幂。

polyFeatures.m文件中代码

 X_poly(:,i) = X.^i;

3.1学习多项式回归

我们使用前面完成的线性回归模型来学习多项式回归参数。

在这节练习我们将使用8阶多项式,如果直接使用结果将很差,因为如果x=40那x8次幂的特征是就是40的8次幂。因此我们需要先进行特征规范化。作业已经帮我们实现了。运行作业中的代码结果如图4图5所示

通过图4我们可以看到,多项式已经很好的拟合数据点,获得了很小的训练误差。但是此多项式太复杂了在甚至极端情况下水流量下降了。因此此多项式回归模型过度拟合训练集,因此不能很好的泛化。

3.2 可选练习:调整正则化参数

这一节我们可以观察正则化参数的影响。可以设定lambda的值为1或者100.

结果如图6图7所示

通过图7我们可以看到lambda =1 训练误差与交叉验证误差都处于一个低值。因此没有高偏差和高方差问题。对与lambda = 100如图8所示,可以看到不能很好拟合数据。

3.3 使用交叉训练集选择lambda的值

从之前练习我们可以看到lambda的值会对多项式回归模型有显著影响。

在这一节我们会实现自动选择labmbda的值的函数。具体来说,通过交叉验证集来测试那个lambda的值是最合适的。我们可以通过测试机来评估我们的模型对未知的数据的表现如何。我们的任务是完成validationCurve.m文件的代码。我们应该使用trainLinearReg函数,来使用不同的lambda的值训练模型。我们将测试的lambda的值是:{0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10}.

在完成代码后我们应该会看到如图9所示的图像。

validationCurve.m文件代码:

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

3.4 可选练习:计算测试集误差

之前我们已经计算交叉验证集误差与训练集误差,为了更好的了解模型的表现,使用测试集评估最终的模型是非常有必要的。

我们已经获得当lambda = 3时测试集误差为3.8599

theta = trainLinearReg(X_poly, y, 3);
linearRegCostFunction(X_poly_test, ytest,theta,0)

Andrew Ng机器学习编程作业:Regularized Linear Regression and Bias/Variance的更多相关文章

  1. Andrew Ng机器学习 五:Regularized Linear Regression and Bias v.s. Variance

    背景:实现一个线性回归模型,根据这个模型去预测一个水库的水位变化而流出的水量. 加载数据集ex5.data1后,数据集分为三部分: 1,训练集(training set)X与y: 2,交叉验证集(cr ...

  2. 第五次编程作业-Regularized Linear Regression and Bias v.s. Variance

    1.正规化的线性回归 (1)代价函数 (2)梯度 linearRegCostFunction.m function [J, grad] = linearRegCostFunction(X, y, th ...

  3. Andrew NG 机器学习编程作业5 Octave

    问题描述:根据水库中蓄水标线(water level) 使用正则化的线性回归模型预 水流量(water flowing out of dam),然后 debug 学习算法 以及 讨论偏差和方差对 该线 ...

  4. 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 4—反向传播神经网络

    课程笔记 Coursera—Andrew Ng机器学习—课程笔记 Lecture 9_Neural Networks learning 作业说明 Exercise 4,Week 5,实现反向传播 ba ...

  5. Andrew Ng机器学习编程作业: Linear Regression

    编程作业有两个文件 1.machine-learning-live-scripts(此为脚本文件方便作业) 2.machine-learning-ex1(此为作业文件) 将这两个文件解压拖入matla ...

  6. Andrew Ng机器学习编程作业:Logistic Regression

    编程作业文件: machine-learning-ex2 1. Logistic Regression (逻辑回归) 有之前学生的数据,建立逻辑回归模型预测,根据两次考试结果预测一个学生是否有资格被大 ...

  7. Andrew NG 机器学习编程作业3 Octave

    问题描述:使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 一.逻辑回归实现: 数据加载到octave中,如下图所示: ...

  8. Andrew NG 机器学习编程作业2 Octave

    问题描述:用逻辑回归根据学生的考试成绩来判断该学生是否可以入学 这里的训练数据(training instance)是学生的两次考试成绩,以及TA是否能够入学的决定(y=0表示成绩不合格,不予录取:y ...

  9. 【原】Coursera—Andrew Ng机器学习—Week 1 习题—Linear Regression with One Variable 单变量线性回归

    Question 1 Consider the problem of predicting how well a student does in her second year of college/ ...

随机推荐

  1. 架设HmailServer邮件服务器以及webmail

    参考:http://www.it0355.com/a/201207/31/a9275.htm 在安裝Hmailserver前先安裝Apache.php.mysql,如果你想懶點直接到http://ww ...

  2. Oracle之比较NVARCHAR2字符串

    一.引言 昨天遇到一个问题,一直想不通是为什么,我在pl/sql里面执行sql语句,选出字段值等于某个值的的行: '; 用select * from test;是可以查到该值的,但是用这条语句却没有结 ...

  3. 解决:std::ostream operator<< should have been declared inside 'xxx'

    用VS的NMAKE构建,不会报错,但是用GNU MAKE构建,就会报错.(尝试删除Toast.h中第24行的声明) 因此在遇到类似的情况的时候,记得不仅class里面要有friend声明,namesp ...

  4. Log4j1.x初识

    初识log4j1.x 研究源码首先要对项目要有整体的认识,这一章节主要让大家对log4j1.x有一个整体的认识,并以此为切入点,认识log4j1.x的真个框架 1 整体认识 先整体上对log4j1有一 ...

  5. .NET 4.0中的缓存功能

    # .NET 4.0中的缓存功能 .Net 4.0中有3种,System.Runtime.Caching,System.Web.Caching.Cache,Output.Cache.下面分别对这三者进 ...

  6. apache ab测试

    网站并发测试,网站服务使用的是apache2.4 因此使用ab来测试网站性能. windows使用cms 打开apache/bin 运行ab.exe (......../apache/bin/ab), ...

  7. The Definitive Guide To Django 2 学习笔记(六) 第四章 模板 (二)使用模板系统

    模板系统不是django特有的,它是python的一个库,你可以在任何地方使用它. 使用方法: 1.使用 Template()方法创建Template对象.2.调用Template对象的render( ...

  8. java文件对话框操作

        完毕文件打开与保存   FileDialog : FileDialog fd = new FileDialog(this); fd.setVisible(true);//或fd.show(); ...

  9. 在linux下安装配置rabbitMQ详细教程

    在linux下安装配置rabbitMQ详细教程 2017年12月20日 17:34:47 阅读数:7539 安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. Er ...

  10. 【vijos】1629 八(容斥原理+dfs)

    https://vijos.org/p/1629 本来是想出来了的,,,,但是有个地方写挫了一直没发现,sad 就是dfs的时候我传的pos传错了QAQ 这题用容斥很好想 首先在区间[l, r]能被a ...