【问题标题】:Using multiple independent variables in Python lmfit在 Python lmfit 中使用多个自变量
【发布时间】:2015-09-22 10:03:14
【问题描述】:

我正在尝试为某些数据拟合模型。自变量称为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


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 这和我的回答差不多,但是是的,这行得通。
    • 对不起,我是 python 新手,在你的“熊猫”包中迷路了,我没有仔细阅读你的代码。但是有两个自变量,拟合实际上并不能正常运行......我现在正在尝试缩小所有参数的范围,希望可以有一个很好的拟合。
    【解决方案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() 中将所有变量指定为关键字参数。

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2016-02-15
      相关资源
      最近更新 更多