机器学习之线性回归

线性回归

首先线性回归模型是线性回归模型
其中θ是我们需要优化的参数,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组数据。实验问题有

  1. 使用α= 0.07的学习率实现梯度下降。初始化θ= 0(即θ01 = 0 ),从这个初始起点运行一次梯度迭代算法。记录你在第一次迭代后得到的θ0和θ1的值。
  2. 继续运行梯度下降进行更多迭代,直到θ收敛。(总共需要大约1500次迭代)。收敛后,记录得到θ0和θ1的最终值,并根据θ在同一个数据图上绘制来自你的算法数据的直线。
  3. 用所获得的模型预测两个3.5岁和7岁男孩的身高。

Mathlab中的预备工作

  1. 在Mathlab中,可以使用命令加载训练集。其中load()函数的参数为文件保存地址。
x = load('E:\machine_learning\experiment\exp1\data1\ex1_1x.dat');
y = load('E:\machine_learning\experiment\exp1\data1\ex1_1y.dat');
  1. 然后将数据绘制到坐标图中
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;

绘制结果为
绘制直线

进行实验

  1. 为每一个数据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.
  1. 初始化学习率、最大迭代次数和θ。
long = 0.07;%步长//学习率
maxc = 1500;%最大迭代次数
theta = zeros(size(x(1,:)))';
  1. 进行梯度下降迭代运算,注意矩阵乘法运算次序。
for i = 1:maxc
    f = (1/m).* x' * ((x * theta) - y);
    theta = theta - long .* f;
end
  1. 输出最后所得的θ并绘图。
theta %输出theta
%print liner graph
hold on;
plot(x(:,2), x*theta, '-')
legend('Training data', 'Linear regression')
hold off;

所得的θ为
theta
绘制的图为
直线图

  1. 预测两个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');

显示结果:
J(theta)

多元线性回归

实验内容

训练数据为俄勒冈州波特兰市的房子的房价,其中输出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);  
  1. 使用J (θ)选择学习率
    目的是挑选一个好的范围内的学习率。其中0.001<= α<=10。可以通过进行初始选择、运行梯度下降和观察成本函数,来相应地调整学习率。
    在上一次练习中,你在θ0和θ1的网格上计算J (θ)值,现在将使用当前梯度阶段的θ计算J (θ)下降。经过多次阶段后,你会看到J (θ)是如何变化的迭代进行。
    在开始练习的时候,运行梯度下降大约50次迭代。在每次迭代中,计算J (θ),并将结果存储在向量J中在最后一次迭代中,将J值与迭代次数相比较。设置不同的学习率α,得到不同的结果,然后绘制J (θ)与迭代次数的曲线图。
  2. 问题
    (1)观察成本函数随着学习率的变化而变化变化。当学习率太小时会发生什么?太大了?
    (2)使用你发现的最佳学习率,运行梯度下降直到收敛,求
    a. θ的最终值
    b. 拥有1650平方英尺和3间卧室的房子的预计价格。

进行实验

  1. 加载数据、绘制数据、为数据添加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
  1. 设置不同的α,梯度下降求最优θ,观察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

绘制曲线图结果

lines四条曲线从上到下一次对应的是α=0.01, 0.05, 0.10, 0.15,可知当α=0.10时,梯度下降算法的实现效果最好。
3. 使用α=0.10,求最终θ,并预计1650平方英尺和3间卧室的房子。
θ为:
theta2
预计代码:

%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

预计结果:
price

代码

代码及数据下载链接:https://download.csdn.net/download/qq_37665301/11275858

总结

线性回归算法是机器学习中最简单的算法之一,需要掌握的有线性回归算法模型,代价函数J(θ),梯度下降算法以及进行梯度下降算法迭达的依据。
第一次写博客,好累啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值