matlab将每次迭代结果画图,机器学习-线性回归以及
MATLABoctave实现
参考资料:
斯坦福⼤学公开课 :机器学习课程 [第2集]监督学习应⽤.梯度下降
octave⼊门教程
关于⾮线性优化fminbnd函数的说明(仅供新⼿参考)(也可作为fmincon函数的参考)
由于是刚开始接触ML和MATLAB,所以记录⼀些⽐较简单的笔记。
个⼈实验中未使⽤MATLAB,⽽是使⽤了Octave作为替代,区别只是把函数结束的end改成endfunction即可,其他部分和matlab保持⼀致。
第⼀部分:基本模型
在解决拟合问题的解决之前,我们⾸先回忆⼀下线性回归基本模型。
设待拟合参数 θn*1 和输⼊参数[ xm*n, ym*1] 。
对于各类拟合我们都要根据梯度下降的算法,给出两部分:
①  cost function(指出真实值y与拟合值h之间的距离):给出cost function 的表达式,每次迭代保证cost function的量减⼩;给出梯度gradient,即cost function对每⼀个参数θ的求导结果。
function [ jVal,gradient ] = costFunction ( theta )
②  Gradient_descent(主函数):⽤来运⾏梯度下降算法,调⽤上⾯的cost function进⾏不断迭代,直到最⼤迭代次数达到给定标准或者cost function返回值不再减⼩。
function [optTheta,functionVal,exitFlag]=Gradient_descent( )
线性回归:拟合⽅程为hθ(x)=θ0x0+θ1x1+…+θnxn,当然也可以有xn的幂次⽅作为线性回归项(如
),这与普通意义上的线性不同,⽽是类似多项式的概念。
其cost function 为:
第⼆部分:Y=θ0+θ1X1型---线性回归(直线拟合)
在Matlab 线性拟合 & ⾮线性拟合中我们已经讲过如何⽤matlab⾃带函数fit进⾏直线和曲线的拟合,⾮
常实⽤。⽽这⾥我们是进⾏ML课程的学习,因此研究如何利⽤前⾯讲到的梯度下降法(gradient descent)进⾏拟合。
cost function:
function [ jVal,gradient ] = costFunction2( theta )
%COSTFUNCTION2 Summary of thisfunction goes here
%  linear regression -> y=theta0 + theta1*x
%  parameter: x:m*n  theta:n*1  y:m*1  (m=4,n=1)
%
%Data
x=[1;2;3;4];
y=[1.1;2.2;2.7;3.8];
m=size(x,1);
hypothesis = h_func(x,theta);
delta = hypothesis - y;
jVal=sum(delta.^2);
gradient(1)=sum(delta)/m;
gradient(2)=sum(delta.*x)/m;
end
其中,h_func是hypothesis的结果:
function [res] = h_func(inputx,theta)
%H_FUNC Summary of thisfunction goes here
%  Detailed explanation goes here
%cost function 2
res= theta(1)+theta(2)*inputx;
end
Gradient_descent:
function [optTheta,functionVal,exitFlag]=Gradient_descent( )
%GRADIENT_DESCENT Summary of thisfunction goes here
%  Detailed explanation goes here
options = optimset('GradObj','on','MaxIter',100);
initialTheta = zeros(2,1);
[optTheta,functionVal,exitFlag] = fminunc(@costFunction2,initialTheta,options); end
result:
>> [optTheta,functionVal,exitFlag] = Gradient_descent()
Local minimum found.
Optimization completed because the size of the gradient is less than
the defaultvalue of the function tolerance.
optTheta =
0.3000
0.8600
functionVal =
0.0720
exitFlag =
1
即得y=0.3+0.86x;
验证:
function [ parameter ] = checkcostfunc(  )
%CHECKC2 Summary of thisfunction goes here
matlab求导%  check ifthe cost function works well
%  check with the matlab fit function as standard
%check cost function 2
x=[1;2;3;4];
y=[1.1;2.2;2.7;3.8];
EXPR= {'x','1'};
p=fittype(EXPR);
parameter=fit(x,y,p);
end
运⾏结果:
>> checkcostfunc()
ans =
Linear model:
ans(x) = a*x + b
Coefficients (with 95% confidence bounds):
a =        0.86  (0.4949, 1.225)
b =        0.3  (-0.6998, 1.3)
和我们的结果⼀样。下⾯画图:
function PlotFunc( xstart,xend )
%PLOTFUNC Summary of thisfunction goes here
%  draw original data and the fitted
%===================cost function 2====linear regression %original data
x1=[1;2;3;4];
y1=[1.1;2.2;2.7;3.8];
%plot(x1,y1,'ro-','MarkerSize',10);
plot(x1,y1,'rx','MarkerSize',10);
hold on;
%fitted line - 拟合曲线
x_co=xstart:0.1:xend;
y_co=0.3+0.86*x_co;
%plot(x_co,y_co,'g');
plot(x_co,y_co);
hold off;
end
注解:
1 single training example公式
More than one training example:
θ:θ(i)-=gradient(i),其中gradient(i)是J(θ)对θi求导的函数式,此处令α=1/m,并且gradient(1)在matlab程序中实际对应x(0)
,⽽x(0)=1,把
代⼊上⾯的公式
可以得到gradient(1)=sum(delta)/m;
注解2
options = optimset('GradObj','on','MaxIter',100);
initialTheta = zeros(2,1);
[optTheta,functionVal,exitFlag] = fminunc(@costFunction2,initialTheta,options);
初学matlab优化,迭代中⽌后,经常⼀头雾⽔。参看帮助后仍似懂⾮懂。下⾯关于fminbnd函数的说明(也可作为fmincon函数的参考)对于新⼿也许会有帮助,不当之处请指正。
⽬标函数fun:
需要最⼩化的⽬标函数。fun函数需要输⼊标量参数x,返回x处的⽬标函数标量值f。可以将fun函数指定为命令⾏,如
x = fminbnd(inline('sin(x*x)'),x0)
同样,fun参数可以是⼀个包含函数名的字符串。对应的函数可以是M⽂件、内部函数或MEX⽂件。若fun='myfun',则M⽂件函数myfun.m必须有下⾯的形式:
function f = myfun(x)
f = ...            %计算x处的函数值。
若fun函数的梯度可以算得,且options.GradObj设为'on'(⽤下式设定),
options = optimset('GradObj','on')
则fun函数必须返回解x处的梯度向量g到第⼆个输出变量中去。注意,当被调⽤的fun函数只需要⼀个输出变量时(如算法只需要⽬标函数的值⽽不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值。
function [f,g] = myfun(x)
f = ...          %计算x处得函数值。