2013-03-26 184 views
1

我有兩個向量x和y,我想爲這些向量計算滾動迴歸,例如(x(1:4),y(1:4)), (x(2:5),y(2:5)), ...
是否已有一個函數?我想到的最好的算法是O(n),但在每個子陣列上應用單獨的線性迴歸將是O(n^2)。 我正在使用Matlab和Python(numpy)。滾動線性迴歸的有效方法

+0

也許搜索Savitzky-Golay過濾器。 – seberg 2013-03-26 12:27:18

+0

我可能會誤解,但是並沒有進行單獨的線性迴歸,也只是'O(n)'?你需要做迴歸的次數:'O(n)',在每次迴歸中都要完成:'O(1)'(假設窗口大小不變) – 2013-03-26 12:35:55

+0

這就是說,如果你使用前面迴歸的結果計算下一個,這是我想要做的,而不是我的意思是單獨的迴歸。 – 2013-03-26 12:56:20

回答

2

不,沒有任何功能可以進行滾動迴歸,返回您希望的所有統計數據,並高效地執行。

這並不意味着你不能寫這樣的功能。這樣做意味着多次調用工具,如conv或filter。這就是Savitsky-Golay工具的工作原理,它可以完成你想要的大部分工作。爲每個迴歸係數打個電話。

使用上溯測量工具和下溯測量工具來使用/修改以前的迴歸估計值不會像調用調用那樣高效,因爲當您隨後用conv進行工作時,只需要將線性系統分解一次即可。無論如何,只要點在系列中均勻間隔,就不需要進行更新。這就是Savitsky-Golay工作的原因。

+0

「你需要的大部分」是什麼意思?我能得到什麼? – 2013-03-26 14:08:38

+0

您可以從conv得到每個迴歸係數。因此預測是簡單的代數運算,所以殘差的計算以及使用它們的任何事情都是微不足道的。但沒有單一的工具可以給你所需要的東西。您需要編寫代碼。 – 2013-03-26 14:23:40

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 
+1

請不要只是轉儲代碼沒有一些感嘆號。 – Class 2013-11-13 22:34:07