2013-10-27 3 views
9

Mam trochę problemów ze zrozumieniem działania tej funkcji.Opis funkcji najmniej kwadratowej scipy z IRLS

a, b = scipy.linalg.lstsq(X, w*signal)[0] 

wiem, że sygnał jest tablica reprezentująca sygnał i obecnie w tylko [1,1,1,1,1...]

Jak należy manipulować X lub w naśladować ważonych najmniejszych kwadratów lub iteracyjnie ponownemu równoważeniu najmniej do kwadratu?

Odpowiedz

9

Jeśli produkt X i Y z sqrt (wagowo) można obliczyć ważonych najmniejszych kwadratów. Można uzyskać formułę o następującym linkiem:

http://en.wikipedia.org/wiki/Linear_least_squares_%28mathematics%29#Weighted_linear_least_squares

Oto przykład:

Przygotowanie danych:

import numpy as np 
np.random.seed(0) 
N = 20 
X = np.random.rand(N, 3) 
w = np.array([1.0, 2.0, 3.0]) 
y = np.dot(X, w) + np.random.rand(N) * 0.1 

OLS:

from scipy import linalg 
w1 = linalg.lstsq(X, y)[0] 
print w1 

wyjściowa:

[ 0.98561405 2.0275357 3.05930664] 

WLS:

weights = np.linspace(1, 2, N) 
Xw = X * np.sqrt(weights)[:, None] 
yw = y * np.sqrt(weights) 
print linalg.lstsq(Xw, yw)[0] 

wyjściowa:

[ 0.98799029 2.02599521 3.0623824 ] 

Sprawdź wynik przez statsmodels:

import statsmodels.api as sm 
mod_wls = sm.WLS(y, X, weights=weights) 
res = mod_wls.fit() 
print res.params 

wyjściowa:

[ 0.98799029 2.02599521 3.0623824 ]