Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python lmfit中使用多个独立变量_Python_Lmfit - Fatal编程技术网

在Python lmfit中使用多个独立变量

在Python lmfit中使用多个独立变量,python,lmfit,Python,Lmfit,我正在尝试将一个模型与一些数据相匹配。自变量称为A和B,它们是数据帧中的列。我试图在数据帧中针对y拟合两个参数 以前,使用Scipy提供的curve\u fit,我可以: def fun(X, p1, p2): A, B = X return np.exp(p1*A) + p2*B X = (df['A'].tolist(), df['B'].tolist()) popt, pcov = curve_fit(fun, X, df['y'].tolist()) 但是现在,我使用的是lm

我正在尝试将一个模型与一些数据相匹配。自变量称为
A
B
,它们是数据帧中的列。我试图在数据帧中针对
y
拟合两个参数

以前,使用Scipy提供的
curve\u fit
,我可以:

def fun(X, p1, p2):
  A, B = X
  return np.exp(p1*A) + p2*B

X = (df['A'].tolist(), df['B'].tolist())
popt, pcov = curve_fit(fun, X, df['y'].tolist())
但是现在,我使用的是
lmfit
,我不能简单地“打包”自变量,比如
curve\u fit

def fun(A, B, p1 = 1, p2 = 1):
  return np.exp(p1*A) + p2*B

model = Model(fun, independent_vars=['A', 'B'])

如何在此处运行
model.fit()
?首先,我需要展平什么?我创建了一个完整的工作示例,其中包含两个独立变量:

import pandas as pd
import numpy as np
from lmfit import Model

df = pd.DataFrame({
  'A'      : pd.Series([1, 1, 1, 2, 2, 2, 2]),
  'B'      : pd.Series([5, 4, 6, 6, 5, 6, 5]),
  'target' : pd.Series([87.79, 40.89, 215.30, 238.65, 111.15, 238.65, 111.15])
})

def fun(A, B, p1 = 1, p2 = 1):
  return p1 * np.exp(A) + p2 * np.exp(B)

model = Model(fun, independent_vars=['A', 'B'])
fit = model.fit(df['target'], A = df['A'], B = df['B'])

技巧是将所有变量指定为
fit()

中的关键字参数。首先,使用多个自变量的函数创建一个模型。 比如说,

def random_func(x,y,a,b,c):
    return a*x**3+b*y**2+c
其次,指定公式中的自变量。 比如说,

from lmfit import Model

model = Model(random_func,independent_vars=['x','y'])
model.set_param_hint('a',value=2)
model.set_param_hint('b',value=3)
model.set_param_hint('c',value=4)
第三,为模型设置参数

比如说,

from lmfit import Model

model = Model(random_func,independent_vars=['x','y'])
model.set_param_hint('a',value=2)
model.set_param_hint('b',value=3)
model.set_param_hint('c',value=4)
最后,设置x轴值和y轴值。做合适的 像这样,

x = np.arange(0,2,0.1)
y = np.arange(0,2,0.1)
z = np.loadtxt('filename')
事实上,直接配合并不奏效。二维数据数组以及坐标必须展平为一维数组。例如,让我们保持模型不变。我们需要创建新的一维坐标阵列

x1d = []
y1d = []
for i in x:
    for j in y:
        x1d = x1d.append(i)
        y1d = y1d.append(j)
z1d = z.flatten_data()
result = model.fit(z1d, x = x1d, y = y1d)

这与我的答案大致相同,但是是的,这是有效的。很抱歉,我是python新手,在您的“panda”软件包中迷失了方向,因为我没有仔细阅读您的代码。但由于有两个自变量,拟合实际上运行不正常。。。我正在努力缩小所有参数的范围,希望能有一个很好的拟合。