gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:38:21 24 4
gpt4 key购买 nike

我正在尝试将一些数据拟合到具有两个自变量的非线性模型,但是两个自变量的向量长度是,即 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com