机器学习(一)——Linear Regression
机器学习课程中做的一些实验题目,拿来和大家分享一下。
实验步骤与内容:
-
加载数据集并绘制散点图
MATLAB中加载数据集的方法是“load”函数,绘制散点图的方法是“plot”函数,并且还可以使用“label”函数来为坐标轴做标注。
得出结果如图: -
在梯度下降之前,要使用x = [ones(m, 1) x]语句来给数据集x加上一列,训练数据中的年龄值实际上位于x的第二列。
此时的线性回归模型为
使用实验文件中给出的学习率,来初始化参数theta=0(i.e.,θ0=θ1=0),并从该初始起点开始一次梯度下降迭代。 记录第一次迭代后得到的 theta0和theta1的值。
在程序中体现为:theta = zeros(size(x(1,:)))’; -
线性回归模型为
梯度下降算法的更新规则为
而这两个函数在程序中,可以将更新规则中的h(x)替换为theta*x
然后循环1500次,得到一元线性回归方程,结果为
三岁半的孩子身高约0.9737米,七岁的孩子身高约为1.1973米
4. 对J(θ)的理解
可视化参数θ来帮助理解梯度下降函数,绘制出J(θ)的3D表面图。
代码自取:
clear all; close all; clc
x = load('ex1x.dat'); y = load('ex1y.dat');
m = length(y);
figure;
plot(x, y, 'o');
ylabel('Height in meters')
xlabel('Age in years')
% Gradient descent
x = [ones(m, 1) x];
theta = zeros(size(x(1,:)))';
MAX_ITR = 1500;
alpha = 0.07;
for num_iterations = 1:MAX_ITR
% Here is the gradient
grad = (1/m).* x' * ((x * theta) - y);
% Here is the actual update
theta = theta - alpha .* grad;
end
theta;
hold on;
plot(x(:,2), x*theta, 'r-');
legend('Training data', 'Linear regression')
hold off
exact_theta = (x' * x)\x' * y
% Predict values for age 3.5 and 7
predict1 = [1, 3.5] *theta
predict2 = [1, 7] * theta
theta0_vals = linspace(-3, 3, 100);
theta1_vals = linspace(-1, 1, 100);
% initialize J_vals to a matrix of 0's
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';
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1');
figure;
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15))
xlabel('\theta_0'); ylabel('\theta_1');