我正在尝试将模型与某些数据相匹配。自变量称为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
,我不能简单地使用{" 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并不是真的有用 - 我首先要做的是什么呢?
答案 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()
中将所有变量指定为关键字参数。