最小二乘优化
在之前有一个, 我们用的是解方程的方法(嘿嘿,要是无解咋办呢?),当然也可以用多项式拟合。
最小二乘优化是一个什么问题呢?
最小化这个 ,这也是最小二乘优化的定义,在Matlab中有处理这个最小二乘优化问题的函数:
lsqlin,lsqcurvefit,Lsqnonlin,Lsqnonneg四个函数,四个函数功能也不一样呢,求的的最优化表达式也不一样。
lsqlin函数
lsqlin函数功能:
解释一下这个式子:上面的2指的是平方,下面的2是2-范数。
x = [19 25 31 38 44]'; y = [19.0 32.3 49.0 73.3 97.8]'; r = [ones(5,1) x.^2]; ab=lsqlin(r,y); x0 = 19:0.1:44; y0 = ab(1) + ab(2)*x0.^2; plot(x,y,'o',x0,y0,'r');
同样得到ab(1)和ab(2);
可以看出,他主要用来解线性的拟合。
lsqcurvefit函数
栗子:拟合曲线 中的参数
P95
调用形式:
非线性拟合时,每一次的运行结果可能都不相同
数据没找到,不是很好操作。
x0 = -10:0.01:10; y0 = normpdf(x0,0,1); save normpdfdata x0 y0;
clc,clear; load normpdfdata mf = @(cs,xdata)1/sqrt(2*pi)/cs(2)*exp(-(xdata-cs(1)).^2/cs(2)^2/2); cs = lsqcurvefit(mf,rand(2,1),x0,y0);
使用了匿名函数mf,不重新定义和一个fun函数的.m文件了。
拟合出来和原来生成数据的二项式分布的参数u,e及其接近了。
lsqnonlin函数
clc,clear load normpdfdata F = @(cs)1/sqrt(2*pi)/cs(2)*exp(-(x0-cs(1)).^2/cs(2)^2/2)-y0; cs0 = rand(2,1); cs = lsqnonlin(F,cs0);
参数拟合的效果还是十分准的。
lsqnonneg函数
到了最后一个函数了。嘿嘿,我发现书的排版还是有问题的,他应该和第一个lsqlin函数放在一起说的。因为他们的功能很类似哦。
P97栗子5.11:
咦~~,你会发现不在像前面的一个 或者函数的形式,而是要求两个参数x。
其实不必大惊小怪,其实还是一个式子,就按照矩阵乘法乘起来,就是两个参数的组合成的
直接代入:
c = [0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [0.8587; 0.1781 0.0747 0.8405]; x = lsqnonneg(c,d);
至此:
拟合常用方法就完成了,线性拟合,非线性拟合两个部分。