3

データセット (X、Y、Yerr) に対して最小二乗多項式近似を行い、近似パラメータの共分散行列を取得したいと考えています。また、私は多くのデータセットを持っているため、CPU 時間が問題になるため、分析 (=高速) ソリューションを探しています。次の(理想的ではない)オプションを見つけました:

numpy.polyfit当てはめますが、エラー Yerr を考慮せず、共分散も返しません。

numpy.polynomial.polynomial.polyfitYerr を入力として (重みの形式で) 受け入れますが、共分散も返しません。

scipy.optimize.curve_fit多項式にscipy.optimize.leastsq適合し、共分散行列を返すように調整できますが、反復法であるため、これらはpolyfitルーチン (分析解を生成する) よりもはるかに遅くなります。

Python は、フィット パラメータの共分散を返す解析的多項式フィット ルーチンを提供していますか (または、自分で作成する必要がありますか :-) ?

更新: Numpy 1.7.0 では、numpy.polyfitだけでなく、係数の共分散行列も返すようになったようです。問題は解決しました! :-)

4

2 に答える 2

0

ここでは scipy.linalg.lstsq を使用しています

import numpy as np,numpy.random, scipy.linalg
#generate the test data
N = 100
xs = np.random.uniform(size=N)
errs = np.random.uniform(0, 0.1, size=N) # errors
ys = 1 + 2 * xs + 3 * xs ** 2 + errs * np.random.normal(size=N)

# do the fit
polydeg = 2
A = np.vstack([1 / errs] + [xs ** _ / errs for _ in range(1, polydeg + 1)]).T
result = scipy.linalg.lstsq(A, (ys / errs))[0]
covar = np.matrix(np.dot(A.T, A)).I
print result, '\n', covar

>> [ 0.99991811  2.00009834  3.00195187]
[[  4.82718910e-07  -2.82097554e-06   3.80331414e-06]
 [ -2.82097554e-06   1.77361434e-05  -2.60150367e-05]
 [  3.80331414e-06  -2.60150367e-05   4.22541049e-05]]
于 2012-12-04T19:45:01.610 に答える
0

追加のオーバーヘッドなしで共分散行列を返す高速な加重最小二乗モデルが必要ですか? 一般に、適切な共分散行列はデータ生成プロセス (DGP) に依存します。これは、異なる DGP (誤差の異分散性など) がパラメーター推定値の異なる分布を意味するためです (ホワイト対 OLS 標準誤差を考えてください)。しかし、WLS が正しい方法であると仮定できる場合は、WLS のベータの漸近分散推定 (1/n X'V^-1X)^-1 を使用すると思います。ここで、V は重み行列です。 Yerrs から作成されました。numpy.polynomial.polynomial.polyfit が機能している場合、これは非常に単純な式です。

オンライン リファレンスを探しましたが、見つかりませんでした。しかし、Fumio Hayashi's Ecomometrics, 2000, Princeton University press, p. 133 - 137 の派生と議論。

2012 年 12 月 4 日更新: 別のスタック オーバーフローの質問があり ます。次の行を置き換えたいと思うでしょう:

result = sm.OLS(Y,reg_x_data).fit()

result = sm.WLS(Y,reg_x_data, weights).fit()

以前のように、numpy.polynomial.polynomial.polyfit を使用して重みを Yerr の関数として定義します。WLS で statsmodels を使用する方法の詳細については、 statsmodels のWeb サイトを参照してください。

于 2012-12-03T22:51:37.300 に答える