ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

清风数模课---拟合算法

2022-01-31 14:05:01  阅读:199  来源: 互联网

标签:函数 SST sum 平方和 --- 数模 随机 拟合


  1. 使用目标:

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

  2. 最基础的一次函数拟合

     plot(x,y,'o')
     % 给x和y轴加上标签
     xlabel('x的值')
     ylabel('y的值')

    <注:代码文件:code1.m >数据文件:data1.xlsx

    • 将数据导入到matlab时,我们是分别创建了两个变量:x和y,每个变量仅保存一列数据。(指建立了两列,一列x,一列y)

  3. 最小二乘法

    1. 问题:
      设这些样本点为(x_i,y_i),i = 1,2,...,n
      我们设置的拟合曲线为y=kx+b
      问:k和b取何值的时候,样本点和拟合曲线最接近

    2. 定义:
      y_i=kx_i+b \\ \overline{k},\overline{b}=arg_{k,b}min(\displaystyle \sum^{n}_{i = 1}{(y_i-\overline{y_i})^2})

    3. 求解(计算过程太复杂了...略)

       

    4. 代码

      文件: code1.m

       clear;clc
       load data1
       plot(x,y,'o')
       % 给x和y轴加上标签
       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')
    5. 判断拟合好坏
       

      拟合优度(可决系数):R^2
      总体平方和SST:SST=\displaystyle \sum^{n}_{i = 1}{(y_i-\hat{y_i})^2}
      回归平方和SSR:SSR=\displaystyle \sum^{n}_{i = 1}{(\hat{y_i}-\overline{y})^2}
      SST=SSE+SSR
      0\leq R^2 = \frac{SSR}{SST} = \frac{SST-SSE}{SST} = 1-\frac {SSE}{SST}\leq1
      R^2越接近1,说明误差平方和越接近0,误差越小说明拟合的越好
  4. 线性函数在此指的是对参数为线性,意思是参数都是一次的

    在函数中,参数仅以一次方出现,且不能乘以或除以其他任何的参数,并不 能出现参数的复合函数形式。

  5. 拟合优度的代码

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

    文件:code1.m (mean()是求均值的函数)

  6. matlab拟合工具箱

    1. 命令窗口输入cftool

    2. 注:cftool可以做出三维图,十分高级

    自己模拟数据进行演示

    1. randi : 产生均匀分布的随机整数

       %产生一个1至10之间的随机矩阵,大小为2x5;
       s1 = randi(10,2,5);
       %产生一个-5至5之间的随机矩阵,大小为1x10;
       s2 = randi([-5,5],1,10);
    2. rand: 产生均匀分布的随机数

       %产生一个0至1之间的随机矩阵,大小为1x5;
       s3 = rand(1,5);
       %产生一个a至b之间的随机矩阵,大小为1x5;
       % a + (b-a) * rand(1,5); 如:a,b = 2,5
       s4= 2 + (5-2) * rand(1,5);
    3. normrnd:产生正态分布的随机数

       %产生一个均值为0,标准差为2的正态分布的随机矩阵,大小为3x4;
       s5 = normrnd(0,2,3,4);
    4. roundn—任意位位置四舍五入

       a = 3.1415
       roundn(a,-2) % ans = 3.1400
       roundn(a,2) % ans = 0
       a =31415
       roundn(a,2) % ans = 31400

    代码文件:code2

  7. 附注:代码文件code3.m用于自己模拟数据进行演示

标签:函数,SST,sum,平方和,---,数模,随机,拟合
来源: https://blog.csdn.net/m0_62519898/article/details/122759108

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有