多变量线性回归(机器学习笔记三)

文章目录

    • 前言
    • 一、准备
    • 二、代价函数和偏导数
    • 三、特征归一化
    • 四、梯度下降
    • 五、Matlab代码实现
    • 六、结语

前言

上一章通过年龄-身高的例子介绍了单变量线性回归算法的实现过程。通过使用向量表示算法中的各个参量,我们可以很容易地将单变量线性回归算法扩展到多变量的情况。这一章主要介绍多变量线性回归算法的实现。与上一章类似,我们仍然通过一个例子来学习多变量线性回归算法。

一、准备

我们使用房价预测的例子来介绍多变量线性回归算法。我们使用的训练集如下图所示:
多变量线性回归(机器学习笔记三)_第1张图片
  这次,我们认为房屋的价格主要由面积和房间数这两个特征共同决定。因此,我们有两个输入变量: x 1 x_1 x1 x 2 x_2 x2,分别代表房屋的面积和房间数,一个输出量 y y y代表房屋的价格。我们用 n n n来表示特征的个数,显然,这里 n = 2 n=2 n=2。于是我们的特征向量为 x = [ x 1 x 2 ] \mathbf{x}=\left[\begin{matrix}x_1\\x_2\end{matrix}\right] x=[x1x2],输出向量为 y = [ y ] \mathbf{y}=\left[\begin{matrix}y\end{matrix}\right] y=[y]
  与上一章类似,我们仍然假设输出与特征之间的函数映射关系 h h h为线性函数: h = θ 0 + θ 1 x 1 + θ 2 x 2 h=\theta_0+\theta_1x_1+\theta_2x_2 h=θ0+θ1x1+θ2x2。因此我们的参数向量为 θ = [ θ 0 θ 1 θ 2 ] \mathbf{\theta}=\left[\begin{matrix}\theta_0\\\theta_1\\\theta_2\end{matrix}\right] θ=θ0θ1θ2,为了使输入向量与参数向量对应起来,我们给输入向量增加一个常数项1,变成 x = [ 1 x 1 x 2 ] \mathbf {x}=\left[\begin{matrix} 1\\x_1\\x_2\end{matrix}\right] x=1x1x2,这样我们就可以继续把假设函数写成 h = θ T x h=\mathbf{\theta}^T\mathbf{x} h=θTx。接下来的任务就是寻找最优参数 θ \mathbf{\theta} θ了,寻找方法与单变量类似,也是先计算代价函数和对应的偏导数,然后应用梯度下降算法。

二、代价函数和偏导数

多变量线性回归的代价函数仍然定义为所有样本的预测值与实际值的方差之和:
     J = 1 2 m ∑ i = 1 m [ h ( x ( i ) ) − y ( i ) ] 2 J=\frac{1}{2m}\sum\limits_{i=1}^m{[h(x^{(i)})-y^{(i)}]^{2}} J=2m1i=1m[h(x(i))y(i)]2
  对应的函数偏导数的为:
     ∂ J ∂ θ 0 = 1 m ∑ i = 1 m [ h ( x ( i ) ) − y ( i ) ] \frac{\partial{J}}{\partial{\theta_{0}}}=\frac{1}{m}\sum\limits_{i=1}^m{[h(x^{(i)})-y^{(i)}]} θ0J=m1i=1m[h(x(i))y(i)]
     ∂ J ∂ θ 1 = 1 m ∑ i = 1 m x 1 i [ h ( x ( i ) ) − y ( i ) ] \frac{\partial{J}}{\partial{\theta_{1}}}=\frac{1}{m}\sum\limits_{i=1}^m{x_1^{i}[h(x^{(i)})-y^{(i)}]} θJ=m1i=1mx1i[h(x(i))y(i)]
     ∂ J ∂ θ 2 = 1 m ∑ i = 1 m x 2 i [ h ( x ( i ) ) − y ( i ) ] \frac{\partial{J}}{\partial{\theta_{2}}}=\frac{1}{m}\sum\limits_{i=1}^m{x_2^{i}[h(x^{(i)})-y^{(i)}]} θ2J=m1i=1mx2i[h(x(i))y(i)]

三、特征归一化

与单变量情况不同,在执行梯度下降之前,我们还需要做一步准备,即特征归一化。
  由于我们选择了多种特征,而这些特征在数值大小可能会有很大的差异。在本例中,房屋的面积在 1 0 3 10^3 103量级,房屋的数量都是小于10的,而在梯度下降算法中,我们对每一个参数都采用相同的更新系数 α \alpha α,这就可能导致有的参数收敛得很快,而有的参数收敛得很慢,最终导致整体算法收敛得很慢甚至不能收敛到最小值。
  为了防止以上问题的出现,我们需要对除了常数项以外的各个特征进行归一化处理:
     x j ( i ) : = [ x j ( i ) − a v e r a g e ( x j ) ] / s t d ( x j ) x^{(i)}_j:=[x^{(i)}_j-average(x_j)]/std(x_j) xj(i):=[xj(i)average(xj)]/std(xj)
  其中 a v e r a g e ( x j ) = 1 m ∑ i = 1 m x j ( i ) average(x_j)=\frac{1}{m}\sum\limits_{i=1}^m{x^{(i)}_j} average(xj)=m1i=1mxj(i)代表该特征在所有样本上的平均值,而 s t d ( x j ) std(x_j) std(xj)代表该特征在所有样本上的标准差。
  这样一来,所有的特征都处于-1到1之间,且平均值为0,代价函数在各特征上的收敛速度也会比较接近。

四、梯度下降

完成以上准备工作以后,就可以开始执行梯度下降算法搜寻最优的参数值了。与单变量类似,多变量梯度下降算法的计算过程如下所示:
  Step1、初始化 θ \mathbf{\theta} θ:例如令 θ 0 = θ 1 = θ 2 = ⋯ = 0 \theta_{0}=\theta_{1}=\theta_{2}=\cdots=0 θ0=θ1=θ2==0;
  Step2、计算当前 θ \mathbf{\theta} θ值对应的 J J J的梯度值: ∂ J ∂ θ 0 \frac{\partial{J}}{\partial{\theta_{0}}} θ0J ∂ J ∂ θ 1 \frac{\partial{J}}{\partial{\theta_{1}}} θ1J ∂ J ∂ θ 2 \frac{\partial{J}}{\partial{\theta_{2}}} θ2J ⋯ \cdots
  Step3、更新 θ \mathbf{\theta} θ θ 0 : = θ 0 − α ∗ ∂ J ∂ θ 0 \theta_{0}:=\theta_{0}-\alpha*\frac{\partial{J}}{\partial{\theta_{0}}} θ0:=θ0αθ0J θ 1 : = θ 1 − α ∗ ∂ J ∂ θ 1 \theta_{1}:=\theta_{1}-\alpha*\frac{\partial{J}}{\partial{\theta_{1}}} θ1:=θ1αθ1J; θ 2 : = θ 2 − α ∗ ∂ J ∂ θ 2 \theta_{2}:=\theta_{2}-\alpha*\frac{\partial{J}}{\partial{\theta_{2}}} θ2:=θ2αθ2J; ⋯ \cdots
  Step4、判断是否结束循环,若为否则回到Step2。

五、Matlab代码实现

下面是实现多变量线性回归算法的Matlab代码:

close all;clear all;clc;

%导入数据
x=load('ex3x.dat');
y=load('ex3y.dat');

%特征归一化
m=length(y);
x=[ones(m,1),x];
sigma=std(x);
ave=mean(x);
x(:,2)=(x(:,2)-ave(2))/sigma(2);
x(:,3)=(x(:,3)-ave(3))/sigma(3);

%参数初始化
alpha=1.0;
step_num=20;
J=zeros(step_num);
theta=zeros(3,1);

%梯度下降算法
for step=1:step_num
    h_y=x*theta-y;
    theta=theta-alpha/m*(x'*h_y);
    J(step)=h_y'*h_y/m/2;
end

%显示代价函数优化过程
plot(log10(J(:)),'-','linewidth',2,'color','b');
axis([1,step_num,-inf,inf])
xlabel('Step\_num');
ylabel('log(J)');
legend(['Alpha=' num2str(alpha)]);

%计算对原始特征的参数
theta(1)=theta(1)-theta(2)*ave(2)/sigma(2)-theta(3)*ave(3)/sigma(3);
theta(2)=theta(2)/sigma(2);
theta(3)=theta(3)/sigma(3);

代码的运行结果如下图所示。
多变量线性回归(机器学习笔记三)_第2张图片
需要注意的是,由于进行了特征归一化处理,我们得到的参数 θ \mathbf{\theta} θ是针对归一化以后的特征,如果要得到对原始特征的参数可以通过以下公式计算:
     θ 0 ′ = θ 0 − ∑ i = 1 n θ i ∗ a v e ( x i ) s t d ( x i ) \theta^{'}_0=\theta_0-\sum\limits_{i=1}^{n}{\frac{\theta_i*ave(x_i)}{std(x_i)}} θ0=θ0i=1nstd(xi)θiave(xi)
     θ i ′ = θ i / s t d ( x i ) \theta^{'}_i=\theta_i/std(x_i) θi=θi/std(xi)

六、结语

以上Matlab代码中用到的数据和代码文件可以在从这里下载,提取码gmnw
  本章介绍了多变量线性回归算法的原理和实现方式,如果我们将其与上一章的单变量线性回归算法进行对比就会发现,两者的实现过程和向量化的函数表达式都是大同小异的。
  目前为止,我们都假定输出与特征之间是线性关系的,然而,大多数情况下这两者之间是非线性的关系。下一章,我们来学习如何将多变量线性回归进一步扩展到非线性的情况。

你可能感兴趣的:(机器学习)