使用np.数组和scipy.统计数据进行线性回归

8wtpewkr  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(115)

我尝试在两个2x 3数组上做线性回归,一个是x值,一个是y值,其中每一行都是一个单独的数据集,但当我尝试在整个数组上计算时:

import numpy as np
from scipy.stats import linregress

sigma = [[10. 20. 40.]
 [15. 30. 50.]]
tau = [[ 7.  14.  28. ]
 [15.5 31.1 51.8]]

slope = linregress(sigma, tau)[0]

我得到的错误:

ValueError: too many values to unpack (expected 4)

但是,如果我手动选择行,它就可以正常工作:

slope = linregress(sigma[0,:], tau[0,:])[0]

我知道我可以用for循环得到我想要的,但是我觉得应该有一个更直接的方法,我只是缺少了。而且,我知道我可以在没有数组的情况下很简单地做到这一点,但是我希望得到正确的结果,这样我就可以在未来使用它来处理更大的数据集。谢谢!

hfsqlsce

hfsqlsce1#

我认为最简单的解决方案是使用一个for循环。您正在使用SciPy的线性回归模块,通过阅读documentation,我认为您无法获得您正在寻找的矢量化解决方案。
如果您不喜欢for循环解决方案,可能是因为它对于您将来必须科普的真实的数据集来说太慢了,您可以尝试使用列表解析的更紧凑的解决方案,它通常比简单的for循环更快(但取决于手头的问题,我没有关于您的真实应用程序的任何细节)。
所以,你可以试试这样的方法:

import numpy as np
from scipy.stats import linregress

sigmas = [[10, 20, 40], [15, 30, 50]]
taus = [[7,  14,  28], [15.5, 31.1, 51.8]]

slopes = [linregress(sigma, tau)[0] for sigma, tau in zip(sigmas, taus)]
slopes
>>> [0.7, 1.037027027027027]

我认为这是一个很好的解决方案。它是一个很短的一行代码(少于88个字符),它很清楚,而且它可能比显式for循环更快。
或者,正如@MadPhysicist所建议的,您可以使用NumPy等函数来实现自己的线性回归函数,这样可以从矢量化中获益。

相关问题