python - 有效扩张线性回归

标签 python numpy pandas scipy

我有一个包含两列(X 和 Y 坐标)的数据框。我需要从 df 开始扩展线性回归。例如,在第二点,我需要前两点的回归;在第 3 个点,我需要它来表示前 3 个点,依此类推。根据文档,对于具有一个输入和一个输出的函数 expanding_apply可以使用,但 linregress 提供 5 个输出。

目前我正在对所有行进行 for 循环,效果很好,但毫不奇怪的是非常慢,几乎无法使用。

我尝试了一些方法,但遭到拒绝。尝试将输入作为元组发送:

pd.expanding_apply((df.x, df.y), linregress)
> AttributeError: 'tuple' object has no attribute 'dtype'

尝试将输入作为 df 发送:

pd.expanding_apply(df[['x','y']], linregress)
> IndexError: tuple index out of range

每个回归几乎与之前的回归相同(仅添加了一个数据点),因此大概还有很大的加速空间。有没有什么方法可以在 pandas 或 numpy/scipy 域中实现这一点,从而更有效?

编辑:linregress 可以选择接受一个二维数组(而不是 2 个单独的一维数组),因此 linregress(df[['x','y']]) 本身就可以正常工作。但是 expanding_apply 可能期望 arg 是一个系列,而不是 df。

最佳答案

要计算 y = a*x + b 的线性回归参数,您必须求解超定方程组 X*a = y,其中:

X = [[1, x0], [1, x1], ..., [1, x(n-1)]]
a = [b, a]
y = [ y0, y1, ..., y(n-1)]

如果您只在ab的值之后,您可以将系统两边预乘X.T,并求解由此产生的 2x2 系统。仔细看看,结果数组可以写成:

np.dot(X.T, X) = [[n, np.sum(x)],
                  [np.sum(x), np.sum(x*x)]]
np.dot(X.T, y) = [np.sum(y), np.sum(x*y)]

将所有这些放在一起,给定两个长度相等的一维数组 xy,您可以使用 numpy >= 1.8 执行以下操作:

n = 10
x, y = np.random.rand(2, n)

lhs = np.empty((n-1, 2, 2))
rhs = np.empty((n-1, 2))

lhs[:, 0, 0] = np.arange(2, n+1)
lhs[:, 0, 1] = np.cumsum(x)[1:]
lhs[:, 1, 0] = lhs[:, 0, 1]
lhs[:, 1, 1] = np.cumsum(x*x)[1:]

rhs[:, 0] = np.cumsum(y)[1:]
rhs[:, 1] = np.cumsum(x*y)[1:]

a = np.linalg.solve(lhs, rhs)

您可以与 polyfit 的结果进行比较,检查 a 是否包含正确的参数:

In [49]: a
Out[49]:
array([[ 0.64778976, -0.39918768],
       [ 0.76225593, -0.41054035],
       [ 0.72598372, -0.35430181],
       [ 0.70608159, -0.33873589],
       [ 0.6899674 , -0.34941498],
       [ 0.68270772, -0.34834723],
       [ 0.71031366, -0.59487271],
       [ 0.7422803 , -0.74757567],
       [ 0.65982282, -0.48593478]])

In [50]: for j in range(2, n+1):
   ....:     print np.polynomial.polynomial.polyfit(x[:j], y[:j], 1)
   ....:
[ 0.64778976 -0.39918768]
[ 0.76225593 -0.41054035]
[ 0.72598372 -0.35430181]
[ 0.70608159 -0.33873589]
[ 0.6899674  -0.34941498]
[ 0.68270772 -0.34834723]
[ 0.71031366 -0.59487271]
[ 0.7422803  -0.74757567]
[ 0.65982282 -0.48593478]

关于python - 有效扩张线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301728/

相关文章:

python - 你能改变 numpy 打印数组的方式吗?

python - Numpy nanmean 和 dataframe (可能的错误?)

pandas - 相对于 pandas 中其他 2 列的组,日期列上 4 天的滚动平均值

python - 当特定列相同时追加 id

python - 创建随机数列表并过滤列表以仅包含大于 50 的数字

python - 如何在 Python 中设置辅助 y 轴

python - Django-postgres : How to create an index on a JsonB field

python - 如何列出导入的模块?

python - 多列预测变量的相互作用

Python - 如何在脚本运行时隐藏 Windows 命令提示符屏幕?