Java教程

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

本文主要是介绍清风数模课---拟合算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  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用于自己模拟数据进行演示

这篇关于清风数模课---拟合算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!