您的位置:首页 > 其它

线性回归

2016-06-04 21:29 302 查看
(本文内容来自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(θ)=12∑i=1m(hθ(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+α(y−hθ(x))xj,j=0,⋯,n

推广至m个训练数据,参数更新公式为,

Repeat until convergence{ θj←θj+α1m∑mi=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))T⋯⋯⋯⎤⎦⎥⎥⎥⎥⎥y⃗ =⎡⎣⎢⎢⎢⎢y(1)y(2)⋯y(m)⎤⎦⎥⎥⎥⎥θ=⎡⎣⎢⎢⎢⎢θ(1)θ(2)⋯θ(m)⎤⎦⎥⎥⎥⎥

特征数据每一条数据占一行,每一列表示一个特征维度。cost function 表达为,

J(θ)=12∑i=1m(hθ(x(i))−y(i))2=12∑i=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存在不可逆的情况,如:特征向量维度大于特征数量时(n≥m)或者当特征向量不同维度之间存在冗余信息。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息