【机器学习笔记3】Stanford公开课Exercise 2——Linear Regression

Stanford公开课Exercise 2原题地址:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex2/ex2.html。看Stanford的机器学习公开课真是舒服,视频讲解的非常清楚,练习也布置的非常好,把所有重要内容总结了一遍,给出了很多参考信息,让读者非常清晰的知道怎么去做。下面是我完成的笔记。



(一)原理回顾


简单重复一下实现的过程,具体的看上一篇(【机器学习笔记】Linear Regression总结):

1. h(θ)函数

(公式1)

2. J(θ)函数

(公式2)

向量化后简化为:

(公式3)

3.θ迭代过程

(公式4)

向量化后简化为:

(公式5)



(二)实现代码


原题中给出了详细的步骤和提示,下面的代码是根据原题中的提示实现的,代码中加有注释,这里不再对代码进行解释。

%=============================================
% Exercise 2: Linear Regression
% author : liubing (liubing80386@gmail.com)
%

%LB_c: 加载数据 ===============
x = load("ex2x.dat");
y = load("ex2y.dat");
%LB_c: 矩阵x第一列加上全1
x = [ones(size(x)(1),1), x];
%==============================

%LB_c: 常量数据准备===========================================
iter_total = 1500;	%theta更新的迭代次数
%m为样本数,n为特征数(包含第一列的常数项,实际特征数为n-1)
[m,n] = size(x);	
alpha = 0.07;	
%=============================================================

%LB_c: 迭代过程 ================================================================
theta = zeros(n,1);	%theta初始化为全0,其他值也可以
J = zeros(iter_total,1);	%存储每一步迭代的J(theta)值

for iter_index = [1:iter_total]		
	J(iter_index) = (x*theta-y)' * (x*theta-y) / (2*m);	%求当前的J(theta),参考上面的(公式3)
	err = x * theta - y;
	grad = ( x' * err ) / m;	%求gradient
	theta = theta - alpha * grad;	%梯度下降法更新theta,参考上面的(公式5)		
end	
%===============================================================================

%LB_c: 结果绘制 =============================================
%绘制J(theta)迭代过程
figure;
plot([1:iter_total], J');
xlabel('iteration (times)');
ylabel('J(theta)');
axis([1,1550, 0, 0.6]);

%绘制训练数据
figure;
plot(x(:,2), y, 'o', 'Markersize', 3);
xlabel('Age (years)');
ylabel('Height (meters)');
%绘制回归结果
hold on;
plot(x(:,2), x*theta, 'r-');
legend('Training data', 'Regression result');

%绘制J(theta)曲面
theta0_vals = linspace(-3,3,100);
theta1_vals = linspace(-1,1,100);
J_arr = zeros(length(theta0_vals), length(theta1_vals));
for i = [1:length(theta0_vals)]
	for j = [1:length(theta1_vals)]
		t = [theta0_vals(i); theta1_vals(j)];
		J_arr(i,j) = (x*t-y)' * (x*t-y) / (2*m);	%求J(theta),参考上面的(公式3)
	end
end
J_arr = J_arr';
figure;
surf(theta0_vals, theta1_vals, J_arr);
xlabel('theta0');
ylabel('theta1');
zlabel('J(theta)');
		
%绘制J(theta)等高线图
figure;
contour(theta0_vals, theta1_vals, J_arr, logspace(-2,2,15));
xlabel('theta0');
ylabel('theta1');
%============================================================

%LB_c: theta结果输出与测试 =================
printf('result of theta : ');
theta
printf('result of testing data(age=3.5):');
[1,3.5]*theta
printf('result of testing data(age=7):');
[1,7]*theta
%===========================================


(三)执行结果


1. 训练样本及回归结果(直线)



2.J(θ)函数迭代变化趋势


3.J(θ)函数相对于theta0和theta1的变化趋势(曲面图)



4.J(θ)函数相对于theta0和theta1的变化趋势(等高线图)


5. 最终的回归系数(theta)结果及使用该回归系数对测试数据(age=3.5和age=7)进行预测的结果


最终显示的结果与原题中给出的结果基本一致。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值