複素正規分布
理論
概要
複素数を確率変数として扱い場合の正規分布
2次元の正規分布を複素数として解釈する
定義
複素数を$ z,実部を$ x,虚部を$ yとする($ z=x+iy)
実部$ xと虚部$ yがそれぞれ独立で同じ分散$ \sigma^2をもつ一次元の正規分布に従うとする.
確率密度関数
中心(複素数)を$ \muとすると,正規分布に従う確率密度関数は次のように書ける
$ p(z) = \frac{1}{\pi\sigma^2}\exp\left(-\frac{|z-\mu|^2}{\sigma^2}\right)
確率密度関数の形
実部$ xと虚部$ yが完全に独立なので,確率密度関数$ p(z)は,中心点$ \muを中心にあらゆる方向へ同様に広がる.
上から見ると「等高線が円状となる山」のような円対称性を持った形をとる.
https://gyazo.com/ea5bb8d474cb2794c96c3ae9fafda2a8 https://gyazo.com/c0ef7a43f1d0d4e26121de259907457d
プログラム
1. 理論的な確率密度の描画(2D)
code:python
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
mu = 0 + 0j
sigma = 1 / np.sqrt(2)
grid_pts = 250
grid_lim_factor = 4
# 格子生成と理論密度計算
grid_lim = grid_lim_factor * sigma
x = np.linspace(mu.real - grid_lim, mu.real + grid_lim, grid_pts)
y = np.linspace(mu.imag - grid_lim, mu.imag + grid_lim, grid_pts)
X, Y = np.meshgrid(x, y)
Z = X + 1j * Y
pdf = (1.0 / (np.pi * sigma**2)) * np.exp(-np.abs(Z - mu)**2 / sigma**2)
# カラーマップによる描画
plt.figure(figsize=(6, 6))
plt.imshow(pdf, extent=X.min(), X.max(), Y.min(), Y.max(),
origin='lower', cmap='viridis', aspect='equal')
plt.colorbar(label="Probability Density")
plt.title("Theoretical Complex Gaussian PDF (2D)")
plt.xlabel("Real Part")
plt.ylabel("Imaginary Part")
plt.show()
結果
https://gyazo.com/ea5bb8d474cb2794c96c3ae9fafda2a8
2. 理論的な確率密度の描画(3D)
code:python
from mpl_toolkits.mplot3d import Axes3D # 必要なインポート
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定(再掲)
mu = 0 + 0j
sigma = 1 / np.sqrt(2)
grid_pts = 100
grid_lim_factor = 4
# 格子生成と理論密度計算
grid_lim = grid_lim_factor * sigma
x = np.linspace(mu.real - grid_lim, mu.real + grid_lim, grid_pts)
y = np.linspace(mu.imag - grid_lim, mu.imag + grid_lim, grid_pts)
X, Y = np.meshgrid(x, y)
Z = X + 1j * Y
pdf = (1.0 / (np.pi * sigma**2)) * np.exp(-np.abs(Z - mu)**2 / sigma**2)
# 3D描画
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, pdf, cmap='viridis', edgecolor='none')
ax.set_title("Theoretical Complex Gaussian PDF (3D)")
ax.set_xlabel("Real Part")
ax.set_ylabel("Imaginary Part")
ax.set_zlabel("Probability Density")
ax.view_init(elev=30, azim=135)
plt.show()
結果
https://gyazo.com/c0ef7a43f1d0d4e26121de259907457d
3. サンプルデータ生成シミュレーション(プロット)
code:python
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
mu = 0 + 0j
sigma = 1 / np.sqrt(2)
N = 10000 # サンプル数
# サンプル生成
x_samples = np.random.normal(loc=mu.real, scale=sigma, size=N)
y_samples = np.random.normal(loc=mu.imag, scale=sigma, size=N)
z_samples = x_samples + 1j * y_samples
# 散布図描画
plt.figure(figsize=(6, 6))
plt.scatter(x_samples, y_samples, s=5, alpha=0.4)
plt.gca().set_aspect("equal", "box")
plt.title(f"Scatter Plot of {N} Samples")
plt.xlabel("Real Part")
plt.ylabel("Imaginary Part")
plt.show()
結果
https://gyazo.com/a9465aef49cac113f6d291b130c4dbaf
4. サンプルデータ生成シミュレーション(ヒストグラム)
code:py
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
mu = 0 + 0j
sigma = 1 / np.sqrt(2)
N = 1000000 # サンプル数
# サンプル生成(実部・虚部は独立な正規分布)
x_samples = np.random.normal(loc=mu.real, scale=sigma, size=N)
y_samples = np.random.normal(loc=mu.imag, scale=sigma, size=N)
# 描画
fig, ax = plt.subplots(figsize=(6, 6))
hist = ax.hist2d(x_samples, y_samples, bins=60, density=True, cmap='inferno')
# カラーバー追加
plt.colorbar(hist3, ax=ax, label="Empirical Density")
# 表示設定
ax.set_aspect("equal", "box")
ax.set_title("Empirical 2D Histogram of Complex Gaussian Samples")
ax.set_xlabel("Real Part")
ax.set_ylabel("Imaginary Part")
ax.grid(True) # グリッド線表示
# 描画
plt.show()
結果
https://gyazo.com/8027605a679e167e829be768681ac9a9
ーーー
2025/5/25 15:53
original:/tomiokario-close/複素正規分布