首页 > 代码库 > 线性回归之实践

线性回归之实践

对于数据ex2Data.zip,学习出一个函数h(x),使之能较好地预测出y的值。

其中x表示孩子的年龄,y表示孩子的身高。

首先画出原始数据在坐标轴中的分布情况:

x = load(‘ex2x.dat‘); y = load(‘ex2y.dat‘);

m = length(y); %计算出训练样本的个数

% 绘出训练集
figure; % 打开一个新的绘图窗口
plot(x, y, ‘o‘);
ylabel(‘Height in meters‘)
xlabel(‘Age in years‘)

下面采用梯度下降进行线性回归:

% 梯度下降
x = [ones(m, 1) x]; % 这里添加一列是因为要学习的参数中有一个参数是h(x)中的常数项
theta = zeros(size(x(1,:)))‘; % 初始化参数
MAX_ITR = 1500; % 迭代次数
alpha = 0.07; % 学习率

for num_iterations = 1:MAX_ITR


% 梯度值
grad = (1/m).* x‘ * ((x * theta) - y);

% 根据梯度更新参数
theta = theta - alpha .* grad;
end
% 在命令窗口显示学习出的参数
theta

% 绘制出线性拟合
hold on;
plot(x(:,2), x*theta, ‘-‘)
legend(‘Training data‘, ‘Linear regression‘);
hold off ;

学习出的参数为:

theta =

0.7502
0.0639

可以看出,所有样本点都大致分布在拟合出的直线附近。

下面计算损失函数随着参数变化而变化的情况

% 参数变化范围
theta0_vals = linspace(-3, 3, 100);
theta1_vals = linspace(-1, 1, 100);

% 初始化损失函数
J_vals = 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_vals(i,j) = (0.5/m) .* (x * t - y)‘ * (x * t - y);
end
end

J_vals = J_vals‘;
% Surface plot
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel(‘\theta_0‘); ylabel(‘\theta_1‘);

可以看出我们拟合出的参数

theta =

0.7502
0.0639

基本上对应的损失函数最小的点。

为了看得更加明显,可继续绘制出损失函数的等高线

figure;
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15))
xlabel(‘\theta_0‘); ylabel(‘\theta_1‘);

同样可以看出大致的损失函数最低点对应的参数theta,与我们拟合出的参数基本一致。

总结:

由此我们可以总结出线性回归,就是要学习出一个函数h(x) =θ(0) + θ(1)x(1)(2)x(2)+...+θ(m)x(m)

对于上述训练集,这里h(x)就是y,我们的目的就是学习出参数θ(i)

使得我们再给定x的时候我们能通过上述函数较为准确的得出y的值。

 

线性回归之实践