Ng的一个例子:假设我们要用房子的大小来预测其价格,得到的数据如下:
我们画在二维平面上,得到如下:
我们可以大概地用一个函数来拟合如上的数据:
Price=h(area),其中h为线性函数,则称为线性回归,得到下面的一条预测直线。
一般化的,我们写成:
这里的参数,就是我们训练要得到的参数。
如何得到较好的参数呢?直观的方法就是最小二乘法(最小二乘的理论依据放在以后的blog:http://blog.youkuaiyun.com/ice110956/article/details/22782717 ),如下:
其中h表示我们模型得到的预测值,y为训练样本真实值,J为二乘差异。
那么问题转化为求解如上的最优化问题。
解法
常见的迭代法,如最速下降法等都可以求解上述问题。
首先求出负梯度方向:
根据下降算法,迭代更新系数直至收敛:
不过由于是多参数问题,在具体更新计算的时候,根据不同的策略有不同的方法。
批梯度下降法 Batch gradient descent
这种每次遍历所有的训练样本,来更新一个系数。这种做法方差很大,容易造成局部收敛。
Matlab实现
用matlab来拟合函数Y=3X+2+noise。
用批梯度下降法求解,代码如下:
clear;
clc;
X=random('norm',1,20,[1,100]);
noise=random('norm',0,5,[1,100]);
Y=3*X+2+noise;
plot(X,Y,'*');
sita=zeros(1,2);
maxiter=200;
a=0.001;
min_J=0.001;
for iter=1:maxiter
for i=1:100
sita(1)=sita(1)+a*(Y(i)-sita(1)*X(i)-sita(2))*X(i);
end
for i=1:100
sita(2)=sita(2)+a*(Y(i)-sita(1)*X(i)-sita(2));
end
J=0;
for i=1:100
J=J+0.5*(sita(1)*X(i)+sita(2)-Y(i))^2;
end
if(J<min_J)
break;
end
end
sita(1)
sita(2)
x=-50:50;
y=sita(1)*x+sita(2);
plot(x,y);
最后的结果为:
sita(1) =2.9598
sita(2)=
2.4461
得到近似直线Y=2.9598X+2.4461;
拟合效果:
随机梯度下降法 stochastic gradient descent
也叫做增量下降法 Incremental gradient descent
不同于匹梯度下降法,随机梯度下降每次只取目标函数关于当前样本的部分,实现目标函数的分布最优化,主要步骤如下:
如上,每次用一个样本,更新所有系数。而批梯度则是每次用所有样本更新一个系数。
同样拟合Y=3*X+2+noise
matlab实现
clear;
clc;
X=random('norm',1,20,[1,100]);
noise=random('norm',0,5,[1,100]);
Y=3*X+2+noise;
plot(X,Y,'*');
hold on;
sita=zeros(1,2);
maxiter=200;
a=0.001;
min_J=0.001;
for iter=1:maxiter
for i=1:100
sita(1)=sita(1)+a*(Y(i)-sita(1)*X(i)-sita(2))*X(i);
sita(2)=sita(2)+a*(Y(i)-sita(1)*X(i)-sita(2));
end
J=0;
for i=1:100
J=J+0.5*(sita(1)*X(i)+sita(2)-Y(i))^2;
end
if(J<min_J)
break;
end
end
sita(1)
sita(2)
x=-50:50;
y=sita(1)*x+sita(2);
plot(x,y);
结果为:
sita(1) =
2.9087sita(2) =
1.8797
得到近似直线:Y=2.9087X+1.8797
对比
当样本数m很大时,随机梯度法不用更新完所有的样本就能达到一个较好的参数拟合效果,虽然随机下降法是不收敛的,在最优值附近不断震荡,不过在实践中,是更好的方法。
解析法
把所有的样本组合得到一个矩阵,利用矩阵求导等方法,得到解析解,如下:
具体求解及证明略。