🤖
確率密度関数の畳み込みについて
定理
この式は畳み込みと呼ばれる。
Pythonによる視覚的説明。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.integrate import quad
def f_X(x, mu1=0, sigma1=1):
"""X の確率密度関数 (正規分布)"""
return norm.pdf(x, mu1, sigma1)
def f_Y(y, mu2=0, sigma2=1):
"""Y の確率密度関数 (正規分布)"""
return norm.pdf(y, mu2, sigma2)
def convolution_integral(u, mu1=0, sigma1=1, mu2=0, sigma2=1):
"""畳み込み積分を計算"""
integrand = lambda x: f_X(x, mu1, sigma1) * f_Y(u-x, mu2, sigma2)
result, _ = quad(integrand, -np.inf, np.inf)
return result
def theoretical_sum_normal(x, mu1=0, sigma1=1, mu2=0, sigma2=1):
"""2つの正規分布の和の理論的な確率密度関数"""
mu = mu1 + mu2
sigma = np.sqrt(sigma1**2 + sigma2**2)
return norm.pdf(x, mu, sigma)
# パラメータ設定
mu1, sigma1 = 1, 1 # X の平均と標準偏差
mu2, sigma2 = 2, 1.5 # Y の平均と標準偏差
# 計算範囲の設定
u = np.linspace(-2, 8, 100)
# 畳み込みによる確率密度関数の計算
g_numerical = [convolution_integral(ui, mu1, sigma1, mu2, sigma2) for ui in u]
# 理論値の計算
g_theoretical = theoretical_sum_normal(u, mu1, sigma1, mu2, sigma2)
# プロット
plt.figure(figsize=(10, 6))
plt.plot(u, g_numerical, 'b-', label='Numerical Convolution')
plt.plot(u, g_theoretical, 'r--', label='Theoretical')
plt.plot(u, [f_X(x, mu1, sigma1) for x in u], 'g:', label='X density')
plt.plot(u, [f_Y(y, mu2, sigma2) for y in u], 'm:', label='Y density')
plt.xlabel('u')
plt.ylabel('Probability Density')
plt.title('Density Function of Sum of Independent Normal Distributions')
plt.legend()
plt.grid(True)
plt.show()
# 数値計算と理論値の差の最大値を確認
max_diff = np.max(np.abs(np.array(g_numerical) - g_theoretical))
print(f"Maximum difference between numerical and theoretical: {max_diff:.6f}")
証明1
変数変換を用いた証明。
このとき
ヤコビアンを求めると
よって
ゆえに
このとき
証明2
確率密度関数から導出する方法。
両辺を
となる。
Discussion