线性回归

(本文内容来自Andrew NG公开课,首先介绍线性回归模型及求解方法,最后展示实际例子说明问题)

线性回归是监督学习中的一种,数学表述为:数据集中有若干训练数据,对于每个输入特征 x(i) ,有对应输出变量 y(i) 。我们期望学习一种映射表达 y=h(x) ,使得对于训练集之外的特征也能够较好地预测其输出值。

如果预测值为连续值,这种问题被称为回归问题;而预测值为离散值,则这种问题被称为分类问题。

我们来列举一个简单的回归案例,假设数据特征有两个维度, x= {living area,bedrooms},对应房价为输出数据,如下图所示。我们希望建立模型 h(x) ,当给定其他(Living area, bedrooms)数据时,可以预测出对应房型应该支付的房价数额。

这里写图片描述

1.1 线性回归
线性回归是指使用线性模型对数据进行预测。如果特征 x n个特征维度, xi 表示特征 x 的第i 个特征分量。则线性回归模型 hθ(x)

hθ(x)=i=0nθixi=θ0x0=θ1x1++θnxn=θTx

其中, x0=1 。考虑,如果我们知道了预测方程 hθ(x) , 那么对于任意一个特征,我们就可以根据已知的线性模型推测输出值了。那么这样,问题就转变为如何求线性模型 h(x) ,也就是如何求解 h(x) 的参数 θ

考虑采用最小二乘方法,即使得预测值和真实值之间的误差和最小,即,

J(θ)=12i=1mhθ(x(i))y(i)2

其中,训练集个数为 m 个,x(i)表示第 i 个训练数据。

我们期望求解的参数θ 能够使cost function J(θ) 最小。这里介绍两种方法求解该问题:Gradient Descent和Normal Equation。

1.2 Gradient Descent
梯度下降法求解回归方程的参数使得cost function最小的基本思路是:赋予初始 θ 值,并根据下面公式逐步更新 θ 使得 J(θ) 不断减少,最终至收敛,对应的参数 θ 即为解。 θ 的每个分量更新公式为,

θjθjαθjJ(θ)

在更新参数 θ 的过程中,我们其实是每次沿着梯度下降的方向按照 α 速度下降,直至达到整个函数的局部(全局)最优点,下图就很好的展示了这个过程。

这里写图片描述

接下来介绍参数更新公式的推导,为了推导方便,首先研究只有一个训练样本时,如何计算推导公式。

这里写图片描述

所以,对于单一训练数据而言,模型参数梯度下降的更新公式为,

θjθj+α(yhθ(x))xj,j=0,,n

推广至 m 个训练数据,参数更新公式为,
Repeat until convergence{ θjθj+α1mmi=1(y(i)hθ(x(i)))x(i)j for every j}

1.2 Normal Equation
Normal Equation是直接使用矩阵 X 表示特征数据,y⃗  表示输出数据, θ 表示线性方程参数矩阵。将cost function转换为矩阵表达,通过对参数 θ 求导为零,得到的 θ 即为使得cost function 最小的线性方程参数。

矩阵表达及参数推导公式如下,

X=(x(1))T(x(2))T(x(m))Ty⃗ =y(1)y(2)y(m)θ=θ(1)θ(2)θ(m)

特征数据每一条数据占一行,每一列表示一个特征维度。cost function 表达为,
J(θ)=12i=1m(hθ(x(i))y(i))2=12i=1m((x(i))Tθy(i))2=12(Xθy⃗ )T(Xθy⃗ )

cost function相对于参数 θ 求导公式为(推导公式中引用部分矩阵公式,具体参见Andrew NG课件,此处省略)

这里写图片描述

导数为0,可以得到normal equation公式为,

XTXθ=XTy⃗ 

因此,参数 θ 的矩阵表达为,
θ=(XTX)1XTy⃗ 

1.3 Gradient Descent和Normal Equation的比较

1.当特征向量不同维度的范围差异较大时,会导致椭圆变得很窄很长,而出现梯度下降困难的问题。而使用Normal Equation是可以不管特征的scale的。(参考1.4部分)

2.相比于Gradient Descent, Normal Equation需要大量的矩阵运算,尤其是矩阵的逆运算,在矩阵很大的情况下,会大大增加计算复杂性。Andrew Ng建议特征维度小于10,000时用Normal Equation,大于10,000时改用Gradient Descent方法。

3.Normal Equation存在不可逆的情况,如:特征向量维度大于特征数量时( nm )或者当特征向量不同维度之间存在冗余信息。

1.4 特征缩放(feature scaling)
当特征不同维度之间数值取值范围差异性较大时,梯度下降过程会变得非常缓慢。例如x有两个特征维度,分别表示房屋的面积,取值范围为0-2000,以及房间个数,取值范围为1-5。这两个维度特征的取值规模不在同一个范围内,使用梯度下降时,收敛不快,且容易发生波动。所以在使用梯度下降前,需要将不同维度的特征约束至大致范围内。如,

load('ex3x.dat');
load('ex3y.dat');

m = size(ex3x, 1);
n = size(ex3x, 2) + 1;

x = [ones(m, 1) ex3x];
y = ex3y;

% scaling
mu = mean(x, 1);//均值
sigma = std(x, 1);//方差
for j = 2:n
   x(:,j) = (x(:,j) - mu(j))./sigma(j); 
end

1.5线性回归案例
案例:特征数据 X 表示小男孩的年龄,范围在2-8岁之间,输出变量y⃗  为每个小男孩的高度,共50个样本。求线性回归模型 h(x)
Matlab源代码为

%载入数据
x = load('ex2x.dat');
y = load('ex2y.dat');

%绘制数据
figure;
plot(x, y, 'o');
ylabel('Height in meters')
xlabel('Age in years');

%add x0=1
m = size(x, 1);
n = size(x, 2) + 1;
x = [ones(m, 1) x];

alpha = 0.07;
max_iter = 1500;

%iteratively train linear model parameters theta_0 and theta_1
theta = zeros(n, 1);

%first iteration
h = x*theta;
cost_function_pre = sum((h - y).*(h - y),1)/(2);

for j = 1:n
    dif = y - h;
    theta(j, 1) = theta(j, 1) + alpha * sum(dif.* x(:, j), 1)/m;
end

% second iteration
h = x*theta;
cost_function = sum((h - y).*(h - y),1)/(2);

thred = 0.00001;
iters = 2;
while(abs(cost_function - cost_function_pre) >= thred && iters < max_iter)
    iters = iters + 1;
    fprintf([num2str(iters) '; cost function:' num2str(iters) '\n']);

    % compute theta according to Gradient Descent
    for j = 1:n
        dif = y - h;
        theta(j, 1) = theta(j, 1) + alpha * sum(dif.* x(:, j), 1)/m;
    end

    cost_function_pre = cost_function;

    % compute cost function
    h = x*theta;
    cost_function = sum((h - y).*(h - y),1)/(2);
end

hold on;
plot(x(:,2), x*theta,'-');
legend('Training Data','Linear regression');

结果展示
这里写图片描述

最终求得的参数 θ=[0.73900.0659]T 。接下来,对新数据age = 3.5进行预测,带入已求得的线性模型,可知高度y = 0.9697,在图中的位置为红色圈表示。

使用Normal Equation计算较为简单,这里不再赘述。

请参考链接:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex2/ex2.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值