Andrew Ng机器学习笔记(一):梯度下降法

来源:互联网 发布:2017最火的网络电视剧 编辑:程序博客网 时间:2024/05/17 22:03


假设线性回归方程为:

y为实际值,为了使得拟合最佳,则要实现:

注:1/2是为了计算方便,无实际意义。
方法一:梯度下降法

引入了梯度下降法,使得每一步都是向下降速度最快的那个方向,而最终也一定会收敛。(获得的是局部最优)
每一次求导选择方向最小,负方向。

具体算法如下:
每一次迭代更新一次系数:

注:=表示的是赋值的意思

经过不断的迭代之后,

α实际上是learning rate,也就是决定了步长的大小
但是越接近局部最优的时候,步长会不断地调整变小。
因为θ中有多个参数,所以每次迭代对于每个参数都需要进行梯度下降,直到J(θ)收敛到最小值。
这个方法叫做batch gradient descent。
当样本数量比较小的时候可以使用此方法,但当样本数量很大时,该方法的工作量很大,因为每一个样本每一个方向都计算了,计算量很大。
故有了随机梯度下降法,不考察所有的数据,没那么精确,总是在局部最优附近徘徊。

每一次至考虑一个样本点的最优,而不是所有样本点的误差和,收敛过程比较曲折。





几个简单的MATLAB代码例子:
1、简单的hense矩阵:

function x=fsxhesse(f,a,b)syms x1 x2;% fsxhesse函数 求函数的hesse矩阵;% 本程序仅是简单的求二次函数的hesse矩阵!;% x=fsxhesse(f)为输入函数 f为二次函数 x1,x2为自变量;% fsx TJPU 2008.6.15x1=a;x2=b;fx=diff(f,'x1');     %求f对x1偏导数fy=diff(f,'x2');     %求f对x2偏导数fxx=diff(fx,'x1');   %求二阶偏导数 对x1再对x1fxy=diff(fx,'x2');   %求二阶偏导数 对x1再对x2fyx=diff(fy,'x1');   %求二阶偏导数 对x2再对x1fyy=diff(fy,'x2');   %求二阶偏导数 对x2再对x2fxx=subs(fxx);       %将符号变量转化为数值fxy=subs(fxy);fyx=subs(fyx);fyy=subs(fyy);x=[fxx,fxy;fyx,fyy]; %求hesse矩阵% v=[a,b]; % df=jacobian(f,v);%雅克比矩阵 % df% df=df.'; %转置% df% G=jacobian(df,v);% x=G;



2、最速下降法

function x=fsxsteep(G,f,e,a,b)% fsxsteep函数 最速下降法% x=fsxsteep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点;% fsx TJPU 2008.6.15x1=a;x2=b;%Q=fsxhesse(f,x1,x2);Q=G;x0=[x1 x2]';fx1=diff(f,'x1'); %对x1求偏导数fx2=diff(f,'x2'); %对x2求偏导数g=[fx1 fx2]'; %梯度g1=subs(g); %把符号变量转为数值gg1d=-g1;k=0;while (abs(norm(g1))>=e)  %norm(g1)为g1的2范数,即sqrt(x1^2+x2^2)% for k=0:200t=(-d)'*d/((-d)'*Q*d);%步长%t=1/30;x0=x0-t*g1; %迭代更新,搜索到的点v=x0;vpa(x0,10)%精度的位数a=[1 0]*x0;b=[0 1]*x0;x1=a;x2=b;g1=subs(g);d=-g1;k=k+1;end;x=v;k

3、例子:

syms x1 x2 x3;x=[1,0.3;1,0.45;1,0.5;1,0.7];y=[1;2;3;4];% x=[1,1;1,2;1,4;1,4;1,5;1,7;1,7];% y=[2;4;6;8;9;13;14];X=[x1,x2];fx=0;XX'hh=x1.^2;hhfor i=1:4    fx=fx+(X*(x(i,:)).'-y(i,1)).^2;endfxv=[x1,x2];df=jacobian(fx,v);df=df.';G=jacobian(df,v);z=fsxsteep(G,fx,1e-4,6,1)a=vpa(z(1,1),5);ab=vpa(z(2,1),5);bx3=0:5;f=a+b*x3;ffigure(1);plot(x3,f);i=1;for i=1:4    text(x(i,2),y(i),'*');    y(i)endx1=-50:2:50;x2=2*x1;[x1,x2]=meshgrid(x1,x2); %Z= (x1 + 2*x2 - 2).^2 + (x1 + 3*x2 - 2).^2 + (x1 + 4*x2 - 5/2).^2 + (x1 + x2 - 1).^2;%Z=x1.^2+10*x2.^2;fxfx=(x1 + x2/2 - 3).^2 + (x1 + (3*x2)/10 - 1).^2 + (x1 + (7*x2)/10 - 4).^2 + (x1 + (9*x2)/20 - 2).^2;figure(2);surf(x1,x2,fx)text(10,10,100,'*****');figure(3);contour(x1,x2,fx,100);text(10,10,'***');

方法二:最小二乘法

将训练特征表示为 X 矩阵,结果表示成 y 向量,仍然是线性回归模型,误差函数不变。那么

θ 可以直接由下面公式得出 


但要求X是满秩的,求矩阵的逆也比较慢


用误差函数为平方和的概率解释

假设预测结果和实际结果之间存在误差,


一般来讲,误差满足平均值为 0 的高斯分布,也就是正态分布。那么 x 和 y 的条件概率也就是 


为了要实现模型能够在全部样本上预测最准,也就是概率积最大。这个概率积成为最大似然估计。我们希望在最大似然估计得到最大值时确定 θ。那么需要对最大似然估计公式求导,求导结果是 



0 0
原创粉丝点击