1

У меня есть два вектора x и y, и я хочу вычислить регрессию качения для тех, например, на (x(1:4),y(1:4)), (x(2:5),y(2:5)), ...
Есть ли уже функция для этого? Лучший алгоритм, который я имею в виду для этого, - O (n), но применение отдельных линейных регрессий на каждом подмассиве будет O (n^2). Я работаю с Matlab и Python (numpy).Эффективный способ выполнения линейной регрессии качения

+0

Возможно, поиск фильтра Савицкого-Голе. – seberg

+0

Возможно, я ошибаюсь, но не выполняет отдельные линейные регрессии также как раз от 'O (n)'? Количество раз, когда вам нужно сделать регрессию: 'O (n)', работа над каждой регрессией: 'O (1)' (при условии, что windowsize постоянна) –

+0

То есть, если вы используете результаты предыдущей регрессии вычислить следующий, что я хочу делать, а не то, что я подразумеваю под отдельными регрессиями. –

ответ

2

Нет, нет функции, которая будет выполнять скользящую регрессию, возвращая все статистические данные, которые вы хотите, делая это эффективно.

Это не значит, что вы не можете написать такую ​​функцию. Для этого нужно было бы вызвать несколько вызовов инструмента, например conv или filter. Так будет работать инструмент Savitsky-Golay, который делает большую часть того, что вы хотите. Сделайте один вызов для каждого коэффициента регрессии.

Использование инструментов восходящего и датирования для использования/изменения предыдущих оценок регрессии не будет столь же эффективным, как вызовы conv, так как вам нужно только разложить линейную систему ONCE, когда вы затем выполняете работу с помощью conv , Во всяком случае, нет необходимости делать обновление, если точки равномерно распределены по ряду. Вот почему Савицкий-Голай работает.

+0

Что вы подразумеваете под «большей частью того, что вам нужно»? Что я могу получить? –

+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

Смежные вопросы