西皮·奥德瑞多元回归

2024-03-29 10:41:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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()

它引发了以下例外:

^{pr2}$

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


Tags: importapidatanppiscipysinbeta
1条回答
网友
1楼 · 发布于 2024-03-29 10:41:49

首先,根据我的经验scipy.odr公司主要使用数组,而不是矩阵。在这个过程中,库似乎进行了大量的大小检查,让它处理多个变量似乎相当麻烦。在

这就是我通常如何让它工作的工作流(至少在python2.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()

所以使用相同的(1D?)数组,使用row_stack和按单个索引编号寻址似乎可以工作。在

相关问题 更多 >