2

我有两个向量 x 和 y,我想为它们计算一个滚动回归,例如 a on(x(1:4),y(1:4)), (x(2:5),y(2:5)), ...
是否已经有一个函数了?我为此想到的最佳算法是 O(n),但在每个子阵列上应用单独的线性回归将是 O(n^2)。我正在使用 Matlab 和 Python (numpy)。

4

2 回答 2

2

不,没有任何函数可以进行滚动回归,返回您想要的所有统计数据,并且有效地执行此操作。

这并不意味着您不能编写这样的函数。这样做意味着多次调用 conv 或 filter 等工具。这就是 Savitsky-Golay 工具的工作方式,它可以满足您的大部分需求。对每个回归系数进行一次调用。

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

于 2013-03-26T13:52:06.417 回答
1
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
于 2013-11-13T22:14:10.697 回答