拟合算法

理论

拟合与插值不同,不需要经过所有的点,只需要误差比较小,拟合就是可行的。

基本的方法是最小二乘法,

设一条曲线\(y=kx+b\) , 对于\(x_i\)这条曲线的估值为\(f(x_i),残差为e=f(x_i)-y_i. 最小二乘法就是让\sum e^2最小\)

因为这些方程都是线性方程,所以除了求导计算最小值满足的k,b之外,还可以用线性代数解决最小二乘法问题。详见:https://open.163.com/newview/movie/free?pid=M6V0BQC4M&mid=M6V2AOJPU

大意为,一个线性方程组 Ax=b如果无解,那么最近的近似解可以通过\(A^T\cdot Ax=A^T\cdot b\)的解计算来计算。

现实中的拟合可能要求高次函数,一次函数的拟合效果可能不好,所以可以用若干非线性函数来拟合。考虑一下插值算法,总体效果不好的情况下可以分段插值,所以拟合也可以分段,我们可以用若干非线性函数来拟合

  1. 直线y=kx+b
  2. 多项式\(y=a_0+a_1x+\cdots +a_mx^m\)
  3. 双曲线\(y=\frac{a_1}{x}+a_2\)
  4. 指数函数\(y=a_1e^{a_2x}\).

有那么多的拟合函数,那么如何评价拟合效果呢?

用拟合优度(可决系数),\(记作R^2,其中0\leq R^2=\frac{SSR}{SST}=\frac{SST-SSE}{SST}=1-\frac{SSE}{SST}\leq 1,R^2越接近1越好。\)

\(SST(total)为总体平方和,SST=\sum_{i=1}^n(y_i-\bar{y})^2\)

\(SSE(error)为误差平方和,SSE=\sum_{i=1}^n(y_i-\hat{y_i})^2\)

\(SSR(return)为回归平方和,SSR=\sum_{i=1}^n(\hat{y_i}-\bar{y})^2\)

拟合优度\(R^2\)只能用于看线性拟合的效果,其他非线性看SSE的大小。

MATLAB

MATLAB自带拟合工具包,支持曲线拟合工作,在APP中找 Curve Fitting Tool.

最小二乘法,求一个y=a+bx的公式,用线性代数方法

%x,y为初始数据
x;
y;
%构造r它是方程中已知量的矩阵
r = [ones(5,1) x.^2];
ab = r\y %ab是r左除y,即ab=inv(r)*y,这样能得到方程的解,拟合曲线的系数在ab中。

多项式拟合

a = polyfit(x0,y0,m)
%x0,y0为初始数值
%m为多项式次数
%a为参数
y = polyval(a,x)
%要求拟合函数在x处的值用polyval
posted @ 2024-07-08 15:55  West11  阅读(117)  评论(0)    收藏  举报