web-dev-qa-db-ja.com

Python NumpyPoisson分布

完全を期すために、ガウス関数を生成しています。これが私の実装です。

from numpy import *
x=linspace(0,1,1000)
y=exp(-(x-0.5)**2/(2.0*(0.1/(2*sqrt(2*log(2))))**2))

0.5fwhm=0.1にピークがあります。これまでのところ面白くない。次のステップでは、numpysrandom.poisson 実装を使用して、データセットのポアソン分布を計算します。

poi = random.poisson(lam=y)

私は2つの大きな問題を抱えています。

  1. ポアソンの専門は、分散がexpに等しいことです。値、mean()とvar()の出力を比較すると、出力が等しくないため、混乱します。
  2. これをプロットすると、ポアソン分布になります。整数値のみと最大値を取ります。私の古い関数yには最大値がありますが、値は約7、場合によっては6です。 at 1. Afaiは、ポアソン関数が実際の関数yの一種の「適合」を与えるはずであることを理解しています。どうして最大値が等しくありませんか?数学的な誤りで申し訳ありませんが、実際にはポアソン分布のノイズをエミュレートするためにこれを行っていますが、このコンテキストでは「適合」を理解していると思います。

編集:3。質問:このコンテキストで使用される「サイズ」変数は何ですか?私はさまざまな種類の使用法を見てきましたが、最終的には異なる結果は得られませんでしたが、間違って選択すると失敗しました...

EDIT2:OK、私が得た答えから、私は十分に明確ではなかったと思います(それは私がした他のいくつかの愚かなエラーを修正するのにすでに役立ちましたが、それをありがとう!)。私がやりたいのは、関数yにポアソン(ホワイト)ノイズを適用することです。以下の投稿でMSeifertが説明しているように、期待値をlamとして使用します。しかし、これは私にノイズを与えるだけです。私は、このノイズがどのように適用されるかというレベルで、いくつかの理解上の問題があると思います(そして、おそらくそれはより物理学に関連していますか?!)。

5
famfop

まず、_import numpy as np_を想定してこの回答を記述します。これは、numpy関数を組み込み関数またはmathおよびrandomパッケージの関数と明確に区​​別するためです。 Python。

基本的な仮定が間違っているため、指定された質問に答える必要はないと思います。

はい、ポアソン統計には分散に等しい平均がありますが、定数lamを使用することを前提としています。しかし、あなたはしません。ガウス分布のy値を入力するため、それらが一定であるとは期待できません(定義上、ガウス分布です!)。

np.random.poisson(lam=0.5)を使用して、ポアソン分布から1つのランダム値を取得します。ただし、このポアソン分布はガウス分布とほぼ同じではないので注意してください。これは、これらの両方が大幅に異なる「低平均」区間にあるためです。たとえば、 ポアソン分布に関するウィキペディアの記事 を参照してください。 =。

また、乱数を作成しているので、実際にそれらをプロットするのではなく、それらの_np.histogram_をプロットする必要があります。統計分布はすべて確率密度関数に関するものであるため( 確率密度関数 を参照)。

前に、定数lamでポアソン分布を作成することをすでに述べたので、今度はsizeについて説明します。乱数を作成するので、必要な実際のポアソン分布を概算します。たくさんの乱数を描きます。サイズは次のとおりです。np.random.poisson(lam=0.5, size=10000)は、たとえば、平均値_0.5_のポアソン確率密度関数からそれぞれ抽出された10000個の要素の配列を作成します。

そして、前に述べたウィキペディアの記事でそれを読んでいない場合、ポアソン分布は定義上、結果として符号なし(> = 0)整数のみを与えます。

したがって、あなたがやりたかったのは、1000個の値を含むガウス分布とポアソン分布を作成することだと思います。

_gaussian = np.random.normal(0.5, 2*np.sqrt(2*np.log(2)), 1000)
poisson = np.random.poisson(0.5, 1000)
_

次に、それをプロットするには、ヒストグラムをプロットします。

_import matplotlib.pyplot as plt
plt.hist(gaussian)
plt.hist(poisson)
plt.show()
_

または、代わりに _np.histogram_ を使用してください。

ランダムサンプルから統計を取得するには、ガウスサンプルとポアソンサンプルで_np.var_と_np.mean_を使用できます。そして今回(少なくとも私のサンプル実行では)、それらは良い結果をもたらします:

_print(np.mean(gaussian))
0.653517935138
print(np.var(gaussian))
5.4848398775
print(np.mean(poisson))
0.477
print(np.var(poisson))
0.463471
_

ガウス値がパラメーターとして定義したものとほぼ同じであることに注意してください。一方、ポアソン平均と変数はほぼ同じです。上記のsizeを増やすことで、平均と変数の精度を上げることができます。

ポアソン分布が元の信号に近似しない​​理由

元の信号には0〜1の値しか含まれていないため、ポアソン分布では正の整数のみが許可され、標準偏差は平均値にリンクされます。ガウス分布の平均からこれまでのところ、信号は約0であるため、ポアソン分布はほとんどの場合0になります。ガウス分布の最大値は1です。1のポアソン分布は次のようになります(左が信号+ポアソン)右側では、1)の値の周りのポアソン分布

enter image description here

そのため、その領域では0と1が多く、2がいくつか得られます。しかし、7までの値を描く可能性もあります。これはまさに私が述べた反対称です。ガウス分布の振幅を変更すると(たとえば、1000を掛ける)、ポアソン分布がほぼ対称であるため、「適合」ははるかに優れています。

enter image description here

14
MSeifert