精华内容
下载资源
问答
  • 基于Matlab高斯曲线拟合求解
  • MATLAB实现高斯曲线拟合

    千次阅读 2019-11-26 16:21:18
    MATLAB实现高斯曲线拟合 完成某次课程任务,在MATLAB中新建一个m文件,将下列代码复制,或者直接复制到命令栏回车即可使用 x=[0:0.1:10];%0—10每次加0.1,共101个点 y=50*exp(-(x-5).^2./2);%x,y为初始函数值表现...

    MATLAB实现高斯曲线拟合

    完成某次课程任务,在MATLAB中新建一个m文件,将下列代码复制,或者直接复制到命令栏回车即可使用

    x=[0:0.1:10];%0—10每次加0.1,共101个点
    y=50*exp(-(x-5).^2./2);%x,y为初始函数值表现为红线
    x=x';%因为拟合曲线时需要列向量
    y=y';
    y0=1*randn(1,101);%添加噪声//形成1行101列随机数
    y0=y0';%y1为添加噪声后的函数,表现为点
    y1=y+y0;%加上噪声后的函数值
    Mytype=fittype('A*exp(-(x-u)^2/(2*d^2))');%需要拟合的函数类型
    [cf ,gof]=fit(x(:),y1(:),Mytype)%fit函数
    xi=0:0.1:10;
    yi=cf.A*exp(-(xi-cf.u).^2/(2*cf.d^2));%xi,yi为拟合后的函数
    plot(x,y1,'g.');%加噪声的函数为绿色的点
    hold on;
    plot(xi,yi,'r');%拟合后的曲线为红色的线
    plot(x,y,'b');%拟合前的标准曲线为蓝色的线
    
    

    在这里插入图片描述

    展开全文
  • https://blog.csdn.net/KEY_Init/article/details/103258920 Matlab进行高斯拟合

    https://blog.csdn.net/KEY_Init/article/details/103258920

    Matlab进行高斯拟合

    展开全文
  • 随着新型冠状病毒COVID-19的威胁遍及世界,我们生活在一个日益担忧的时代,本文用matlab分析COVID-19数据集。

    原文链接:http://tecdat.cn/?p=19211 

     

    随着新型冠状病毒COVID-19的威胁遍及世界,我们生活在一个日益担忧的时代,本文用matlab分析COVID-19数据集。

    COVID-19数据源

    我们检查解压缩的文件。包含:

    • data.csv -2020年各省/州的全球病例每日水平数据
    • confirmed.csv-确诊病例的时间序列数据
    • deaths.csv-死亡人数的时间序列数据
    • recovered.csv-康复人数的时间序列数据

    地图上可视化

    我们在地图上可视化已确诊病例的数量。我们首先加载纬度和经度变量。

    opts = detectImportOptions(filenames(4), "TextType","string");
    

    数据集包含“省/州”变量,但我们要在“国家/地区”等级汇总数据。在此之前,我们需要稍微整理一下数据。

    times_conf.("Country/Region")(times_conf.("Country/Region") == "China") = "Mainland China";
    times_conf.("Country/Region")(times_conf.("Country/Region") == "Czechia") = "Czech Republic";
    

    现在,我们可以使用  groupsummary  将已确认的案例相加并平均经纬度来按国家/地区汇总数据。

    country = groupsummary(times_conf,"Country/Region",{'sum','mean'},vars(3:end));
    

    输出中包含不必要的列,例如纬度和经度的总和。我们删除这些变量。

    
    vars = regexprep(vars,"^(sum_)(?=L(a|o))","remove_");
    vars = regexprep(vars,"^(mean_)(?=[0-9])","remove_");
    

     

    times_conf_exChina = times_conf_country(times_conf_country.("Country/Region") ~= "Mainland China",:);
    

    让我们使用  geobubble  可视化数据集中的第一个和最后一个日期数据。

    
    for ii = [4, length(vars)]
        times_conf_exChina.Category = categorical(repmat("<100",height(times_conf_exChina),1));
        times_conf_exChina.Category(table2array(times_conf_exChina(:,ii)) >= 100) = ">=100";
        gb.LegendVisible = "off";
    
    

    我们可以看到它最初只影响了大陆周围的国家/地区。值得注意的是,我们早在2020年1月22日就已经在美国确认了病例。

    美国确诊病例

    进入美国的省/州级别。

    figure
    t = tiledlayout("flow");
    for ii = [5, length(vars)]
    
        gb.BubbleColorList = [1,0,1;1,0,0];
        gb.LegendVisible = "off";
        gb.Title = "As of " + vars(ii);
        gb.SizeLimits = [0, max(times_conf_us.(vars{length(vars)}))];
        gb.MapCenter = [44.9669 -113.6201];
        gb.ZoomLevel = 1.7678;
    

     

    可以看到它始于华盛顿,并在加利福尼亚和纽约爆发了大规模疫情。

    按确诊病例排名国家/地区

    让我们使用covid_19_data.csv比较按国家/地区确认的病例数。日期时间格式中存在不一致之处,因此我们一开始会将其视为文本。

    opts = detectImportOptions(filenames(3), "TextType","string","DatetimeType","text");
    

    清理日期时间格式。

    Data.nDate = regexprep(Data.Date,"\/20$","/2020");
    Data.Date = datetime(Data.Date);
    

    我们还需要标准化“国家/地区”中的值。

    Country_Region(Country_Region == "Iran (Islamic Republic of)") = "Iran";
    

    数据集包含省/州变量。让我们在“国家/地区”级别汇总数据。

    countryData = groupsummary(provData,{'ObservationDate','Country_Region'}, ...
        "sum",{'Confirmed','Deaths','Recovered'});
    

    countryData包含每日累积数据。我们只需要最新的数字。

     

    确认病例按国家/地区的增长

    我们还可以检查这些国家中病例的增长速度。

    figure
    plot(countryData.ObservationDate(countryData.Country_Region == labelsK(2)), ...
    hold on
    for ii = 3:length(labelsK)
        plot(countryData.ObservationDate(countryData.Country_Region == labelsK(ii)), ...
    

     

    尽管韩国显示出增长放缓的迹象,但它在其他地方正在加速发展。

    按国家/地区划分的新病例增长

    我们可以通过减去两个日期之间已确认病例的累计数量来计算新病例的数量。

    
    for ii = 1:length(labelsK)
        country = provData(provData.Country_Region == labelsK(ii),:);
        country = groupsummary(country,{'ObservationDate','Country_Region'}, ...
    
        if labelsK(ii) ~= "Others"
            nexttile
    
    

    您可以看到,中国和韩国没有很多新病例。可见,已经遏制住了疫情。

    中国

    由于中国的感染速度正在放缓,我们来看看仍有多少活跃病例。您可以通过从确诊病例中减去恢复病例和死亡来计算活跃病例。

    for ii = 1:length(labelsK)
        by_country{ii}.Active = by_country{ii}.Confirmed - by_country{ii}.Deaths - 
    
    figure
    

     

    拟合曲线

    有效案例的数量正在下降,曲线看起来大致为高斯曲线。我们可以拟合高斯模型并预测活动案例何时为零吗?

    我使用  曲线拟合工具箱  进行高斯拟合

    
    ft = fittype("gauss1");
    
    [fobj, gof] = fit(x,y,ft,opts);
    gof
    
    gof = 
      struct with fields:
    
               sse: 4.4145e+08
           rsquare: 0.9743
               dfe: 47
        adjrsquare: 0.9732
              rmse: 3.0647e+03
    

    让我们通过增加20天来将输出预测。

    现在我们对结果进行绘制。

    figure
    area(ObservationDate,by_country{1}.Active)
    hold on
    plot(xdates,yhat,"lineWidth",2)
    

     

     

    韩国

    让我们来查看韩国的活跃病例,恢复案例和死亡人数。

     

    使用高斯模型无法获得任何合适的结果。


     

    最受欢迎的见解

    1.在python中使用lstm和pytorch进行时间序列预测

    2.python中利用长短期记忆模型lstm进行时间序列预测分析

    3.使用r语言进行时间序列(arima,指数平滑)分析

    4.r语言多元copula-garch-模型时间序列预测

    5.r语言copulas和金融时间序列案例

    6.使用r语言随机波动模型sv处理时间序列中的随机波动

    7.r语言时间序列tar阈值自回归模型

    8.r语言k-shape时间序列聚类方法对股票价格时间序列聚类

    9.python3用arima模型进行时间序列预测

    展开全文
  • 基于qt creator开发环境下的高斯曲线拟合实现过程: 空气VOCs色谱图得到的一系列离散数据,色谱峰处符号高斯分布,故采用高斯函数对其进行曲线拟合。开发环境为qt creator,拟合算法选用Levenberg-Marquardt,结果...

    基于qt creator开发环境下的高斯曲线拟合实现过程:

    空气VOCs色谱图得到的一系列离散数据,色谱峰处符号高斯分布,故采用高斯函数对其进行曲线拟合。开发环境为qt creator,拟合算法选用Levenberg-Marquardt,结果与origin拟合结果一致。Matlab中具有强大的矩阵运算功能,容易实现。本文软件在qt creator下实现则调用了Eigen矩阵库,进行矩阵操作。

    1、qt creator下加载Eigen库过程

    Eigen官网http://eigen.tuxfamily.org/index.php?title=Main_Page下载Eignen库,解压并命名eigen3,将其放在工程文件下,在头文件中包含即可。

    #include <eigen3/Eigen/Dense>
    #include <eigen3/Eigen/Sparse>

    2、Levenberg-Marquardt算法

    参考链接:https://blog.csdn.net/stihy/article/details/52737723

    .h代码如下:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include <QMainWindow>
    #include <eigen3/Eigen/Dense>
    #include <eigen3/Eigen/Sparse>
    #include <math.h>
    #include <iomanip>
    #include <QDebug>
    using namespace Eigen;
    namespace Ui {
    class MainWindow;
    }
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        double maxMatrixDiagonale(const MatrixXd &Hessian);
        double linerDeltaL(const VectorXd& step, const VectorXd& gradient, const double u);
        void levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params);
        double Func(const VectorXd& obj);
        VectorXd objF(const VectorXd& input, const VectorXd& output, const VectorXd& params);
        double func(const VectorXd& input, const VectorXd& output, const VectorXd& params, double objIndex);
        MatrixXd Jacobin(const VectorXd& input, const VectorXd& output, const VectorXd& params);
        double Deriv(const VectorXd& input, const VectorXd& output, int objIndex, const VectorXd& params,
                         int paraIndex);
        ~MainWindow();
    
    
    private slots:
        void on_pushButton_matrix_clicked();
    
    
    private:
        Ui::MainWindow *ui;
    };
    
    
    #endif // MAINWINDOW_H

    cpp代码如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    #include<iostream>
    
    
    using namespace std;
    
    
    
    
    const double DERIV_STEP = 1e-5;
    const int MAX_ITER = 400;
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_pushButton_matrix_clicked()  //矩阵计算
    {
        /***********函数模型y=x1+x2*exp(-0.5 *((x-x3)/x4)*((x-x3)/x4))***********/
            VectorXd  params_levenMar(4);            //高斯函数
            params_levenMar(0) = 494.5472;
            params_levenMar(1) = 44.3528;
            params_levenMar(2) = 17;
            params_levenMar(3) = 2;
    
    
    
    
            double m[27] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27};
    
    
            double y[27] = {494.5472,494.6084,494.8052,495.2096,495.872,497.08,499.3508,502.1232,505.9028,510.85,516.218,521.6704,527.1972,532.0016,535.6004,537.9836,538.9,538.7624,537.606,535.7508,533.7564,531.7208,529.8448,528.3388,527.2388,526.498,526.2584 };
    
    
            //generate random data using these parameter
            int total_data = 27;
    
    
            VectorXd input(total_data);
            VectorXd output(total_data);
    
    
    
    
            //load observation data
            for (int i = 0; i < total_data; i++)
             {
                  input(i) = m[i];
                  output(i) = y[i];
             }
    
    
    
    
               levenMar(input, output, params_levenMar);
               cout << "Levenberg-Marquardt parameter: " << endl << params_levenMar << endl << endl << endl;
    }
    
    
    double MainWindow::maxMatrixDiagonale(const MatrixXd &Hessian)
    {
        int max = 0;
        for(int i = 0; i < Hessian.rows(); i++)
        {
            if(Hessian(i,i) > max)
                max = Hessian(i,i);
        }
    
    
        return max;
    }
    
    
    double MainWindow::linerDeltaL(const VectorXd &step, const VectorXd &gradient, const double u)
    {
    
    
        double L = step.transpose() * (u * step - gradient);
        return L/2;
    }
    
    
    void MainWindow::levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params)
    {
       // int errNum = input.rows();      //error num
        int paraNum = params.rows();    //parameter num
    
    
        //initial parameter
    
    
        VectorXf obj = objF(input,output,params);
    
    
        MatrixXf Jac = Jacobin(input, output, params);  //jacobin
    
    
        MatrixXf A = Jac.transpose() * Jac;             //Hessian
        VectorXd gradient = Jac.transpose() * obj;      //gradient
    
    
        //initial parameter tao v epsilon1 epsilon2
        double tao = 1e-3;
        long long v = 2;
        double eps1 = 1e-12, eps2 = 1e-12;
        double u = tao * maxMatrixDiagonale(A);
        bool found = gradient.norm() <= eps1;
        if(found) return;
    
    
       // double last_sum = 0;
        int iterCnt = 0;
    
    
       while (iterCnt < MAX_ITER)
        {
            VectorXd obj = objF(input,output,params);
    
    
            MatrixXd Jac = Jacobin(input, output, params);  //jacobin
            MatrixXd A = Jac.transpose() * Jac;             //Hessian
            VectorXd gradient = Jac.transpose() * obj;      //gradient
    
    
            if( gradient.norm() <= eps1 )
            {
                cout << "stop g(x) = 0 for a local minimizer optimizer." << endl;
                break;
            }
    
    
            cout << "A: " << endl << A << endl;
    
    
            VectorXd step = (A + u * MatrixXd::Identity(paraNum, paraNum)).inverse() * gradient; //negtive Hlm.
    
    
            cout << "step: " << endl << step << endl;
    
    
            if( step.norm() <= eps2*(params.norm() + eps2) )
            {
                cout << "stop because change in x is small" << endl;
                break;
            }
    
    
            VectorXd paramsNew(params.rows());
            paramsNew = params - step; //h_lm = -step;
    
    
            //compute f(x)
            obj = objF(input,output,params);
    
    
            //compute f(x_new)
            VectorXd obj_new = objF(input,output,paramsNew);
    
    
            double deltaF = Func(obj) - Func(obj_new);
            double deltaL = linerDeltaL(-1 * step, gradient, u);
    
    
            double roi = deltaF / deltaL;
            cout << "roi is : " << roi << endl;
            if(roi > 0)
            {
                params = paramsNew;
                u *= max(1.0/3.0, 1-pow(2*roi-1, 3));
                v = 2;
            }
            else
            {
                u = u * v;
                v = v * 2;
            }
    
    
            cout << "u = " << u << " v = " << v << endl;
    
    
            iterCnt++;
            cout << "Iterator " << iterCnt << " times, result is :" << endl << endl;
        }
    }
    
    
    double MainWindow::Func(const VectorXd &obj)
    {
          return obj.squaredNorm()/2;
    }
    
    
    //return vector make up of func() element.
    VectorXd  MainWindow::objF(const VectorXd& input, const VectorXd& output, const VectorXd& params)
    {
        VectorXd obj(input.rows());
        for(int i = 0; i < input.rows(); i++)
            obj(i) = func(input, output, params, i);
    
    
        return obj;
    }
    
    
    double  MainWindow::func(const VectorXd& input, const VectorXd& output, const VectorXd& params, double objIndex)
    {
        double x1 = params(0);
        double x2 = params(1);
        double x3 = params(2);
        double x4 = params(3);
    
    
        double t = input(objIndex);
        double f = output(objIndex);
       // return x1*exp(-x2 * t)+x3 - f;       //返回误差
        return x2*exp(-0.5 *((t-x3)/x4)*((t-x3)/x4))+x1 -f;
    
    
       // return x1 * sin(x2 * t) + x3 * cos( x4 * t) - f;
    }
    /***************求雅克比矩阵*********************/
    MatrixXd  MainWindow::Jacobin(const VectorXd& input, const VectorXd& output, const VectorXd& params)
    {
        int rowNum = input.rows();
        int colNum = params.rows();
    
    
        MatrixXd Jac(rowNum, colNum);
    
    
        for (int i = 0; i < rowNum; i++)
        {
            for (int j = 0; j < colNum; j++)
            {
                Jac(i,j) = Deriv(input, output, i, params, j);
            }
        }
        return Jac;
    }
    double MainWindow::Deriv(const VectorXd& input, const VectorXd& output, int objIndex, const VectorXd& params,
                     int paraIndex)
    {
         VectorXd para1 = params;
         VectorXd para2 = params;
    
    
         para1(paraIndex) -= DERIV_STEP;
         para2(paraIndex) += DERIV_STEP;
    
    
         double obj1 = func(input, output, para1, objIndex);
         double obj2 = func(input, output, para2, objIndex);
    
    
         return (obj2 - obj1) / (2 * DERIV_STEP);
    }

     

    转载于:https://www.cnblogs.com/siyecao0314/p/9003839.html

    展开全文
  • Matlab中用fit做曲线拟合

    千次阅读 2019-10-01 09:20:10
    1.确定要拟合的类型  一般情况下matlab会直接提供常用的类型,用fittype创建拟合模型。至于matlab具体提供了哪些模型,参见帮助"List ... %高斯拟合  如果库中没有自己想要的拟合形式,可以自己进行定义,此时...
  • 而化学分析中,有许多具有明确物理意义的二维谱图,图光谱、色谱等,其信号峰位置、峰高、峰宽等均具有实际物理意义,因此,提出使用高斯曲线进行数据拟合和表征。 高斯函数仅适用于对称谱图,其简图如下: 假设...
  • 项目需要拟合曲线,使用java实现。采用了apache-commons-math3实现自定义的曲线。作为apache开源的搞数学计算的超强的库,一直不受市场重视。为啥呢?经过研究,使用java这个强制数据类型的语言搞数学计算真是不好玩...
  • 最小二乘曲线拟合matlab实现

    千次阅读 2016-11-23 14:57:29
    曲线拟合[1]是一种常用的模型拟合方法,经常用在相机标定或其它传感器标定上。对于加性高斯噪声,最小二乘通常是一种最优的估计方法(PS:当外点存在时,通常可以采用其它robust estimator 或者采用ransac进行拟合...
  • 最小二乘法高斯曲线拟合,基于最小二乘法拟合高斯曲线,(Least squares Gaussian curve fitting )
  • GPR神经网络m文件 用以处理处理数据集包括数据获取 数据处理 数据保存 plot图绘制,计算0.95的置信区间,多次求解 寻找平均曲线 得到拟合的数据曲线 代码有效完整
  • 1、拟合参数精度不够,导致拟合曲线计算的输出值与原函数值相差较大,比如高斯拟合时峰值位置偏移较大。 这时我们可将拟合的模型保存到工作空间(save xxfit to workspace),在命令窗口中输入‘coeffvalues(xxfit ...
  • 首先明确俩概念:插值和拟合。两者最根本的共同点都是基于现有数据进行预测、推演,比如根据现有的天文观测数据预测天体位置。插值问题是数学史上的经典问题,拉格朗日、高斯、牛顿等著名数学家均有所研究。插值的...
  • matlab拟合工具简介

    千次阅读 2014-09-28 09:08:26
    matlab命令行里输入cftool命令可以打开图形化曲线拟合工具箱,能够提供多项式函数、指数函数、高斯函数、正弦函数、幂函数等多种形式的拟合。用户只需要输入拟合数据、指定函数形式,工具箱就可以自动计算出拟合...
  • matlab开发-自高斯分布

    2019-11-17 02:35:49
    matlab开发-自高斯分布。将1D/2D高斯或Gabor拟合曲线/曲面而无需开始猜测参数
  • 时间:2017-03-16 20:30:20声明:欢迎被转载,记得注明出处~前言本文为曲线与分布拟合的一部分,主要介绍正态分布、拉普拉斯分布等常用分布拟合的理论推导以及代码实现。一、理论推导假设数据独立同分布。对于任意...
  • matlab开发-gaussiancurvefit。高斯曲线拟合
  • matlab开发-fitgaussian

    2019-08-24 07:56:10
    matlab开发-fitgaussian。将高斯曲线拟合到数据
  • matlab开发-Gaussianfit

    2019-08-23 09:45:54
    matlab开发-Gaussianfit。将高斯曲线拟合为点。曲线被理解为概率密度函数,pdf。
  • matlab开发-fit1d和2dgaussiantoisydata。将一维和二维高斯曲线拟合到噪声数据的示例例程。
  • 函数逼近与曲线(面)拟合:曲线拟合的线性最小二乘法及其MATLAB程序,多项式拟合及其MATLAB程序, 拟合曲线的线性变换及其MATLAB程序,函数逼近及其MATLAB程序,三角多项式逼近及其MATLAB程序, 随机数据点上的二元...
  • % curvefit - 曲线拟合 % caspe - 各种边界条件的样条插值 % casps - 样条拟合 % interp2 - 二元函数插值 % griddata - 不规则数据的二元函数插值 % *interp - 不单调节点插值 % *lagrange - 拉格朗日插值法 % % ...
  • Matlab学习小记

    千次阅读 2011-01-28 13:18:00
    大部分文章所写的公式和Matlab里面的高斯公式相同,再加上一个断面有两个方向的开挖,所以,拟合曲线就应该是两个高斯公式叠加(至少我是这么认为的,也没问导师。于是,我决定在Matlab的环境下来编写这个程序,以前...
  • MATLAB数学建模工具箱

    热门讨论 2013-05-20 15:06:10
    % curvefit - 曲线拟合 % caspe - 各种边界条件的样条插值 % casps - 样条拟合 % interp2 - 二元函数插值 % griddata - 不规则数据的二元函数插值 % *interp - 不单调节点插值 % *lagrange - 拉格朗日插值法 % % ...
  • Matlab数学建模工具箱

    热门讨论 2010-03-15 12:14:21
    % curvefit - 曲线拟合 % caspe - 各种边界条件的样条插值 % casps - 样条拟合 % interp2 - 二元函数插值 % griddata - 不规则数据的二元函数插值 % *interp - 不单调节点插值 % *lagrange - 拉格朗日插值法 % % ...
  • S形弯曲波导是集成光器件中不可缺少的部分。对比分析了常见不同形状的S 形光波导的传输损耗,找到了低损耗的余弦形状。在Marcuse 弯曲波导研究的基础...结果表明,高斯曲线拟合方法可以更好地描述余弦形状波导的损耗。
  • Matlab基本操作回顾(二)——工具箱

    千次阅读 2019-01-23 21:46:06
    1. 曲线拟合工具箱 工具箱提供的拟合类型有: Custom Equations:用户自定义的函数类型 Exponential:指数逼近,有2种类型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x) Fourier:傅立叶逼近,有7种类型...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

matlab高斯曲线拟合

matlab 订阅