【数学建模】拟合算法

"拟合"在这部分课程中,通常会介绍如何使用不同的数学方法来找到最合适的函数模型来描述给定的数据集。以下是关于拟合的一些基本概念和技术:

拟合的基本概念

  • 定义:拟合是指寻找一个数学函数,使得该函数能够很好地描述一组观测数据。这个过程通常涉及到最小化观测数据与函数之间的误差。
  • 目标:拟合的目标是在数据中发现规律,并能够用一个函数表达这种规律,以便于预测未知数据或理解数据背后的现象。

常见的拟合方法

  • 线性回归:是最简单的拟合方法之一,它假设数据之间存在线性关系,并试图找到一条直线来最好地描述这些数据点。
  • 多项式回归:如果数据不是线性的,则可以尝试使用更高阶的多项式来拟合数据。
  • 非线性回归:适用于数据间存在复杂非线性关系的情况。
  • 最小二乘法:是一种常用的优化技术,用于最小化数据点与拟合曲线之间的平方差总和。

MATLAB 中的拟合操作

  • polyfit :用于多项式拟合。例如,p = polyfit(x, y, n),其中n是多项式的阶数。
  • lsqcurvefit:用于非线性最小二乘拟合。
  • fit:这是Curve Fitting Toolbox中的一个函数,可以用来进行各种类型的拟合。

示例代码

这里有一个简单的多项式拟合示例:

% 创建一些示例数据
x = linspace(0, 10, 100);
y = 2*x.^2 + 5*x + 3 + randn(size(x)); % 添加一些随机噪声

% 进行多项式拟合
p = polyfit(x, y, 2); % 二阶多项式拟合

% 使用拟合的多项式计算y值
y_fit = polyval(p, x);

% 绘制原始数据和拟合曲线
figure;
plot(x, y, 'o', x, y_fit, '-r');
title('Polynomial Fit of Data');
xlabel('x');
ylabel('y');
legend('Data', 'Fit');

拟合算法概述

  • 定义:与插值问题不同,拟合问题并不要求曲线一定经过给定的所有数据点。拟合的目标是寻求一个函数(或曲线),使得该函数在某种准则下与所有的数据点最为接近,即曲线拟合得最好(通常通过最小化损失函数实现)。

插值与拟合的区别

  • 插值:插值算法中得到的多项式(f(x))要经过所有样本点。但如果样本点太多,多项式次数过高,就会造成龙格现象,即曲线在两端剧烈波动。
  • 拟合:拟合算法倾向于得到一个确定的曲线,虽然这条曲线可能不会经过每一个样本点,但只要保证误差足够小即可。这样可以避免龙格现象,并且得到一个更加平滑的曲线。

最小二乘法

  • 定义:最小二乘法是一种常用的拟合方法,其目标是最小化观测数据与拟合函数之间的平方差之和。
  • 几何解释:最小二乘法通常有两种定义方式,一种使用绝对值来衡量误差,另一种使用平方差。由于绝对值不易求导,计算复杂,因此通常使用平方差的形式。
  • 原因:使用平方差形式的原因有两点:
    • 可以避免极端数据对拟合曲线的影响。
    • 最小二乘法得到的结果与极大似然估计(MLE)一致。
  • 避免使用更高次方:避免使用四次方或更高次方是因为这样做会加大极端数据的影响,并且计算复杂度会增加。

求解最小二乘法

  • 计算公式:在MATLAB中可以通过以下步骤求解最小二乘法:
    • 加载数据。
    • 计算斜率(k)和截距(b)。
    • 使用计算出的斜率和截距绘制拟合直线。
  • MATLAB代码

    clear; clc
    load data1
    plot(x, y, 'o')
    xlabel('x的值'); ylabel('y的值')
    n = size(x, 1);
    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.5, 7]);
    legend('样本数据', '拟合函数', 'location', 'SouthEast')

评价拟合的好坏

  • 评价指标:为了评价拟合的好坏,可以使用三个关键指标:总平方和(SST)、残差平方和(SSE)和回归平方和(SSR)。
  • 计算公式
    • 残差平方和(SSE):(\text{SSE} = \sum (y_{\hat{}} - y)^2)
    • 回归平方和(SSR):(\text{SSR} = \sum (y_{\hat{}} - \bar{y})^2)
    • 总平方和(SST):(\text{SST} = \sum (y - \bar{y})^2)
    • 拟合优度(R2):(\text{R}2 = \frac{\text{SSR}}{\text{SST}})

线性函数的定义

  • 定义:这里的线性函数指的是对参数为线性的函数,即参数仅以一次方出现,不能乘以或除以其他任何参数,也不能出现参数的复合函数形式。

利用拟合工具箱预测美国人口

  • 数据:给出了近2个世纪的美国人口统计数据(单位:百万人),要求使用给定的拟合函数预测未来30年的美国人口。
  • MATLAB代码 :使用cftool工具箱来进行拟合和预测。

模拟数据进行演示

  • 随机数生成 :MATLAB中可以使用randirandnormrnd函数来生成随机数,用于模拟数据。
    • randi:产生均匀分布的随机整数。
    • rand:产生均匀分布的随机数。
    • normrnd:产生正态分布的随机数。

在数模新版视频课程第四讲中,详细介绍了拟合算法及其在MATLAB中的实现方法。以下是根据提供的内容进一步拓展的详细解释:

拟合算法概述

  • 定义:拟合算法与插值算法不同,它不需要曲线一定经过给定的数据点。拟合的目标是寻找一个函数或曲线,使得该函数在某种准则下与所有的数据点最为接近,即曲线拟合得最好(通常通过最小化损失函数实现)。

插值与拟合的区别

  • 插值:插值算法中得到的多项式(f(x))要经过所有样本点。但如果样本点太多,多项式次数过高,就会造成龙格现象,即曲线在两端剧烈波动。
  • 拟合:拟合算法倾向于得到一个确定的曲线,虽然这条曲线可能不会经过每一个样本点,但只要保证误差足够小即可。这样可以避免龙格现象,并且得到一个更加平滑的曲线。

最小二乘法

  • 定义:最小二乘法是一种常用的拟合方法,其目标是最小化观测数据与拟合函数之间的平方差之和。
  • 几何解释:最小二乘法通常有两种定义方式,一种使用绝对值来衡量误差,另一种使用平方差。由于绝对值不易求导,计算复杂,因此通常使用平方差的形式。
  • 原因:使用平方差形式的原因有两点:
    • 可以避免极端数据对拟合曲线的影响。
    • 最小二乘法得到的结果与极大似然估计(MLE)一致。
  • 避免使用更高次方:避免使用四次方或更高次方是因为这样做会加大极端数据的影响,并且计算复杂度会增加。

求解最小二乘法

  • 计算公式:在MATLAB中可以通过以下步骤求解最小二乘法:
    • 加载数据。
    • 计算斜率(k)和截距(b)。
    • 使用计算出的斜率和截距绘制拟合直线。
  • MATLAB代码

    clear; clc
    load data1
    plot(x, y, 'o')
    xlabel('x的值'); ylabel('y的值')
    n = size(x, 1);
    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.5, 7]);
    legend('样本数据', '拟合函数', 'location', 'SouthEast')

评价拟合的好坏

  • 评价指标:为了评价拟合的好坏,可以使用三个关键指标:总平方和(SST)、残差平方和(SSE)和回归平方和(SSR)。
  • 计算公式
    • 残差平方和(SSE):(\text{SSE} = \sum (y_{\hat{}} - y)^2)
    • 回归平方和(SSR):(\text{SSR} = \sum (y_{\hat{}} - \bar{y})^2)
    • 总平方和(SST):(\text{SST} = \sum (y - \bar{y})^2)
    • 拟合优度(R2):(\text{R}2 = \frac{\text{SSR}}{\text{SST}})

线性函数的定义

  • 定义:这里的线性函数指的是对参数为线性的函数,即参数仅以一次方出现,不能乘以或除以其他任何参数,也不能出现参数的复合函数形式。

利用拟合工具箱预测美国人口

  • 数据:给出了近2个世纪的美国人口统计数据(单位:百万人),要求使用给定的拟合函数预测未来30年的美国人口。
  • MATLAB代码 :使用cftool工具箱来进行拟合和预测。

模拟数据进行演示

  • 随机数生成 :MATLAB中可以使用randirandnormrnd函数来生成随机数,用于模拟数据。
    • randi:产生均匀分布的随机整数。
    • rand:产生均匀分布的随机数。
    • normrnd:产生正态分布的随机数。

详细拓展

数据拟合与预测
  • 预测美国人口 :在给定的美国人口数据的基础上,可以使用MATLAB的cftool工具箱来进行拟合,并利用拟合出的模型来预测未来的美国人口。
    • 代码

      % 加载数据
      load population_data
      % 使用cftool工具箱进行拟合
      cftool
      % 选择合适的拟合函数
      % 进行拟合
      % 预测未来数据

拟合优度的评估
  • 计算拟合优度:为了评估拟合的质量,可以计算拟合优度(R^2)。
    • 代码

      y_hat = k * x + b; % 拟合值
      SST = sum((y - mean(y)).^2); % 总平方和
      SSR = sum((y_hat - mean(y)).^2); % 回归平方和
      SSE = sum((y_hat - y).^2); % 残差平方和
      R_2 = SSR / SST; % 拟合优度

曲线拟合工具箱
  • 使用 cftool工具箱cftool是MATLAB中的一个强大工具箱,可以用于进行曲线拟合。
    • 使用方法 :在MATLAB命令窗口中输入cftool,然后加载数据并选择适当的拟合函数。
    • 优点:直观、方便,可以快速进行拟合并可视化结果。
自定义数据模拟
  • 生成随机数据 :使用MATLAB中的randirandnormrnd函数可以生成随机数据,用于模拟不同的数据集。
    • 代码

      % 生成均匀分布的随机整数
      s1 = randi(10, 2, 5);
      % 生成均匀分布的随机数
      s2 = rand(1, 10);
      % 生成正态分布的随机数
      s3 = normrnd(0, 1, 1, 10);

通过以上的详细解释,我们可以更好地理解拟合算法的概念、实现方法及其在MATLAB中的应用。这些知识对于进行数据拟合和预测非常重要。

clear;clc
year = 1790:10:2000;
population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];
plot(year,population,'o')
cftool  % 拟合工具箱
% (1) X data 选择 year
% (2) Y data 选择 population
% (3) 拟合方式选择:Custom Equation (自定义方程)
% (4) 修改下方的方框为:x = f(t) = xm/(1+(xm/3.9-1)*exp(-r*(t-1790)))
% (5) 左边的result一栏最上面显示:Fit computation did not converge:即没有找到收敛解,右边的拟合图形也表明拟合结果不理想
% (6) 点击Fit Options,修改非线性最小二乘估计法拟合的初始值(StartPoint), r修改为0.02,xm修改为500 
% 有很多同学有疑惑,初始值为什么要这样设置?我们在未来学习微分方程模型和智能算法的课程时再来给大家介绍这里面蕴含的技巧。
% (7) 此时左边的result一览得到了拟合结果:r = 0.02735, xm = 342.4
% (8) 依次点击拟合工具箱的菜单栏最左边的文件---Generate Code(导出代码到时候可以放在你的论文附录),可以得到一个未命名的脚本文件
% (9) 在这个打开的脚本中按快捷键Ctrl+S,将这个文件保存到当前文件夹。
% (10) 在现在这个文件中调用这个函数得到参数的拟合值和预测的效果
[fitresult, gof] = createFit(year, population)
t = 2001:2030;
xm = 342.4;   
r =  0.02735;
predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790)));  % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算)
figure(2)
plot(year,population,'o',t,predictions,'.')  % 绘制预测结果图


% % 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
% % 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭
% % 视频中提到的附件可在售后群(购买后收到的那个无忧自动发货的短信中有加入方式)的群文件中下载。包括讲义、代码、我视频中推荐的资料等。
% % 关注我的微信公众号《数学建模学习交流》,后台发送"软件"两个字,可获得常见的建模软件下载方法;发送"数据"两个字,可获得建模数据的获取方法;发送"画图"两个字,可获得数学建模中常见的画图方法。另外,也可以看看公众号的历史文章,里面发布的都是对大家有帮助的技巧。
% % 购买更多优质精选的数学建模资料,可关注我的微信公众号《数学建模学习交流》,在后台发送"买"这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。
% % 视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。
% % 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231(必看)

这段MATLAB代码展示了如何使用cftool工具箱来进行曲线拟合,并基于拟合结果预测美国未来的人口数据。下面是详细的解释:

数据加载与可视化

  • 代码

    clear; clc
    year = 1790:10:2000;
    population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4];
    plot(year,population,'o')

  • 解释

    • 清除工作空间中的所有变量并清空命令窗口。
    • 定义了年份year和相应的人口数量population
    • 使用plot函数绘制人口数据点。

使用cftool进行曲线拟合

  • 代码

    cftool % 拟合工具箱

  • 解释

    • 打开MATLAB中的cftool工具箱。
    • cftool中选择year作为X数据,population作为Y数据。
    • 选择自定义方程(Custom Equation)作为拟合方式。
    • 修改方程为:(x = f(t) = \frac{x_m}{1+\left(\frac{x_m}{3.9}-1\right)e^{-r(t-1790)}})。
    • 初始拟合结果不佳,需要调整初始值。
    • 修改非线性最小二乘估计法拟合的初始值,将(r)设置为0.02,(x_m)设置为500。
    • 重新拟合后,得到拟合结果:(r = 0.02735),(x_m = 342.4)。
    • 导出拟合结果到MATLAB脚本文件。

保存拟合结果

  • 代码

    [fitresult, gof] = createFit(year, population)

  • 解释

    • 使用createFit函数从cftool中导出拟合结果和拟合质量指标。

预测未来人口

  • 代码

    t = 2001:2030;
    xm = 342.4;
    r = 0.02735;
    predictions = xm./(1+(xm./3.9-1).exp(-r.(t-1790))); % 计算预测值
    figure(2)
    plot(year,population,'o',t,predictions,'.') % 绘制预测结果图

  • 解释

    • 定义新的时间范围t用于预测。
    • 使用拟合得到的参数(x_m)和(r)计算预测人口值predictions
    • 使用plot函数绘制原始数据点和预测结果。
相关推荐
java1234_小锋15 分钟前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
wxl7812272 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
老艾的AI世界2 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK221512 小时前
机器学习系列----关联分析
人工智能·机器学习
小尤笔记3 小时前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础
FreedomLeo13 小时前
Python数据分析NumPy和pandas(四十、Python 中的建模库statsmodels 和 scikit-learn)
python·机器学习·数据分析·scikit-learn·statsmodels·numpy和pandas
风间琉璃""3 小时前
二进制与网络安全的关系
安全·机器学习·网络安全·逆向·二进制
Java Fans4 小时前
梯度提升树(Gradient Boosting Trees)详解
机器学习·集成学习·boosting
Java 第一深情4 小时前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft6184 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库