数据分析:R、Python与MATLAB曲线拟合(非线性回归)技巧

更新:11-20 名人轶事 我要投稿 纠错 投诉

各位老铁们好,相信很多人对数据分析:R、Python与MATLAB曲线拟合(非线性回归)技巧都不是特别的了解,因此呢,今天就来为大家分享下关于数据分析:R、Python与MATLAB曲线拟合(非线性回归)技巧以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

【R】 basicTrendline

一个R 包,用于添加基本线性或非线性模型的趋势线和置信区间,并显示要绘制的方程。

作者如下所示。

首先安装并导入basicTrendline。

install.packages("basicTrendline")

库(basicTrendline)准备数据。

# 准备数据

x=c(6.9627,0.9382,5.2540,5.3034,8.6114,4.8485,3.9346,6.7143,7.4126,5.2005)

y1=c(3.4771,1.5000,5.8609,2.6215,0.4445,7.5493,2.4279,4.4240,6.8780,3.5923)

y2=c(7.3634,3.9471,6.8342,7.0405,4.4231,0.1958,3.3086,4.2431,2.7027,1.9705)

y3=c(8.2172,4.2992,8.8777,3.9118,7.6911,3.9679,8.0851,7.5508,3.7740,2.1602) 目前basicTrendline 提供以下模型。您可以选择您需要的型号进行拟合。

"line2P"(公式as: y=a*x+b)

"line3P" (y=a*x^2+b*x+c)

"log2P" (y=a*ln(x)+b)

"exp2P" (y=a*exp(b*x))

"exp3P" (y=a*exp(b*x)+c)

"power2P" (y=a*x^b)

"power3P" (y=a*x^b+c) 通过trenline函数,我们只需一行代码就可以实现从指定拟合模型、计算拟合结果到绘制图像的整个过程。其中,x和y1是我们的数据,要拟合的模型为y=ax^2+bx+c,因此模型指定为line3P。其余参数的含义可以通过在控制台窗口中输入?basicTrendline来查看。

p1- 趋势线(x, y1,

型号="line3P",

线条颜色="红色",

CI.颜色=NA,

科尔="红色",

xlim=c(0,10),ylim=c(0,10),

xlab="",ylab="")得到的结果如下。

拨打:

lm(公式=y ~ I(x^2) + x)

残差:

最小1Q 中值3Q 最大

-2.16329 -1.58546 -0.19904 0.92208 3.22242

系数:

估计标准。误差t值Pr(|t|)

(截距)-0.85000 3.03927 -0.2797 0.7878

I(x^2) -0.21556 0.12464 -1.7295 0.1274

2.20569 1.24217 1.7757 0.1190

7 个自由度上的残余标准误差: 2.1754

多重R-squared: 0.31098,调整R-squared: 0.11412

2 和7 DF 上的F 统计量: 1.5797,p 值: 0.27153

N: 10、AIC: 48.356、BIC: 49.566

Residual Sum of Squares: 33.125 绘制的图像如下。趋势线功能默认会在图像上显示拟合公式、R方和p值,非常直观。

也可以在同一张画布上绘制多个拟合结果。完整代码如下。 par(new=TRUE)的功能与MATLAB中的hold on类似。由于不同数据的拟合公式、R方、p值会重叠,不够美观,所以我们将show.equation、show.Rsquare、show.pvalue这三个参数的值设置为FALSE 。

# install.packages("basicTrendline")

库(基本趋势线)

# 准备数据

x=c(6.9627,0.9382,5.2540,5.3034,8.6114,4.8485,3.9346,6.7143,7.4126,5.2005)

y1=c(3.4771,1.5000,5.8609,2.6215,0.4445,7.5493,2.4279,4.4240,6.8780,3.5923)

y2=c(7.3634,3.9471,6.8342,7.0405,4.4231,0.1958,3.3086,4.2431,2.7027,1.9705)

y3=c(8.2172,4.2992,8.8777,3.9118,7.6911,3.9679,8.0851,7.5508,3.7740,2.1602)

p1- 趋势线(x, y1,

型号="line3P",

线条颜色="红色",

CI.颜色=NA,

科尔="红色",

xlim=c(0,10),ylim=c(0,10),

xlab="",ylab="",

显示.方程=F,

显示.Rsquare=F,

显示.p值=F)

帕(新=真)

p2- 趋势线(x, y2,

型号="line3P",

linecolor="绿色",

CI.颜色=NA,

col="绿色",

xlim=c(0,10),ylim=c(0,10),

xlab="",ylab="",

显示.方程=F,

显示.Rsquare=F,

显示.p值=F)

帕(新=真)

p3- 趋势线(x, y3,

型号="line3P",

线条颜色="蓝色",

CI.颜色=NA,

科尔="蓝色",

xlim=c(0,10),ylim=c(0,10),

xlab="",ylab="",

显示.方程=F,

显示.Rsquare=F,

show.pvalue=F) 得到的结果如下。

用户体验:非常方便,比通过nls函数写代码方便多了。

参考

https://github.com/PhDMeiwp/basicTrendlinehttps://cran.r-project.org/web/packages/basicTrendline/basicTrendline.pdf

【Python】scipy.optimize.curve_fit

使用非线性最小二乘法将函数f 拟合到数据。

这是scipy库中的函数,其用法与R语言中的nls函数类似。为了方便数据组织和绘图,我们还需要用到numpy和matplotlib这两个库的功能。

首先导入需要的模块(如果没有安装,需要先安装模块)并准备数据。

将numpy 导入为np

将matplotlib.pyplot 导入为plt

从scipy.optimize 导入curve_fit

# 准备数据

x=np.array([6.9627,0.9382,5.2540,5.3034,8.6114,4.8485,3.9346,6.7143,7.4126,5.2005])

y1=np.array([3.4771,1.5000,5.8609,2.6215,0.4445,7.5493,2.4279,4.4240,6.8780,3.5923])

y2=np.array([7.3634,3.9471,6.8342,7.0405,4.4231,0.1958,3.3086,4.2431,2.7027,1.9705])

y3=np.array([8.2172,4.2992,8.8777,3.9118,7.6911,3.9679,8.0851,7.5508,3.7740,2.1602]) 然后以函数的形式准备你想要拟合的模型。

# 模型函数

def func(x, a, b, c):

return a*x**2 + b*x + c # x**2==x^2 定义好模型后,我们可以通过curve_fit 函数来调用这个模型,popt, pcov=curve_fit(func, x, y)意思是拟合数据x和y。拟合的模型为func,相应返回两个对象popt 和pcov。 popt是拟合结果中各个系数的值(本例中是a、b、c的值),pcov是拟合结果的估计协方差(估计协方差)。

因此,我们可以循环计算每组数据的拟合结果,并绘制拟合曲线。由于没有可以直接使用的函数,所以我得自己写代码(如果需要计算R平方什么的,就需要多写代码了……),整个代码如下。

将numpy 导入为np

将matplotlib.pyplot 导入为plt

从scipy.optimize 导入curve_fit

# 准备数据

x=np.array([6.9627, 0.9382, 5.2540, 5.3034, 8.6114, 4.8485, 3.9346, 6.7143, 7.4126, 5.2005])

y1=np.array([3.4771, 1.5000, 5.8609, 2.6215, 0.4445, 7.5493, 2.4279, 4.4240, 6.8780, 3.5923])

y2=np.array([7.3634, 3.9471, 6.8342, 7.0405, 4.4231, 0.1958, 3.3086, 4.2431, 2.7027, 1.9705])

y3=np.array([8.2172, 4.2992, 8.8777, 3.9118, 7.6911, 3.9679, 8.0851, 7.5508, 3.7740, 2.1602])

# 模型函数

def func(x, a, b, c):

返回a * x ** 2 + b * x + c # x**2==x^2

# 拟合模型图

y 数据=[y1, y2, y3]

颜色=["r", "g", "b"]

对于范围内的i(0, len(ydata)):

y=y数据[i]

popt, pcov=curve_fit(func, x, y)

# 利用数据绘制曲线

数据=np.sort(np.array([x, y]), axis=1)

阴谋

plt.scatter(x, y, color=color[i]) # 原始数据

plt.plot(data[0], func(data[0], *popt), # 曲线

颜色=颜色[i],

标签="fit: a=%5.3f, b=%5.3f, c=%5.3f" % tuple(popt))

plt.axis([0, 10, 0, 10]) # x y 轴的范围

plt.图例()

plt.show()得到的结果如下。拟合结果中每个系数的值都用图例标记。

参考

https://docs.scipy.org/doc/scipy-1.6.2/reference/generated/scipy.optimize.curve_fit.html?highlight=curve_fit#scipy.optimize.curve_fit

【MATLAB】 Curve Fitting Toolbox

曲线拟合工具箱提供了用于拟合曲线和曲线的应用程序和函数表面到数据。

首先,在MATLAB中的APP栏中点击下图所示的选项,搜索并安装曲线拟合工具箱。

这个工具的优点是有傻瓜式的图形界面。您可以通过点击APP栏中的以下选项来打开该界面。

然后可以分析数据。注意数据必须是单列的array。在左上区域选择要拟合的数据,在中上区域选择要拟合的模型,下面会给出拟合结果。

事实上,Curve Fitting Toolbox 由一个应用程序(即上述图形界面)和许多功能组成。应用程序也通过调用该工具箱中的函数来完成相应的任务。我们可以通过下图所示的“生成代码”选项来生成相应的代码来学习如何使用Toolbox功能。

另外,有些操作在app中很难完成,所以需要我们自己编写代码。例如,现在让我们尝试拟合三个数据:x和y1、x和y2、x和y3,并将这三个拟合曲线绘制到同一个图中。

首先准备数据。

% 准备数据

x=[6.9627;0.9382;5.2540;5.3034;8.6114;4.8485;3.9346;6.7143;7.4126;5.2005];

y1=[3.4771;1.5000;5.8609;2.6215;0.4445;7.5493;2.4279;4.4240;6.8780;3.5923];

y2=[7.3634;3.9471;6.8342;7.0405;4.4231;0.1958;3.3086;4.2431;2.7027;1.9705];

y3=[8.2172;4.2992;8.8777;3.9118;7.6911;3.9679;8.0851;7.5508;3.7740;2.1602];然后,我们可以调用fittype函数来设置我们想要拟合的模型。当然,如果Curve Fitting Toolbox的选项中已经存在模型,则不需要fittype,直接在fit中指定即可。我们这里设置的拟合模型是y=ax^2 + bx + c。

% 设置适合类型

ft=fittype( {"x^2", "x", "1"}, "独立", "x", "相关", "y", "系数", {"a", "b", " c"} );然后就可以调用fit函数来生成拟合结果了。这里调用了三个参数:x、y、ft(即需要拟合的模型)。曲线是一个cfit 对象。 gof 指的是拟合优度。 gof 的导出对象不是必需的。如果我们不需要检查拟合效果,则不需要导出gof。

% 将模型拟合到数据

[曲线1,gof1]=fit(x,y1,ft);

curve2=fit(x,y2,ft);

curve3=fit(x,y3,ft);您可以在命令行窗口中输入curve1和gof1来查看拟合结果。

曲线1

曲线1=

线性模型:

曲线1(x)=a*x^2 + b*x + c

系数(95% 置信区间):

a=-0.2156 (-0.5103, 0.07917)

b=2.206 (-0.7316, 5.143)

c=-0.85 (-8.037, 6.337)

高尔夫1

戈夫1=

struct: 包含以下字段

sse: 33.1255

rsquare: 0.3110

dfe: 7

adjrsquare: 0.1141

rmse: 2.1754下一步是绘图。依次绘制拟合曲线和散点图。以p1为例,这里实际上画了两张图,一张是curve1,也就是拟合曲线,一张是x1和y1的散点图。我们在同一个图中一共画了六个图形。

% 绘图与数据拟合

关闭所有;

p1=绘图(曲线1,x,y1,".");

坚持,稍等;

p2=绘图(曲线2,x,y2,".");

p3=plot(curve3,x,y3,".");第二个是设置颜色。有三种方式,分别是RGB值(0到1之间)、MATLAB中的颜色代码、十六进制颜色代码。

% 设置颜色

设置(p1,"颜色",[.5 .4 .7]);

设置(p2,"颜色","m");

set(p3,"color","#0076a8");其他一些与绘图相关的设置。

% 其他一些绘图参数

盒子关闭;

legend([p1(1),p2(1),p3(1)],"data1","data2","data3","位置","东北");

设置(gca, "XLim", [0, 10]);

设置(gca,"YLim", [0, 10]);

xlabel("x轴标签");

ylabel("y 轴标签");

title("这是标题");结果如下。

整个代码如下。

% 准备数据

x=[6.9627;0.9382;5.2540;5.3034;8.6114;4.8485;3.9346;6.7143;7.4126;5.2005];

y1=[3.4771;1.5000;5.8609;2.6215;0.4445;7.5493;2.4279;4.4240;6.8780;3.5923];

y2=[7.3634;3.9471;6.8342;7.0405;4.4231;0.1958;3.3086;4.2431;2.7027;1.9705];

y3=[8.2172;4.2992;8.8777;3.9118;7.6911;3.9679;8.0851;7.5508;3.7740;2.1602];

% 设置健身

ft=fittype( {"x^2", "x", "1"}, "独立", "x", "相关", "y", "系数", {"a", "b", " c"});

% 将模型拟合到数据

[曲线1,gof1]=fit(x,y1,ft);

curve2=fit(x,y2,ft);

curve3=fit(x,y3,ft);

% 绘图与数据拟合

关闭所有;

p1=绘图(曲线1,x,y1,".");

坚持,稍等;

p2=绘图(曲线2,x,y2,".");

p3=绘图(曲线3,x,y3,".");

% 设置颜色

设置(p1,"颜色",[.5 .4 .7]);

设置(p2,"颜色","m");

设置(p3,"颜色","#0076a8");

% 其他一些绘图参数

盒子关闭;

legend([p1(1),p2(1),p3(1)],"data1","data2","data3","位置","东北");

设置(gca, "XLim", [0, 10]);

设置(gca,"YLim", [0, 10]);

xlabel("x轴标签");

ylabel("y 轴标签");

title("这是标题");参考文献

https://www.mathworks.com/help/releases/R2019a/curvefit/interactive-curve-and-surface-fitting-.html?container=jshelpbrowserhttps://ww2.mathworks.cn/help/curvefit/interactive-fit-comparison.html#brz3gbuhttps://ww2.mathworks .cn/help/curvefit/compare-fits-programmatically.htmlhttps://www.mathworks.com/matlabcentral/answers/151011-how-to-plot-a-line-of-a-certain-color

小结

三种不同的获取方式结果是一样的(见下图蓝色框)。在此示例中,我们尝试拟合的模型是y=ax+bx^2+c。当a大于0时,拟合出U形曲线。当a小于0时,变为倒U型曲线。为此,我们可以指定a 的区间来阐明我们想要拟合的模型。例如,在Curve Fitting Toolbox 中,可以使用fitoptions 函数来修改间隔。具体代码以及修改区间后的结果如下。此时拟合出一条U型曲线,即系数a的下限为0(按照这个逻辑,对于反U型曲线,只需将公式设置为y=-ax+ bx^2+c,a的区间是正值我不知道这样理解是否希望懂的人告诉我)%设置fittyle。

关于数据分析:R、Python与MATLAB曲线拟合(非线性回归)技巧,的介绍到此结束,希望对大家有所帮助。

用户评论

残留の笑颜

这篇文章讲的是曲线拟合吧?我一直想学习一下

    有13位网友表示赞同!

走过海棠暮

非线性回归太厉害了,能做出各种复杂形状的曲线

    有20位网友表示赞同!

情如薄纱

最近在学R做数据分析,不知道怎么学到非线性回归,有推荐吗?

    有15位网友表示赞同!

妄灸

python也支持非线性回归? 挺棒的!

    有15位网友表示赞同!

像从了良

MATLAB的绘图功能一直很强大,做曲线拟合应该也不错呢

    有5位网友表示赞同!

放血

非线性回归有很多应用场景吧,比如预测股票价格、气温变化等

    有5位网友表示赞同!

念旧是个瘾。

学习了非线性回归,能分析很多更复杂的现象吧!

    有10位网友表示赞同!

歆久

想要找合适的数学函数来拟合曲线,这确实是个挑战任务啊

    有18位网友表示赞同!

念安я

这个标题看起来很专业,我得仔细看看文章内容

    有9位网友表示赞同!

罪歌

R,Python 和 MATLAB 都比较常用吧? 在学习上应该互为补充

    有11位网友表示赞同!

■孤独像过不去的桥≈

感觉非线性回归一定非常有用,我要去学习一下!

    有15位网友表示赞同!

毒舌妖后

这篇文章正好可以帮助我解决一些实际项目中遇到的问题

    有11位网友表示赞同!

熟悉看不清

非线性回归的原理看起来有点复杂,需要花时间慢慢理解

    有9位网友表示赞同!

烬陌袅

期待文章能详细讲解不同软件做非线性回归的方法

    有14位网友表示赞同!

残花为谁悲丶

学习曲线拟合,感觉可以用到很多领域

    有10位网友表示赞同!

别在我面前犯贱

我想了解一下非线性回归的评估方法,比如哪个指标更为常用?

    有10位网友表示赞同!

怅惘

除了这些软件,还有其他的工具可以用来做曲线拟合吗?

    有20位网友表示赞同!

瑾澜

我要去搜下相关资料,学习一下非线性回归的应用案例

    有8位网友表示赞同!

微信名字

这个标题让我对非线性回归产生了浓厚兴趣

    有10位网友表示赞同!

坠入深海i

看来我得学习一下MATLAB了!它看起来很强大!

    有15位网友表示赞同!

【数据分析:R、Python与MATLAB曲线拟合(非线性回归)技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:深入了解NPM使用技巧及CNPM的优势与应用 下一篇:习惯的力量:凑合与不凑合的差异解析!