在Python的lmfit中使用多个独立变量

3
我正在尝试将模型拟合到一些数据上。自变量称为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())

今日免费次数已满, 请开通会员/明日再来
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并没有什么帮助——我需要首先压平什么内容?请注意保留原有的HTML标签格式。
2个回答

2

我创建了一个完整的、带有两个独立变量的工作示例:

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

2

首先,使用具有多个自变量的函数创建一个模型。例如,

最初的回答
def random_func(x,y,a,b,c):
    return a*x**3+b*y**2+c

其次,在公式中指定哪些是自变量。例如,将“Original Answer”翻译成“最初的回答”。
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)

那基本上和我的答案差不多,但是没错,那个方法有效。 - slhck
1
抱歉,我对Python还不熟悉,在您的代码中遇到了'panda'包,所以没有仔细阅读。但是当有两个独立变量时,拟合实际上无法正常运行...我现在正在尝试缩小所有参数的范围,希望能够得到一个好的拟合结果。 - Echt-Drei-sonne-person
你的 z 的大小(或形状)是什么?如果 z 已经是一维的,例如,我有类似于表面 z=f(x,y) 的数据,那么我的 z 的大小将与 x 或 y 中的任一个相同。 另外一条评论:似乎现在是 numpy.ndarray.flatten,当我使用 flatten_data() 时返回错误。 - tetukowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接