作者: | 来源:互联网 | 2023-08-07 16:31
程序文件study2.mfunctionstudy2()??count7;??n1;??%X[123454.2678]‘;??%Y[5,4,5,4.5,5,6,643]‘;
程序文件 study2.m
function study2()
count=7;
n=1;
%X=[1 2 3 4 5 4.2 6 7 8]‘;
%Y=[5,4,5,4.5,5,6,6 4 3]‘;
X=1:10;
Y=rand(1,10)*100;
sita=rand(n,1);
overvalue=-1;
count=0;
b=(max(Y)+min(Y))/2; %%假设函数为 h(x)=sita*x+b
while 8<(J=calJ())&&(abs(J-overvalue)>0.0001)
study();
overvalue=J;
count=count+1;
draw();
sleep(0.01)
endwhile
count
draw();
function ans=calJ()
ans=sum((X*sita+b-Y).^2)/2;
endfunction
function study()
sita=sita-0.003*sum((X*sita+b-Y).*X);
endfunction
function draw()
hold off
plot(X,Y,‘*‘);
hold on
tempx=linspace(0,max(X)*5/4,3);
tempy=tempx*sita+b;
plot(tempx,tempy);
endfunction
endfunction
执行过程如下所示
一个简单的学习算法,其中学习速度选取很关键,就是子函数study中0.003代表的意思,如果选取过大会发现曲线震荡发散不收敛,选取过小学习时间太长。决定了整个系统学习的效率。
上图演示的时候我将sita=zeros(n,1)了,因为要有一个好的动画效果 -_-! ,开头代码中所用的随机数实际效果更好。
梯度下降法,一阶曲线拟合