python - 具有不等长度向量的多变量非线性回归

标签 python curve-fitting

我正在尝试将一些数据拟合到具有两个自变量的非线性模型,但是两个自变量的向量长度是,即 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: operands could not be broadcast together with shapes (101,) (90,)

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

最佳答案

有两个问题,第一个是,你的函数必须返回一个一维数组才能被 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。

关于python - 具有不等长度向量的多变量非线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48405694/

相关文章:

python - 如何将时间序列数据分割成3列和3 channel ?

python - Django:显示 "featured"项目?

python - python中的多元曲线拟合用于估计椭圆形状的参数和阶数

python - 优化生成变量的拒绝方法

python - 期望参数时的错误处理

python - 使用刷新 token 刷新谷歌访问 token

python - 在python中将高斯拟合到吸收线

python - 使用 Voronoi 图查找多边形的中线

python - 如何拟合数据集以便它们共享一些(但不是全部)参数值

geometry - 将过渡 + 圆 + 过渡曲线拟合到一组测量点