您的位置:首页 > 其它

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

2016-04-15 11:22 405 查看
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)


(二)实现代码

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

[plain] view
plain copy

print?





%=============================================

% 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)进行预测的结果



最终显示的结果与原题中给出的结果基本一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: