2

我正在尝试使模型适合某些数据。自变量称为AB,它们是 Pandas DataFrame 中的列。我试图适应y数据框中的两个参数。

以前,使用curve_fitScipy,我可以这样做:

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()这里?常见问题解答并没有真正的帮助——我首先要展平什么?

4

2 回答 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 数组,以及坐标。例如,让我们保持模型不变。我们需要创建新的一维坐标数组。

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)
于 2019-01-31T17:57:46.730 回答
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().

于 2015-09-23T08:32:48.927 回答