web-dev-qa-db-ja.com

numpy.averageを使用した加重平均

私は配列を持っています:

In [37]: bias_2e13 # our array
Out[37]: 
[1.7277990734072355,
 1.9718263893212737,
 2.469657573252167,
 2.869022991373125,
 3.314720313010104,
 4.232269039271717]

配列の各値のエラーは次のとおりです。

In [38]: bias_error_2e13 # the error on each value
Out[38]: 
array([ 0.13271387,  0.06842465,  0.06937965,  0.23886647,  0.30458249,
        0.57906816])

ここで、各値の誤差を2で割ります。

In [39]: error_half # error divided by 2
Out[39]: 
array([ 0.06635694,  0.03421232,  0.03468982,  0.11943323,  0.15229124,
        0.28953408])

ここで、numpy.averageを使用して配列の平均を計算しますが、errorsweightsとして使用します。

最初に値に完全なエラーを使用し、次にエラーの半分、つまりエラーを2で割った値を使用しています。

In [40]: test = np.average(bias_2e13,weights=bias_error_2e13)

In [41]: test_2 = np.average(bias_2e13,weights=error_half)

両方の平均で同じ結果が得られる方法一方の配列に他方の半分のエラーがある場合はどうなりますか?

In [42]: test
Out[42]: 3.3604746813456936

In [43]: test_2
Out[43]: 3.3604746813456936
5
ThePredator

すべてのエラーが同じ相対重みを持っているためです。 weightパラメータを指定しても、平均している実際の値は変更されません。これは、各値の値がに寄与する重みを示すだけです。平均。つまり、渡された各値に対応する重みを掛けた後、np.averageは提供された重みの合計で除算します。

>>> import numpy as np
>>> np.average([1, 2, 3], weights=[0.2, 0.2, 0.2])
2.0
>>> np.average([1, 2, 3])
2.0

事実上、n次元の配列のようなコンテナの平均式は次のようになります。

enter image description here

ここで、 numpy.average に指定されていない場合、各重みは1に等しいと見なされます。

21
miradulo

Scipy.orgからnumpyaverageについて:「aの値に関連付けられた重みの配列。aの各値は、関連付けられた重みに従って平均に寄与します。」これは、エラーが平均に比べて寄与することを意味します。したがって、同じ係数でエラーを乗算しても、何も変わりません。たとえば、最初のエラーのみに0.5を掛けてみると、異なる結果が得られます。

1
Scotty1-

私の答えは遅れていますが、これが将来この投稿を見ている他の人に役立つことを願っています。

上記の回答は、結果が同じである理由に関して的を射ています。ただし、加重平均の計算方法には根本的な欠陥があります。データの不確実性は、numpy.averageが期待する重みではありません。最初にウェイトを計算し、numpy.averageに提供する必要があります。これは次のように実行できます。

重み= 1 /(不確実性)^ 2。

(たとえば、 この説明を参照してください。

したがって、加重平均は次のように計算します。

wts_2e13 = 1./(np.power(bias_error_2e13、2.))#エラーを使用して重みを計算する

wts_half = 1./(np.power(error_half、2.))#半分の誤差を使用して重みを計算する

テスト= np.average(bias_2e13、weights = wts_2e13)

test_2 = np.average(bias_2e13、weights = wts_half)

上記の回答でよく説明されている理由により、どちらの場合も2.2201767077906709の回答が得られます。

1
anon