在Python lmfit中使用多个自变量

问题描述 投票:1回答:2

我试图将模型拟合到一些数据。自变量称为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,我不能简单地“包装”自己的变量,如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并不是真的有用 - 我首先要做什么?

python lmfit
2个回答
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阵列以及坐标。例如,让我们保持模型不变。我们需要创建新的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
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.