【问题标题】:Multi-variable nonlinear regression with unequal length vectors具有不等长度向量的多变量非线性回归
【发布时间】:2018-01-24 15:50:20
【问题描述】:

我正在尝试将一些数据拟合到具有两个自变量的非线性模型中,但是两个自变量的向量长度是 xdat 小于 ydat

这与这个问题密切相关:Python curve_fit with multiple independent variables,但是xdatydat 的大小不同的要求似乎破坏了事情。

我们以xnx为例,但改变其中一个数组的长度:

import numpy as np
from scipy.optimize import curve_fit

def func(X, a, b, c):
    x,y = X
    return np.log(a) + b*np.log(x) + c*np.log(y)

# some artificially noisy data to fit
x = np.linspace(0.1,1.1,101)
y = np.linspace(1.,2., 90) #I have changed the length of one of these arrays
a, b, c = 10., 4., 6.
z = func((x,y), a, b, c) * 1 + np.random.random(101) / 100

# initial guesses for a,b,c:
p0 = 8., 2., 7.
print curve_fit(func, (x,y), z, p0)

如果你这样做,那么你最终会出现错误:

ValueError:操作数无法与形状一起广播 (101,) (​​90,)

有没有办法强制曲线拟合采用不同长度的数组?

【问题讨论】:

  • 我不明白你为什么要这样做。它们必须具有相同的维度,否则您会丢失一些数据来评估您的功能。您必须指定如何处理这些不同的维度。
  • 嗯...也许这个例子没有那么有代表性。我试图拟合一些实验测量的光谱,在这种情况下,x 是光谱的频率,y 是进行测量的温度,z 是强度数组。我要拟合的函数将 x 和 y 作为输入,所以 z 只是 len(x) by len(y) 数组,除非我错过了什么?
  • 对于 z 的每个测量值,您都有对应的 x 和 y 值。所以它们应该具有相同的尺寸。维度只是样本的数量。
  • 这不是上面的代码生成的吗?

标签: python curve-fitting


【解决方案1】:

有两个问题,第一个是,你的函数必须返回一个一维数组才能被curve_fit 使用。您可以使用 numpy 中的 ravel() 来实现这一点。要恢复原始形状,您可以使用reshape(xdim, ydim)

另一件事是自变量的维度。您必须生成一个完整的网格,而不仅仅是两个向量。您可以使用meshgrid() 来执行此操作。

import numpy as np
from scipy.optimize import curve_fit

def func(X, a, b, c):
    x,y = X
    result = np.log(a) + b*np.log(x) + c*np.log(y)
    return result.ravel()

xdim = 101
ydim = 90    

x = np.linspace(0.1,1.1,xdim)
y = np.linspace(1.,2., ydim)
X=np.meshgrid(x,y)
a, b, c = 10., 4., 6.
z = func(X, a, b, c) * 1 + np.random.random(xdim*ydim) / 100

p0 = 8., 2., 7.
print(curve_fit(func, X, z, p0))

这导致 a=10.05005705, b=4.00004791, c=6.00011176。

【讨论】:

    【解决方案2】:

    您可能会发现 lmfit (https://lmfit.github.io/lmfit-py/) 对此很有帮助。它与curve_fit 对曲线拟合有不同的看法,但在许多改进中,它确实支持多个自变量,并且它们不需要位于第一个参数位置(这是默认值,但可以更改)或数组与数据长度相同。

    对于一般的最小化问题,没有“自变量”的概念。有可变参数,以及从这些参数计算的残差。人们可能会使用额外的信息,如数据(!)、不确定性、独立变量或可能用于计算残差的可选开关,这一事实对于最小化例程完全不重要。因此,多个“自变量”,其中一些可能是与数据长度相同的数组,或者可能是布尔值、字典或其他自定义对象,不应该是概念上的问题,应该被允许。

    Lmfit 确实允许所有这些。默认情况下,作为具有数值默认值的位置或关键字参数的函数参数被假定为参数,除了那些明确称为独立变量的参数。但是您可以覆盖这些默认值。

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2021-11-28
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多