python - Scipy.Odr 多变量回归

标签 python python-3.x numpy scipy one-definition-rule

我想用 scipy.odr 执行多维 ODR。我阅读了 API 文档,它说多维是可能的,但我无法使其工作。我在互联网上找不到工作示例,而且 API 非常粗糙,没有给出如何进行的提示。

这是我的 MWE:

import numpy as np
import scipy.odr

def linfit(beta, x):
    return beta[0]*x[:,0] + beta[1]*x[:,1] + beta[2]

n = 1000
t = np.linspace(0, 1, n)
x = np.full((n, 2), float('nan'))
x[:,0] = 2.5*np.sin(2*np.pi*6*t)+4
x[:,1] = 0.5*np.sin(2*np.pi*7*t + np.pi/3)+2
e = 0.25*np.random.randn(n)
y = 3*x[:,0] + 4*x[:,1] + 5 + e

print(x.shape)
print(y.shape)

linmod = scipy.odr.Model(linfit)
data = scipy.odr.Data(x, y)
odrfit = scipy.odr.ODR(data, linmod, beta0=[1., 1., 1.])
odrres = odrfit.run()
odrres.pprint()

它引发了以下异常:

scipy.odr.odrpack.odr_error: number of observations do not match

这似乎与我的矩阵形状有关,但我不知道该如何正确塑造它。有人知道吗?

最佳答案

首先,根据我的经验,scipy.odr 主要使用数组,而不是矩阵。这个库似乎在整个过程中进行了大量的大小检查,让它与多个变量一起工作似乎很麻烦。

这是我通常如何让它工作的工作流程(至少在 python 2.7 上工作):

import numpy as np
import scipy.odr

n = 1000
t = np.linspace(0, 1, n)

def linfit(beta, x):
    return beta[0]*x[0] + beta[1]*x[1] + beta[2] #notice changed indices for x

x1 = 2.5*np.sin(2*np.pi*6*t)+4
x2 = 0.5*np.sin(2*np.pi*7*t + np.pi/3)+2

x = np.row_stack( (x1, x2) ) #odr doesn't seem to work with column_stack

e = 0.25*np.random.randn(n)
y = 3*x[0] + 4*x[1] + 5 + e #indices changed

linmod = scipy.odr.Model(linfit)
data = scipy.odr.Data(x, y)
odrfit = scipy.odr.ODR(data, linmod, beta0=[1., 1., 1.])
odrres = odrfit.run()
odrres.pprint()

因此,使用相同的(一维?)数组、使用 row_stack 并按单个索引号寻址似乎可行。

关于python - Scipy.Odr 多变量回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041266/

相关文章:

python - 将函数应用于一个 df 中的行和另一 df 中的列的所有组合

python - 值错误 : First argument must be a sequence ----> Scatter Plot Python

python - 小数点后各占一行的值。使用 Python 3+ 实现 CSV

python-3.x - 对 S3 中的多个文件执行 lambda 函数

python - 如何使用 cpython 将结构数组传递给 DLL 函数?

python - 如何返回使用变量值的函数?

python - 有没有更快的方法来找到形状的周长?

python - 是否有解决方法可以在单独的线程中清空事件队列?

python - get_by_id(ndb,GAE)中的查询语句

python - Python 中的 "lambda"到底是什么?