我试图将模型拟合到一些数据。自变量称为A
和B
,它们是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并不是真的有用 - 我首先要做什么?
首先,使用多个自变量的函数创建模型。例如,
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)
我创建了一个包含两个独立变量的完整的工作示例:
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()
中将所有变量指定为关键字参数。