16

この関数がどのように機能するかを理解するのに少し苦労しています。

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

私は、信号が信号を表す配列であり、現在wはちょうどであることを知っています[1,1,1,1,1...]

加重最小二乗法または繰り返し再加重最小二乗法を操作Xまたは模倣するにはどうすればよいですか?w

4

2 に答える 2

15

X と y を sqrt(weight) で乗算すると、加重最小二乗を計算できます。次のリンクから式を取得できます。

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

以下に例を示します。

データを準備します。

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

OL:

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

出力:

[ 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]

出力:

[ 0.98799029  2.02599521  3.0623824 ]

statsmodels による結果の確認:

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

出力:

[ 0.98799029  2.02599521  3.0623824 ]
于 2013-10-28T01:32:32.327 に答える
5

Wの要素ごとの平方根から対角行列を作成しますw。次に、あなたが欲しいと思います:

scipy.linalg.lstsq(np.dot(W, X), np.dot(W*signal))

http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#Weighted_linear_least_squaresに従ってください

于 2013-10-28T01:31:50.543 に答える