文章目录

  • 一、算法简介
  • 二、公式推导与指标计算
  • 三、项目实战:多项式曲线拟合(一阶)
  • 四、项目实战:多项式曲线拟合(计算标准误差估计值)
  • 五、项目实战:多项式曲线拟合(1到9阶)



一、算法简介

打开工具 - 方法1: MATLAB - APP - Curve Fitting
打开工具 - 方法2: 命令行窗口:cftool(Curve Fitting Tool)

多项式曲线拟合公式: p(x) = p(1)*x^n + p(2)*x^(n-1) + ... + p(n)*x + p(n+1).

python中对离散数据点进行B样条曲线拟合 离散点拟合曲线算法_线性回归


定义1:

用连续曲线近似地刻画或比拟平面上离散点组所表示的坐标之间的函数关系。


定义2:

在数值分析中,曲线拟合就是用解析表达式逼近离散数据,即离散数据的公式化。


最小二乘法:

通过" 最小化误差的平方和 "寻找与数据匹配的最佳函数,使得求得的函数(解析表达式)与实际数据之间误差的平方和为最小。


备注:多项式曲线拟合算法的原理基于最小二乘法。其中:

一阶最小二乘法对应线性拟合算法,其余阶数对应曲线拟合算法。

二、公式推导与指标计算

曲线拟合算法的公式推导与指标计算

三、项目实战:多项式曲线拟合(一阶)

MathWorks官网:多项式曲线拟合(polyfit)p = polyfit(x, y, n); 返回阶数为 n 的多项式系数,p为多项式系数向量,向量中的系数按降幂排列。该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。
y = polyval(p, x); 计算多项式(p为系数向量)在(x)点出得函数值(y)


clear;								% 删除工作区中项目,释放系统内存
clc;								% 清空命令行窗口
close all;							% 关闭句柄可见的所有图窗
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (1)构建原始数据
x = 1:20;
y = -1.2*x + 2*randn(1, length(x));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (2)多项式曲线拟合
p = polyfit(x, y, 1);				% 多项式曲线拟合
f = polyval(p, x);					% 多项式计算
% p = polyfit(log(x), y, 2);		% 多项式(对数)曲线拟合
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (3)开始画图
figure; 							% 创建图窗窗口
scatter(x, y);						% 原始数据。scatter:绘制散点图。
hold on;							% 添加新绘图时,保留当前绘图
plot(x, f, 'Color', 'r');			% 拟合曲线。plot:画图
	
xlabel('x');						% 添加 x 轴标签
ylabel('y');						% 添加 y 轴标签
title('Polynomial curve fitting');	% 添加标题
legend('data', 'linear fitting');	% 添加图例

四、项目实战:多项式曲线拟合(计算标准误差估计值)

[p, S] = polyfit(x, y, n) 将返回一个结构体 S,可用作 polyval 的输入来获取误差估计值。
[y, delta] = polyval(p, x, S) 使用 polyfit 生成的可选输出结构体 S 来生成误差估计值。delta 是使用 p(x) 预测 x 处的未来观测值时的标准误差估计值。


clear;								% 删除工作区中项目,释放系统内存
clc;								% 清空命令行窗口
close all;							% 关闭句柄可见的所有图窗
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[p, S] = polyfit(x, y, 1); 
[f, delta] = polyval(p, x, S);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 绘制原始数据、线性拟合、95%预测区间(y±2Δ)。
plot(x, y, 'bo')
hold on
plot(x, f, 'r-')
plot(x, f+2*delta, 'm--', x, f-2*delta, 'm--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

五、项目实战:多项式曲线拟合(1到9阶)


% 在matlab中,polyfit曲线拟合函数是基于最小二乘法原理实现的。
clear;clc;close all;
x = [2,4,5,6,6.8,7.5,9,12,13.3,15];
y = [-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~, k] = size(x);
R_2 = [];
for n = 1:9
    p = polyfit(x,y,n);  	% 多项式拟合系数
	f = polyval(p, x);		% 多项式拟合结果
	
	% SST基本等于SSE+SSR。
	SSR = sum((f-mean(y)).^2); 		% 回归平方和
	SSE = sum((f-y).^2); 			% 误差平方和
	SST = sum((y-mean(y)).^2); 		% 总体平方和
	R_2 = [R_2, SSR/SST];			% 拟合优度(R^2),又叫可决系数。
	disp(SSR)
	disp(SSE)
	disp(SST)
	disp(R_2)

    subplot(3, 3, n)
    plot(x, y, '*')
    hold on
    plot(x, f)
    title(n)
    grid on					
end
suptitle('1到9阶方程的曲线拟合结果')

% 说明:R^2越接近于1,拟合效果越好。但是损失不是越小越好,因为损失过小可能造成过拟合的情况。
% 结论:R_2保存了每个阶数的拟合优度,可以绘制该结果提取该数据对应的最优阶数。