首页 > 代码库 > 线性回归之实践
线性回归之实践
对于数据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的值。
线性回归之实践