在Python lmfit中使用多个自变量

时间:2015-09-22 10:03:15

标签: python lmfit

我正在尝试将模型与某些数据相匹配。自变量称为AB,它们是Pandas DataFrame中的列。我试图在数据框中使用两个参数y

以前,使用Scipy的curve_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,我不能简单地使用{" pack"与curve_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()FAQ并不是真的有用 - 我首先要做的是什么呢?

2 个答案:

答案 0 :(得分:2)

首先,创建一个具有多个自变量功能的模型。 例如

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)

最后,设置您的x轴值和y轴。并适合 像这样

x = np.arange(0,2,0.1)
y = np.arange(0,2,0.1)
z = np.loadtxt('filename')

直接拟合实际上效果不好。必须将2D数据数组以及坐标平整为1D数组。例如,让模型保持原样。我们需要创建新的一维坐标数组。

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)

答案 1 :(得分:1)

我创建了一个包含两个独立变量的完整的工作示例:

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()中将所有变量指定为关键字参数。