【问题标题】:Fitting multiple data sets using scipy.optimize with the same parameters使用具有相同参数的 scipy.optimize 拟合多个数据集
【发布时间】:2015-07-29 17:57:43
【问题描述】:

我正在尝试编写适合具有相同参数的多个 (>100) 数据集的代码。

举个简单的例子:

假设我有 4 个不同的数据集,它们应该近似地遵循函数 y(x)=A*Sin(bx+c)+dx。它们都具有相同的参数 a、b 和 d。唯一不同的参数是 c(相位),但对于每个数据集,我确切地知道 c 应该是什么。

现在我想同时拟合所有 4 个函数,并得到一组拟合参数 a、b 和 d。

这里我写了一个代码,分别适合每个函数,并给了我 4 组不同的参数,这不是我想要的。

提前感谢您的帮助。

from scipy import optimize
import matplotlib
from matplotlib import pyplot as plt
from scipy import *

Mat_ydata=[]
Mat_angle=[]
Mat_xdata=[]

定义拟合函数

def sin_func(x,a,b,c,d):
   return a*sin(b*x+c)+d*x

生成一些数据:4 个正弦函数,具有相同的幅度、频率和线性偏移,但每个都有不同的相位,我们已经知道了。此外,每个都定义在不同的范围内。函数的 x 和 y 坐标存储在列表 Mat_ydata 和 Mat_xdata 的列表中。相位存储在列表 Mat_phase 中

for phase in range(0,181,60):
    angle=float(phase)/180*pi
    num_points=phase+50
    xdata=linspace(num_points/10,num_points/5, num_points)
    ydata=2.11*sin(pi/2*xdata+angle)+3.16*xdata+2*((0.5-rand(num_points))*exp(2*rand(num_points)**2))
    Mat_angle.append(angle)
    Mat_ydata.append(ydata)
    Mat_xdata.append(xdata)

这里很合适。我现在分别拟合每个函数,因此为每个函数获得不同的相位、幅度和线性偏移值。我想把它们放在一起。最后,我还绘制了数据和拟合。

for i in range(0,len(Mat_angle)):
    fitfunc = lambda p, x: sin_func(x,p[0],p[1],Mat_angle[i],p[2])
    errfunc = lambda p, x, y: fitfunc(p, x) - y 
    p0 = [2,1.5,3] 
    p1, success = optimize.leastsq(errfunc, p0[:], args=(Mat_xdata[i], Mat_ydata[i]))
    print p1
    plt.plot(Mat_xdata[i],Mat_ydata[i],'o',Mat_xdata[i],fitfunc(p1,Mat_xdata[i]),'-')
plt.show()

【问题讨论】:

  • 你能把4个数据集合并成一个大的,然后拟合吗?

标签: python


【解决方案1】:

我实际上是在过去几天里弄明白的。我将提供代码以防任何人感兴趣。我还发现拟合正弦函数非常困难,所以我将我的假数据更改为 Lorentzians。

导入模块并生成假数据,这些数据将保存在列表列表中:

from scipy import optimize
import matplotlib
from matplotlib import pyplot as plt
from scipy import *
import numpy as np


Mat_ydata=[]
Mat_angle=[]
Mat_xdata=[]

for c in range(0,100,20):
    num_points=c+100
    xdata=linspace(0,num_points/2, num_points)
    ydata=5.1/((xdata-c)**2+2.1**2)+0.05*((0.5rand(num_points))*exp(2*rand(num_points)**2))
    Mat_angle.append(c)
    Mat_ydata.append(ydata)
    Mat_xdata.append(xdata)

定义拟合函数和误差函数:

def lor_func(x,c,par):
    a,b,d=par
    return a/((x-c)**2+b**2)

def err (p,c,x,y):
    return lor_func(x,c,p)-y

def err_global(p,Mat_a,Mat_x,Mat_y):
    err0=[]
    for i in range(0, len(Mat_a)):
        errc=err(p,Mat_a[i],Mat_x[i],Mat_y[i])
        err1=np.concatenate((err0,errc))
        err0=err1
    return err0

实际拟合和显示结果:

p_global=[1,1,1]
p_best,success=optimize.leastsq(err_global, p_global,args=(Mat_angle,Mat_xdata,Mat_ydata),maxfev=40000)
toplot=[]
for i in range(0,len(Mat_angle)):
    toplot.append(lor_func(Mat_xdata[i],Mat_angle[i],p_best))
err_toplot=err_global(p_best,Mat_angle,Mat_xdata,Mat_ydata)
print p_best

for i in range(0,len(Mat_angle)):
    plt.plot(Mat_xdata[i],Mat_ydata[i],'o',Mat_xdata[i],toplot[i],'-')
plt.show()

这是它显示的内容:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多