线性回归
首先线性回归模型是
其中θ是我们需要优化的参数,x是n+1维的特征向量,注意实际数据x是n维的,即x=[x1,x2,…,xn],但在回归模型中我们有θ0x0,于是为x添加x0项,且x0始终为1。
给定一个训练集(xi,yi),其中i=1…m ,我们希望的是获取一个最优的θ值,使得误差函数J(θ)最小。其中J(θ)为
优化θ的方法之一是梯度下降法,下面给出梯度下降法的迭代规则
其中α是所谓的“学习率”,也被称为步长,它可以调整梯度下降的快慢,同时影响最后结果的精确度。
二维线性回归实验
实验内容
有一个年龄和身高关系的例子,其中数据y是以米为单位测量的身高高度,x值是对应于该身高的男孩的年龄,(xi,yi)组成了一个m=50的训练集,即有50组数据。实验问题有
- 使用α= 0.07的学习率实现梯度下降。初始化θ= 0(即θ0 =θ1 = 0 ),从这个初始起点运行一次梯度迭代算法。记录你在第一次迭代后得到的θ0和θ1的值。
- 继续运行梯度下降进行更多迭代,直到θ收敛。(总共需要大约1500次迭代)。收敛后,记录得到θ0和θ1的最终值,并根据θ在同一个数据图上绘制来自你的算法数据的直线。
- 用所获得的模型预测两个3.5岁和7岁男孩的身高。
Mathlab中的预备工作
- 在Mathlab中,可以使用命令加载训练集。其中load()函数的参数为文件保存地址。
x = load('E:\machine_learning\experiment\exp1\data1\ex1_1x.dat');
y = load('E:\machine_learning\experiment\exp1\data1\ex1_1y.dat');
- 然后将数据绘制到坐标图中
figure %open a new figure window
plot(x, y, 'o');
ylabel('Height in meters');
xlabel('Age in years'); %print picture
绘制结果为
3. 绘制直线图
%print liner graph
hold on;
plot(x(:,2), x*theta, '-')
legend('Training data', 'Linear regression')
hold off;
绘制结果为
进行实验
- 为每一个数据xi添加xi0=1。
m = length(y); %sotre the number of training data
x = [ones(m, 1), x];%ones() make all one matrix, add "1" in the front of x.
- 初始化学习率、最大迭代次数和θ。
long = 0.07;%步长//学习率
maxc = 1500;%最大迭代次数
theta = zeros(size(x(1,:)))';
- 进行梯度下降迭代运算,注意矩阵乘法运算次序。
for i = 1:maxc
f = (1/m).* x' * ((x * theta) - y);
theta = theta - long .* f;
end
- 输出最后所得的θ并绘图。
theta %输出theta
%print liner graph
hold on;
plot(x(:,2), x*theta, '-')
legend('Training data', 'Linear regression')
hold off;
所得的θ为
绘制的图为
- 预测两个3.5岁和7岁男孩的身高,即直接将x=[1, 3.5]和x=[1, 7]分别代入所得的hθ(x)。
%预测 3.5 ; 7
theta
height1 = [1, 3.5] * theta;
height2 = [1, 7] * theta;
%输出各自身高
height1
height2
所得结果为
理解J(θ)
我们想更好地理解梯度下降做了什么,并可视化参数θ∈R2和J (θ)之间的关系。在这个问题上,我们将将J (θ)绘制为3D曲面图。(当应用学习算法时,我们不会通常尝试绘制J (θ),因为通常θ∈Rn是非常高维的,所以我们没有任何简单的方法来绘制或可视化J (θ)。但是因为这个例子这里使用非常低的维度θ∈R2,我们将绘制J (θ)以获得更多的直觉关于线性回归。)
代码:
J_vals = zeros(100, 100);
theta0_vals = linspace(-3, 3, 100);
theta1_vals = linspace(-1, 1, 100);
for i = 1:length(theta0_vals)
for j = 1:length(theta1_vals)
t = [theta0_vals(i); theta1_vals(j)];
J_vals(i,j) = (1/(2*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');
显示结果:
多元线性回归
实验内容
训练数据为俄勒冈州波特兰市的房子的房价,其中输出y是价格,输入x是生活区卧室的数量。有m = 47个训练实例。
通过输入x (i)的值,我们注意到生活区大约是卧室数量的1000倍。这种差异意味着预处理输入将显著提高梯度下降的效率。
在你的程序中,通过标准偏差缩放两种类型的输入,并将其平均值设置为零。 在mathlab中的实现为:
sigma = std(x);
mu = mean(x);
x(: ,2) = (x(: , 2) - mu(2))./ sigma(2);
x(: ,3) = (x(: , 3) - mu(3))./ sigma(3);
- 使用J (θ)选择学习率
目的是挑选一个好的范围内的学习率。其中0.001<= α<=10。可以通过进行初始选择、运行梯度下降和观察成本函数,来相应地调整学习率。
在上一次练习中,你在θ0和θ1的网格上计算J (θ)值,现在将使用当前梯度阶段的θ计算J (θ)下降。经过多次阶段后,你会看到J (θ)是如何变化的迭代进行。
在开始练习的时候,运行梯度下降大约50次迭代。在每次迭代中,计算J (θ),并将结果存储在向量J中在最后一次迭代中,将J值与迭代次数相比较。设置不同的学习率α,得到不同的结果,然后绘制J (θ)与迭代次数的曲线图。 - 问题
(1)观察成本函数随着学习率的变化而变化变化。当学习率太小时会发生什么?太大了?
(2)使用你发现的最佳学习率,运行梯度下降直到收敛,求
a. θ的最终值
b. 拥有1650平方英尺和3间卧室的房子的预计价格。
进行实验
- 加载数据、绘制数据、为数据添加x0、缩放数据
x = load('E:\machine_learning\experiment\exp1\data1\ex1_2x.dat');
y = load('E:\machine_learning\experiment\exp1\data1\ex1_2y.dat');
figure%绘制数据分布图
plot3(x(:,1), x(:,2), y, 'o');
xlabel('Area');ylabel('Number of bedroom');
m = length(y);
x = [ones(m, 1), x];
%缩放数据
sigma = std(x);
mu = mean(x);
x(: ,2) = (x(: , 2) - mu(2))./ sigma(2);
x(: ,3) = (x(: , 3) - mu(3))./ sigma(3);
%print x. -3 < x_area < 3; -3 < x_number < 3
- 设置不同的α,梯度下降求最优θ,观察J(θ)曲线变化情况。
可依次设置alpha=0.01, 0.05, 0.10, 0.15。
%alpha = 0.01, 可依次设置alpha=0.05, 0.10, 0.15
theta = zeros(size(x(1,:)))';
alpha1 = 0.01;
J1 = zeros(50, 1);
for num_iterations = 1:50
J1(num_iterations) = (1/(2*m)).*(x * theta - y)'*(x * theta - y);
f1 = (1/m).* x' *(x*theta - y);
theta = theta - alpha1.*f1;
end
绘制曲线图结果
四条曲线从上到下一次对应的是α=0.01, 0.05, 0.10, 0.15,可知当α=0.10时,梯度下降算法的实现效果最好。
3. 使用α=0.10,求最终θ,并预计1650平方英尺和3间卧室的房子。
θ为:
预计代码:
%predict area = 1650 and the number of bedroom is 3
x = [1, 1650, 3]
%注意缩放数据
x(: ,2) = (x(: , 2) - mu(2))./ sigma(2);
x(: ,3) = (x(: , 3) - mu(3))./ sigma(3);
price = x * theta;
price
预计结果:
代码
代码及数据下载链接:https://download.csdn.net/download/qq_37665301/11275858
总结
线性回归算法是机器学习中最简单的算法之一,需要掌握的有线性回归算法模型,代价函数J(θ),梯度下降算法以及进行梯度下降算法迭达的依据。
第一次写博客,好累啊。