拟合算法
拟合算法是数学建模中常用的算法之一,被用于解决“预测类问题”。
插值和拟合的区别:
在插值算法中,得到的多项式f(x)要经过所有的样本点,但如果样本点太多,那么会导致这个多项式次数的过高,会造成“龙格现象(Runge phenomenon)”。
尽管我们可以选择“分段”的方法来避免“龙格现象(Runge phenomenon)”,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是“拟合的思想”。
我们在拟合算法中使用“最小二乘法”
最小二乘法的几何解释:
最小二乘法的数学语言阐述:
在Matlab中有“拟合工具箱”,可以实现“最小二乘法”等拟合算法,也可以通过代码实现。
代码实现:
%拟合算法
%最小二乘法
%确定数据矩阵
c=input('请依次输入数据矩阵的各个元素:');
[a,b]=size(c);
%计算拟合得到的“斜率”和“截距”
k=((a*sum(c(:,1).*c(:,2)))-(sum(c(:,2)).*sum(c(:,1))))/((a*sum(c(:,1).^2))-(sum(c(:,1)).^2));
b=(((sum(c(:,1).^2))*sum(c(:,2)))-(sum(c(:,1)*sum(c(:,1).*c(:,2)))))/((a*sum(c(:,1).^2))-(sum(c(:,1)).^2));
%隐式方程
y=@(x)k*x+b;
%拟合数据
nhc(:,1)=c(:,1);
nhc(:,2)=c(:,1).*k+b;
%y的平均值
avey=mean(c(:,2));
%计算“总体平方和” SST
SST=sum((c(:,2)-avey).^2);
%计算“误差平方和” SSE
SSE=sum((c(:,2)-nhc(:,2)).^2);
%计算“回归平方和” SSR
SSR=sum((nhc(:,2)-avey).^2);
%计算“拟合优度” R
R=SSR/SST;
%取“适当区间”
x_min=min(c(:,1))-1;
x_max=max(c(:,1))+1;
%画图
fplot(y,[x_min ,x_max]);
hold on;
plot(c(:,1),c(:,2),'o');
grid on;
xlabel(['拟合优度:',num2str(R)]);
“工具箱”实现:
但是,通过拟合得到的数据,与真实数据总是会有“误差”。
拟合算法中“线性函数”的说明: