有效的方法来进行滚动线性回归

时间:2013-03-26 12:11:57

标签: python matlab numpy linear-regression rolling-computation

我有两个向量x和y,我想为那些计算滚动回归,例如在(x(1:4),y(1:4)), (x(2:5),y(2:5)), ...上 是否已有功能?我想到的最好的算法是O(n),但是在每个子阵列上应用单独的线性回归将是O(n ^ 2)。 我正在使用Matlab和Python(numpy)。

2 个答案:

答案 0 :(得分:2)

不,没有任何功能可以进行滚动回归,返回您希望的所有统计数据,并有效地进行。

这并不意味着你不能写出这样的功能。这样做意味着多次调用诸如转换或过滤器之类的工具。这就是Savitsky-Golay工具的工作方式,它可以完成你想要的大部分工作。为每个回归系数打一个电话。

使用up-dating和down-dating工具来使用/修改之前的回归估计将不会像对conv的调用那样有效,因为当你使用conv进行工作时,你只需要对线性系统进行因式分解。无论如何,只要点在系列中均匀分布,就不需要进行更新。这就是Savitsky-Golay工作的原因。

答案 1 :(得分:0)

import numpy as np
# y=x*alpha+beta
# window_size - integer, x-numpy array, y-numpy array

x2=np.power(x,2)
xy=x*y
window = np.ones(int(window_size))
a1=np.convolve(xy, window, 'full')*window_size
a2=np.convolve(x, window, 'full')*np.convolve(y, window, 'full')
b1=np.convolve(x2, window, 'full')*window_size
b2=np.power(np.convolve(x, window, 'full'),2)
alphas=(a1-a2)/(b1-b2)
betas=(np.convolve(y, window, 'full')-alphas*np.convolve(x, window, 'full'))/float(window_size)
alphas=alphas[:-1*(window_size-1)] #numpy array of rolled alpha
betas=betas[:-1*(window_size-1)]   #numpy array of rolled beta