拟合算法

拟合算法

拟合算法是数学建模中常用的算法之一,被用于解决“预测类问题”。

插值和拟合的区别:

在插值算法中,得到的多项式f(x)要经过所有的样本点,但如果样本点太多,那么会导致这个多项式次数的过高,会造成“龙格现象(Runge phenomenon)”。

尽管我们可以选择“分段”的方法来避免“龙格现象(Runge phenomenon)”,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是“拟合的思想”。

我们在拟合算法中使用“最小二乘法”

最小二乘法的几何解释:

拟合算法_第1张图片
拟合算法_第2张图片

最小二乘法的数学语言阐述:

拟合算法_第3张图片
在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)]);
“工具箱”实现:

拟合算法_第4张图片

但是,通过拟合得到的数据,与真实数据总是会有“误差”。

拟合算法_第5张图片

拟合算法中“线性函数”的说明:

拟合算法_第6张图片
拟合算法_第7张图片

你可能感兴趣的:(算法,数学建模,matlab)