2

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ツールがどのように機能するかであり、必要なことのほとんどを実行します。回帰係数ごとに1つの呼び出しを行います。

以前の回帰推定を使用/変更するための更新および更新ツールの使用は、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 に答える