8

SciPy の deconvolve 関数を使用して、2 つのガウス分布が与えられた未知の分布を見つけたいと思います。SciPy にはこの関数に関連するドキュメントがないため、この関数を私の状況でどのように使用できるかについての例を探しています。たとえば、2 つの正規分布 N(100, 1)、N(300, 2) が与えられた場合、デコンボリューション N(200, 1) の分布を見つける方法を理解したいと思います。

>>> sample1 = np.round(scipy.around(scipy.stats.norm(100, 1).rvs(size=1000)))
>>> sample2 = np.round(scipy.stats.norm(300, 2).rvs(size=2000))
>>> signal.deconvolve(sample1, sample2)

上記のコードは負の値を返しますが、これは間違っているようです。このデコンボリューションから分布 N(200, 1) を復元するにはどうすればよいですか? 特に、私の問題は、除数を取得する方法がわからないことだと思います。

私が本当に望んでいるのは、SciPy のデコンボリューションを使用してこれらのサンプルから ~ N(200, 1) を回復する方法の例です。

4

1 に答える 1

5

あなたは期待について少し混乱していると思います... 2 つの正規分布の畳み込みは、平均が平均の和、分散が分散の和である別の正規分布であることは誰もが知っているので、 2 つの通常のランダム サンプルの畳み込みも、通常のランダム サンプルになります。そして、それはそうではありません:

a = scipy.stats.norm(100, 1).rvs(size=1000)
b = scipy.stats.norm(200, 1).rvs(size=1000)
c = scipy.convolve(a, b)
plt.subplot(311)
plt.hist(a, bins=50)
plt.subplot(312)
plt.hist(a, bins=50)
plt.subplot(313)
plt.hist(a, bins=50)

ここに画像の説明を入力

あなたはおそらく次のようなことを考えていたでしょう:

a = scipy.stats.norm(100, 10).pdf(np.arange(500))
b = scipy.stats.norm(200, 20).pdf(np.arange(500))
c = scipy.convolve(a, b)
m_ = max(a.max(), b.max(), c.max())
plt.subplot(311)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(a)
plt.subplot(312)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(b)
plt.subplot(313)
plt.axis([0, 1000, 0, 1.25*m_])
plt.plot(c)

ここに画像の説明を入力

いずれにせよ、に戻りdeconvolveます... 長さmとの 2 つの配列で呼び出すと、2 つの配列nを持つタプルが返されます。

  • 長さの最初のm - n + 1ものはデコンボリューションされた配列です。つまり、最初のものを取得するために2番目のものを畳み込む必要がある配列です
  • 長さの 2 番目はm、最初の配列を 2 番目の配列と最初に返された配列の畳み込みに置き換える際のエラーです。
于 2013-03-18T19:26:52.993 に答える