拟合算法

曲线拟合(curve fitting):指把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。常用的拟合方法有如最小二乘曲线拟合法等。

与插值的区别:插值一定会过数据点。而拟合,是得到了最接近的结果,是要看总体效果。

最小二乘法的原理:
我们首先生成一组散点

clear,clc
x=[4.2 5.9 2.7 3.8 3.8 5.6 6.9 3.5 3.6 2.9 4.2 6.1 5.5 6.6 2.9 3.3 5.9 6.0 5.6];
y=[8.4 11.7 4.2 6.1 7.9 10.2 13.2 6.6 6.0 4.6 8.4 12.0 10.3 13.3 4.6 6.7 10.8 11.5 9.9];
plot(x,y,'o')
xlabel('x')
ylabel('y')

在这里插入图片描述

我们用一个一次函数y=k*x+b(红线)来拟合,使拟合效果最好。
在这里插入图片描述

问题是如何确定k和b的值?
我们的主要思想是,待定拟合曲线,从竖直方向上,累加每个点到曲线的距离(绝对值),使得总的值最小,求出对应的k与b。因为绝对值难以求导,求解复杂,于是我们累加各点到曲线距离的平方,这就是最小二乘法的思想。公式如下:
在这里插入图片描述
要使得平方和(在机器学习中称为损失函数,在回归中称为残差平方和)最小,就要对k与b分别求偏导,高数中学过如何计算(因为过程比较复杂,这里不做赘述),最终算出对应的k与b。

MATLAB代码:

clear,clc
x=[4.2 5.9 2.7 3.8 3.8 5.6 6.9 3.5 3.6 2.9 4.2 6.1 5.5 6.6 2.9 3.3 5.9 6.0 5.6];
y=[8.4 11.7 4.2 6.1 7.9 10.2 13.2 6.6 6.0 4.6 8.4 12.0 10.3 13.3 4.6 6.7 10.8 11.5 9.9];
plot(x,y,'o')
xlabel('x')
ylabel('y')
n = size(x,1);%n为x矩阵的行数
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x));
b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(n*sum(x.*x)-sum(x)*sum(x));
hold on % 继续在之前的图形上来画图形
grid on % 显示网格线
f=@(x) k*x+b;%匿名函数
fplot(f,[2,14]);%fplot表示在指定范围内绘制图像,这里选取214的区域
legend('样本数据','拟合函数','location','SouthEast')

也可以直接调用polyfit函数

clear,clc
x=[4.2 5.9 2.7 3.8 3.8 5.6 6.9 3.5 3.6 2.9 4.2 6.1 5.5 6.6 2.9 3.3 5.9 6.0 5.6];
y=[8.4 11.7 4.2 6.1 7.9 10.2 13.2 6.6 6.0 4.6 8.4 12.0 10.3 13.3 4.6 6.7 10.8 11.5 9.9];
A=polyfit(x,y,1)%1表示一次多项式
z=polyval(A,x);%z为x在A函数上的值
plot(x,y,'ko',x,z,'r')

两个运行结果略有不同,这里采用调用polyfit函数的结果:
在这里插入图片描述
在这里插入图片描述

看样子我们已经顺利完成了拟合,但是同学们是否依旧存在一些疑惑?
那就是不论什么样的数据,不论一次,二次或者多次的拟合函数,我们都可以算出拟合曲线的表达式,那我们该如何选择方法,如何评价我们的拟合效果?

所以我们需要有一个评价标准,那就是拟合优度R^2(又叫可决系数)

注意:只有拟合函数为线性函数时,我们才看拟合优度,其他函数我们主要看误差平方和(SSE)。
这里的线性与我们之前所学的线性不同,不是x对y呈线性,而是参数对y呈线性。举个例子:
1.y=a+b·x^2
2.y=a+(b^2)·x
这里的1为线性,而2为非线性

我们继续说拟合优度,其建立于以下三个定义:
总体平方和SST,误差平方和SSE,回归平方和SSR。
在这里插入图片描述
可以证明SST=SSE+SSR,这里就不推导了。因此,
在这里插入图片描述
拟合优度越接近1越好。

MATLAB代码:

clear,clc
x=[4.2 5.9 2.7 3.8 3.8 5.6 6.9 3.5 3.6 2.9 4.2 6.1 5.5 6.6 2.9 3.3 5.9 6.0 5.6];
y=[8.4 11.7 4.2 6.1 7.9 10.2 13.2 6.6 6.0 4.6 8.4 12.0 10.3 13.3 4.6 6.7 10.8 11.5 9.9];
A=polyfit(x,y,1);
z=polyval(A,x);
plot(x,y,'ko',x,z,'r')
k = A(1,1);
b = A(1,2);
SSR = sum((z-mean(y)).^2); % 回归平方和
disp(SSR)
SSE = sum((z-y).^2); % 误差平方和
disp(SSE)
SST = sum((y-mean(y)).^2); % 总体平方和
disp(SST)
R_2 = SSR/SST;
disp(R_2)

运行结果:
在这里插入图片描述
可以看到,SST基本等于SSE+SSR,R^2=0.9635,接近于1,拟合效果还挺好。

注:MATLAB自带的拟合工具箱cftool更加方便操作

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值