插值经过所有样本点,多项式次数过高,可能会有龙格现象,结果可能比较复杂。
拟合与样本点足够接近,得到确定的曲线,结果比较简单。
例如是个直线,使用 y = k x + b y=kx+b y=kx+b
k ^ , b ^ = a r g m i n ( ∑ i = 1 n ( y i − y i ^ ) 2 ) \widehat{k},\widehat{b}=argmin(\sum_{i=1}^n(y_i-\widehat{y_i})^2) k ,b =argmin(i=1∑n(yi−yi )2)
也可以不使用平方,使用绝对值,但是求导会很头疼。
损失函数 L L L,在回归中称为残差平方和
L = ∑ i = 1 n ( y i − k x i − b ) 2 L=\sum^n_{i=1}(y_i-kx_i-b)^2 L=i=1∑n(yi−kxi−b)2
推导过程略,我也没推
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 \widehat{k}=\frac{n\sum_{i=1}^nx_iy_i-\sum_{i=1}^ny_i\sum_{i=1}^nx_i}{n\sum_{i=1}^nx_i^2-\sum_{i=1}^nx_i\sum_{i=1}^nx_i} k =n∑i=1nxi2−∑i=1nxi∑i=1nxin∑i=1nxiyi−∑i=1nyi∑i=1nxi
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 \widehat{b}=\frac{\sum_{i=1}^nx_i^2\sum_{i=1}^ny_i-\sum_{i=1}^nx_i\sum_{i=1}^nx_iy_i}{n\sum_{i=1}^nx_i^2-\sum_{i=1}^nx_i\sum_{i=1}^nx_i} b =n∑i=1nxi2−∑i=1nxi∑i=1nxi∑i=1nxi2∑i=1nyi−∑i=1nxi∑i=1nxiyi
总体平方和
S S T = ∑ i = 1 n ( y i − y ‾ ) 2 SST=\sum_{i=1}^n(y_i-\overline{y})^2 SST=i=1∑n(yi−y)2
误差平方和
S S E = ∑ i = 1 n ( y i − y ^ ) 2 SSE=\sum_{i=1}^n(y_i-\widehat{y})^2 SSE=i=1∑n(yi−y )2
回归平方和
S S R = ∑ i = 1 n ( y i ^ − y ‾ ) 2 SSR=\sum_{i=1}^n(\widehat{y_i}-\overline{y})^2 SSR=i=1∑n(yi −y)2
可以证明
S S T = S S E + S S R SST=SSE+SSR SST=SSE+SSR
R 2 = S S E S S R = S S T − S S E S S R = 1 − S S E S S T R^2=\frac{SSE}{SSR}=\frac{SST-SSE}{SSR}=1-\frac{SSE}{SST} R2=SSRSSE=SSRSST−SSE=1−SSTSSE
R 2 R^2 R2只能用于拟合函数是线性函数时结果的评价(下面一部分会说)
R 2 R^2 R2越接近1,误差平方月接近 0 0 0,拟合效果越好。
这里可以看出来SSE越小越好,但是为了找一个小的标准,所以找了SST,这里就很容易理解 R 2 R^2 R2了。
如果有些不是线性函数,可以直接使用SSE来判断拟合结果。
#这个函数是求平均值的函数
mean();
前面说: R 2 R^2 R2只能用于拟合函数是线性函数时结果的评价
原因很容易理解,看 R 2 R^2 R2的公式来源就能明白,但是需要理解一下线性函数的含义,来更好地判断线性函数。
对于参数来说是线性,不是对于变量来说。
y = a + b x 2 y=a+bx^2 y=a+bx2也算是a和b对于 x 2 x^2 x2的线性函数
y = e a + b x y=e^{a+bx} y=ea+bx也算是a和b对于x的线性函数(把lny看作一个因变量就可以了)
参数只以一次方出现,且不会与其他参数乘除,不出现参数的符合函数就可以算。
y = a + b 2 x y=a+b^2x y=a+b2x不算线性函数
y = a s i n ( b + c x ) y=asin(b+cx) y=asin(b+cx)不算
哇,这个工具箱真的我们去年电赛就开始用了,那时候我真菜(虽然现在也是很菜)
在Matlab->APP->curve fitting打开
也可以命令行输入cftool打开
数据区域、拟合区域、结果区域
左上角还可以直接生成代码,还可以保存图像。(不得不服matlab贼牛逼)
这代码改一下直接附录了。
如果一些复杂的函数拟合效果不好,可以更改option里面的初始值,达到一个好一些的结果。