前言:插值算法与拟合算法的思想比较接近。两者的区别:拟合问题中不需要曲线一定经过给定的点,拟合问题的目标在于寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(也叫做最小化损失函数)。
在插值算法中,得到的多项式 f ( x ) f(x) f(x)必须经过每一个已知点,如果样本点太多会造成插值多项式太复杂,产生龙格现象。即使使用分段插值的方法固然可以避免龙格现象,但是这样一来为了经过每一个点,多项式的解析式必定十分复杂。但是更多时候,我们更倾向于得到一个确定简洁的曲线(用数学的思维去衡量现实世界,解决问题),尽管这条曲线不能经过所有的样本点,但只要保证误差足够小即可(拟合的思想)。拟合的结果是得到一个确定的曲线.
【例子】
以 y = k x + b y=kx+b y=kx+b为例
几何解释:
设我们拟合的样本点为 ( x i , y i ) , i = 1 , 2 , ⋯ , n (x_i,y_i),i=1,2,\cdots,n (xi,yi),i=1,2,⋯,n我们设置的拟合曲线为 y = k x + b y=kx+b y=kx+b。问:k和b取何值,样本点与拟合曲线最为接近?
【注】
推导过程:
令拟合值 y ^ i = k x i + b \hat{y}_i=kx_i+b y^i=kxi+b,那么 k ^ , b ^ = a r g m i n k , b ( ∑ i = 1 n ( y i − k x i − b ) 2 ) \hat{k},\hat{b}=arg min_{k,b}(\sum_{i=1}^{n}(y_i-kx_i-b)^2) k^,b^=argmink,b(∑i=1n(yi−kxi−b)2),令 L = ∑ i = 1 n ( y i − k x i − b ) 2 L=\sum_{i=1}^{n}(y_i-kx_i-b)^2 L=∑i=1n(yi−kxi−b)2,先要找出k,b使得L最小。(L在机器学习中被称为损失函数,在回归中也常被称为残差平方和)
求导:
{ ∂ L ∂ k = − 2 ∑ i = 1 n x i ( y i − k x i − b ) = 0 ∂ L ∂ b = − 2 ∑ i = 1 n ( y i − k x i − b ) = 0 ⇒ { ∑ i = 1 n x i y i = k ∑ i = 1 n x i 2 + b ∑ i = 1 n x i ∑ i = 1 n y i = k ∑ i = 1 n x i + b n \left\{\begin{matrix} \frac{\partial L}{\partial k}=-2\sum_{i=1}^{n}x_i(y_i-kx_i-b)=0\\ \frac{\partial L}{\partial b}=-2\sum_{i=1}^{n}(y_i-kx_i-b)=0 \end{matrix}\right.\Rightarrow \left\{\begin{matrix} \sum_{i=1}^{n}x_iy_i=k\sum_{i=1}^{n}x_i^2+b\sum_{i=1}^{n}x_i\\ \sum_{i=1}^{n}y_i=k\sum_{i=1}^{n}x_i+bn \end{matrix}\right. {∂k∂L=−2∑i=1nxi(yi−kxi−b)=0∂b∂L=−2∑i=1n(yi−kxi−b)=0⇒{∑i=1nxiyi=k∑i=1nxi2+b∑i=1nxi∑i=1nyi=k∑i=1nxi+bn
k ^ = n ∑ i = 1 n x i y i − ∑ i = 1 n y i ∑ i = 1 n x i n ∑ i = 1 n x i 2 − ∑ i = 1 n x i ∑ i = 1 n x i , b ^ = ∑ i = 1 n x i 2 ∑ i = 1 n y i − ∑ i = 1 n x i ∑ i = 1 n x i y i n ∑ i = 1 n x i 2 − ∑ i = 1 n x i ∑ i = 1 n x i \hat{k}=\frac{n\sum_{i=1}^{n}x_iy_i-\sum_{i=1}^{n}y_i\sum_{i=1}^{n}x_i}{n\sum_{i=1}^{n}x_i^2-\sum_{i=1}^{n}x_i\sum_{i=1}^{n}x_i},\hat{b}=\frac{\sum_{i=1}^{n}x_i^2\sum_{i=1}^{n}y_i-\sum_{i=1}^{n}x_i\sum_{i=1}^{n}x_iy_i}{n\sum_{i=1}^{n}x_i^2-\sum_{i=1}^{n}x_i\sum_{i=1}^{n}x_i} k^=n∑i=1nxi2−∑i=1nxi∑i=1nxin∑i=1nxiyi−∑i=1nyi∑i=1nxi,b^=n∑i=1nxi2−∑i=1nxi∑i=1nxi∑i=1nxi2∑i=1nyi−∑i=1nxi∑i=1nxiyi
如何评价拟合的好坏?
拟合优度 R 2 R^2 R2
可以证明: S S T = S S E + S S R SST=SSE+SSR SST=SSE+SSR 要用到我们求导的两个等式
具体证明略。
拟合优度: 0 ≤ R 2 = S S R S S T = S S T − S S E S S T = 1 − S S E S S T ≤ 1 0\leq R^2=\frac{SSR}{SST}=\frac{SST-SSE}{SST}=1-\frac{SSE}{SST}\leq 1 0≤R2=SSTSSR=SSTSST−SSE=1−SSTSSE≤1, R 2 R^2 R2越接近于1,说明误差平方和越小,拟合的越好。
【注】 R 2 R^2 R2只能用于当拟合函数是“线性函数”时拟合结果的评价!
我们这里说的线性函数是指对于参数是线性的!
线性模型中的“线性”主要有两种形式:对变量为线性或者是对参数为线性。
什么叫线性于参数的函数?
在函数中,参数仅以一次方的形式出现,且不能乘以或除以其他任何的参数,并不能出现参数的复合形式的情况。
y = a 1 r 1 ( x ) + a 2 r 2 ( x ) + ⋯ + a m r m ( x ) , { r 1 ( x ) , r 2 ( x ) , ⋯ , r m ( x ) } 线 性 无 关 , 不 是 两 两 线 性 无 关 y=a_1r_1(x)+a_2r_2(x)+\cdots+a_mr_m(x),\left \{ r_1(x),r_2(x),\cdots,r_m(x) \right \}线性无关,不是两两线性无关 y=a1r1(x)+a2r2(x)+⋯+amrm(x),{r1(x),r2(x),⋯,rm(x)}线性无关,不是两两线性无关
【例子】
Y = β 1 + β 2 X + β 3 X 2 Y=\beta_1+\beta_2X+\beta_3X^2 Y=β1+β2X+β3X2:是线性于函数,线性于参数。
Y = e β 1 + β 2 X Y=e^{\beta_1+\beta_2X} Y=eβ1+β2X:是线性函数,线性于参数(两边同时取对数)。
y = a + b 3 x y=a+b^3x y=a+b3x:并非线性于参数,不可以用 R 2 R^2 R2。
y = a ( x − b ) 2 y=a(x-b)^2 y=a(x−b)2:并非线性与参数,不能用 R 2 R^2 R2
【衡量取舍】
一般来说,拟合函数的次数越高,越复杂,拟合的误差平方和越小(拟合优度也 越好),但是另一方面,我们又追求拟合函数的间简洁性,且次数越高,龙格现象越严重,所以不能一味的追求误差平方和的减少,要综合两方面考虑,选出最优的拟合方案。
%产生一个1至10之间的随机矩阵,大小为25
s1=randi(10,2,5);
disp(s1)
%产生一个-5到5之间的随机矩阵,大小为110
s2=randi([-5,5],1,10);
disp(s2)
%产生一个0至1之间的随机矩阵,大小为15
s3=rand(1,5);
s3
%产生一个a至b之间的随机矩阵,大小为15
%a+(b-a)*rand(1,5)
s4=2+(5-2)*rand(1,5);
s4
%产生一个均值为0,标准差为2的正态分布的随机矩阵,大小为3*4
s5=normrnd(0,2,3,4)
(4)roundn:任意位置四舍五入
Round to multiple of 1 0 n 10^n 10n
a=3.1415;
roundn(a,-2)%3.1400
roundn(a,2)%0
b=31415;
roundn(b,2)%31400
在无约束最优化问题中,有些重要的情形,比如目标函数由若干个函数的平方和构成,这类函数一般可以写成 F ( x ) = ∑ i = 1 m f i 2 ( x ) , x ∈ R n F(x)=\sum_{i=1}^{m}f^2_i(x),x\in R^n F(x)=i=1∑mfi2(x),x∈Rn式中: x = [ x 1 , ⋯ , x n ] T x=[x_1,\cdots,x_n]^T x=[x1,⋯,xn]T,一般假设 m ≥ n m\geq n m≥n。
我们把极小化这类函数的问题 m i n F ( x ) = ∑ i = 1 m f i 2 ( x ) min\;F(x)=\sum_{i=1}^{m}f^2_i(x) minF(x)=i=1∑mfi2(x)称为最小二乘法优化问题。
最小二乘优化是一类比较特殊的优化问题,Matlab中也提供了强大的函数,主要有:lsqlin,lsqcurvefit,lsqnonlin,lsqnonneg等。
lsqlin函数
用于求解 m i n x 1 2 ∣ ∣ C ⋅ x − d ∣ ∣ 2 min_x\;\frac{1}{2}||C\cdot x-d||^2 minx21∣∣C⋅x−d∣∣2
s . t . { A x ˙ ≤ b , A e q x ˙ = b e q , l b ≤ x ≤ u b s.t.\left\{\begin{matrix} A\dot x\leq b,\\ Aeq\dot x=beq,\\ lb\leq x\leq ub \end{matrix}\right. s.t.⎩⎨⎧Ax˙≤b,Aeqx˙=beq,lb≤x≤ub式中:C,A,Aeq为矩阵;d,b,beq,lb,ub,x为向量。
函数形式: x = l s q l i n ( C , d , A , b , A e q , b e q , l b , u b , x 0 ) x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x_0) x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0)
【例子】用最小二乘法求一个形如 y = a + b x 2 y=a+bx^2 y=a+bx2的经验公式,使它与表中所列数据拟合。
x | 19 | 25 | 31 | 38 | 41 |
---|---|---|---|---|---|
y | 19.0 | 32.3 | 49.0 | 73.3 | 97.8 |
( y ^ i − y i ) 2 = ( a + b x i 2 − y i ) 2 (\hat{y}_i-y_i)^2=(a+bx_i^2-y_i)^2 (y^i−yi)2=(a+bxi2−yi)2
令 X = [ a , b ] , C = [ o n e s ( s i z e ( X ) ) , X ] 令X=[a,b],C=[ones(size(X)),X] 令X=[a,b],C=[ones(size(X)),X]
编写程序如下:
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);
ab
x0=19:0.1:44;
y0=@(x)ab(2)*x.^2+ab(1);%y0=0.05*x.^2+0.9726
plot(x,y,'ro',x0,y0(x0),'b-')
2. lsqcurvefit函数
给定输入输出数列xdata,ydata(也就是已知点的横坐标和纵坐标),求参量x,使得: m i n x ∣ ∣ F ( x , x d a t a ) − y d a t a ∣ ∣ 2 2 = ∑ i = 1 n ( F ( x , x d a t a i ) − y d a t a i ) 2 min_x\;||F(x,xdata)-ydata||_2^2=\sum_{i=1}^{n}(F(x,xdata_i)-ydata_i)^2 minx∣∣F(x,xdata)−ydata∣∣22=i=1∑n(F(x,xdatai)−ydatai)2Matlab中的函数为:x=lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
x0是拟合参数的初始值。
【例子】用最小二乘法拟合 y = 1 2 π σ e − ( x − μ ) 2 2 σ 2 y=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu )^2}{2\sigma^2}} y=2πσ1e−2σ2(x−μ)2中的未知参数 μ , σ \mu,\sigma μ,σ,其中自己模拟产生已知数据点 x i , y i , ( i = 1 , 2 , ⋯ , n ) x_i,y_i,(i=1,2,\cdots,n) xi,yi,(i=1,2,⋯,n)分别放在Matlab数据文件data3.mat中的x0,y0中。
(1)产生data3.mat文件。
x0=-10:0.1:10;
y0=normpdf(x0,0,1);%计算标准正态分布mu=0,sigma=1的概率密度函数在x0处的值
save data3 x0 y0%把x0,y0保存到文件data3.mat中
(2)拟合参数
x0=-10:0.1:10;
y0=normpdf(x0,0,1);%计算标准正态分布mu=0,sigma=1的概率密度函数在x0处的值
save data3 x0 y0%把x0,y0保存到文件data3.mat中
clc,clear
load data3
mf=@(cs,xdata)1/sqrt(2*pi)/cs(2)*exp(-(xdata-cs(1)).^2/2/cs(2).^2);
yc=mf([2,1],2)%测试一下,yc=0.3989
cs=lsqcurvefit(mf,rand(2,1),x0,y0)%拟合参数的初始值是任意取的cs=[0,1]
clc,clear
load data3
F=@(cs)1/sqrt(2*pi)/cs(2)*exp(-(x0-cs(1)).^2/2/cs(2).^2)-y0;
cs0=rand(2,1);
cs=lsqnonlin(F,cs0)%cs=[0,1]