ヘロログ
統計学

混合正規分布

混合正規分布(mixture of normal distributions)は、複数の正規分布を重み付けして合成した分布である。単一の正規分布では表現できない多峰性裾の厚い分布をモデル化できるため、実データの分析で広く用いられている。

例えば、ある集団の身長データを分析する際、男女混合のデータは単峰の正規分布にはならず、2つの山をもつ分布になることがある。また、顧客の購買金額分布が複数のセグメント(一般顧客とヘビーユーザー)に分かれる場合も、混合正規分布でモデル化できる。機械学習におけるクラスタリング(Gaussian Mixture Model)の基礎となる重要な分布である。

定義

K 個の正規分布 N(\mu_j, \sigma_j^2)j = 1, \ldots, K)を考える。各正規分布の確率密度関数を

f_j(x) = \dfrac{1}{\sigma_j}\varphi\left(\dfrac{x - \mu_j}{\sigma_j}\right) = \dfrac{1}{\sqrt{2\pi}\sigma_j}\exp\left(-\dfrac{(x - \mu_j)^2}{2\sigma_j^2}\right)

とする。ここで \varphi(z) は標準正規分布の確率密度関数である。

混合比率(混合係数)p_1, \ldots, p_K が次の条件を満たすとする。

p_j > 0 \quad (j = 1, \ldots, K), \qquad p_1 + p_2 + \cdots + p_K = 1
混合正規分布の確率密度関数
f(x) = p_1 f_1(x) + p_2 f_2(x) + \cdots + p_K f_K(x) = \sum_{j=1}^{K} p_j f_j(x)

N(\mu_j, \sigma_j^2)混合要素(component)と呼ぶ。混合比率 p_j は、データがその要素から生成される確率と解釈できる。

累積分布関数

混合正規分布の累積分布関数も、各成分の累積分布関数の重み付き和で表される。F_j(x) = \Phi\left(\dfrac{x - \mu_j}{\sigma_j}\right)N(\mu_j, \sigma_j^2) の累積分布関数とすると

累積分布関数
F(x) = p_1 F_1(x) + p_2 F_2(x) + \cdots + p_K F_K(x) = \sum_{j=1}^{K} p_j \Phi\left(\dfrac{x - \mu_j}{\sigma_j}\right)

ここで \Phi(z) は標準正規分布の累積分布関数である。

グラフ

2つの正規分布を等しい重みで混合した場合(K = 2, p_1 = p_2 = 0.5)のグラフを示す。2つの混合要素の平均の差が大きいと二峰性(bimodal)を示し、差が小さいと単峰性になる。

f(x) 0.20 0.15 0.10 0.05 0 x -6 -4 -2 0 2 4 6 8 10
━━ 単峰性
\mu = (0, 2), \sigma = 1.5
━━ 二峰性
\mu = (0, 4), \sigma = 1
図1: 混合正規分布(K=2, p_1 = p_2 = 0.5

青線(\mu_1 = 0, \mu_2 = 2, \sigma = 1.5)は2つの平均の差が標準偏差の約1.3倍であり、単峰性を示す。緑線(\mu_1 = 0, \mu_2 = 4, \sigma = 1)は平均の差が標準偏差の4倍であり、明確な二峰性を示す。

期待値と分散

混合正規分布の期待値と分散は、各成分の特性値と混合比率から計算できる。

期待値
E[X] = \sum_{j=1}^{K} p_j \mu_j = p_1\mu_1 + p_2\mu_2 + \cdots + p_K\mu_K

【導出】 期待値の定義と確率密度関数の線形性より

\begin{aligned} E[X] &= \int_{-\infty}^{\infty} x f(x) \, dx = \int_{-\infty}^{\infty} x \sum_{j=1}^{K} p_j f_j(x) \, dx \\[5pt] &= \sum_{j=1}^{K} p_j \int_{-\infty}^{\infty} x f_j(x) \, dx = \sum_{j=1}^{K} p_j \mu_j \end{aligned}

分散の計算には、まず E[X^2] を求める。N(\mu_j, \sigma_j^2) に従う確率変数の2次モーメントは \sigma_j^2 + \mu_j^2 であるから

E[X^2] = \sum_{j=1}^{K} p_j (\sigma_j^2 + \mu_j^2)
分散
V[X] = E[X^2] - (E[X])^2 = \sum_{j=1}^{K} p_j (\sigma_j^2 + \mu_j^2) - \left(\sum_{j=1}^{K} p_j \mu_j\right)^2

分散は「各成分の分散の重み付き平均」と「平均の違いによる分散」の和になる。直感的には、混合要素の平均がばらついているほど、全体の分散は大きくなる。

二峰性の条件

2要素の混合正規分布(K = 2)において、二峰性を示すための条件を考える。

最も単純な場合として、p_1 = p_2 = \dfrac{1}{2} かつ \sigma_1 = \sigma_2 = \sigma の場合を考える。このとき確率密度関数は

f(x) = \dfrac{1}{2\sqrt{2\pi}\sigma}\left[\exp\left(-\dfrac{(x-\mu_1)^2}{2\sigma^2}\right) + \exp\left(-\dfrac{(x-\mu_2)^2}{2\sigma^2}\right)\right]

二峰性を示すためには、f(x)x = \dfrac{\mu_1 + \mu_2}{2}(2つの平均の中点)で極小値をとる必要がある。これを解析すると、次の条件が得られる。

二峰性の条件(等混合・等分散の場合)
\dfrac{|\mu_1 - \mu_2|}{\sigma} > 2

2つの平均の差が、共通の標準偏差の2倍より大きいとき二峰性を示す

図1の例で確認すると、単峰性の場合は |0 - 2|/1.5 \approx 1.33 < 2、二峰性の場合は |0 - 4|/1 = 4 > 2 となり、条件と一致している。

ポイント

混合比率や分散が異なる場合、二峰性の条件はより複雑になる。一般に、一方の成分の比率が小さい場合や分散が大きい場合、二峰性が現れにくくなる。

計算例

2要素の混合正規分布で、パラメータが次のように与えられている場合を考える。

p_1 = 0.4, \quad p_2 = 0.6, \quad \mu_1 = 2, \quad \mu_2 = 6, \quad \sigma_1 = 1, \quad \sigma_2 = 2

【期待値の計算】

E[X] = p_1\mu_1 + p_2\mu_2 = 0.4 \times 2 + 0.6 \times 6 = 0.8 + 3.6 = 4.4

【分散の計算】 まず E[X^2] を求める。

\begin{aligned} E[X^2] &= p_1(\sigma_1^2 + \mu_1^2) + p_2(\sigma_2^2 + \mu_2^2) \\[5pt] &= 0.4 \times (1^2 + 2^2) + 0.6 \times (2^2 + 6^2) \\[5pt] &= 0.4 \times 5 + 0.6 \times 40 = 2 + 24 = 26 \end{aligned}
V[X] = E[X^2] - (E[X])^2 = 26 - 4.4^2 = 26 - 19.36 = 6.64

【累積分布関数 F(4) の計算】

\begin{aligned} F(4) &= p_1 \Phi\left(\dfrac{4 - \mu_1}{\sigma_1}\right) + p_2 \Phi\left(\dfrac{4 - \mu_2}{\sigma_2}\right) \\[5pt] &= 0.4 \times \Phi\left(\dfrac{4 - 2}{1}\right) + 0.6 \times \Phi\left(\dfrac{4 - 6}{2}\right) \\[5pt] &= 0.4 \times \Phi(2) + 0.6 \times \Phi(-1) \\[5pt] &\approx 0.4 \times 0.9772 + 0.6 \times 0.1587 \\[5pt] &\approx 0.3909 + 0.0952 = 0.4861 \end{aligned}

練習問題

問1. 混合正規分布のパラメータが p_1 = 0.3, p_2 = 0.7, \mu_1 = 0, \mu_2 = 10, \sigma_1 = 2, \sigma_2 = 3 のとき、期待値 E[X] を求めよ。
E[X] = p_1\mu_1 + p_2\mu_2 = 0.3 \times 0 + 0.7 \times 10 = 0 + 7 = 7
問2. 問1の混合正規分布について、分散 V[X] を求めよ。

まず E[X^2] を計算する。

\begin{aligned} E[X^2] &= p_1(\sigma_1^2 + \mu_1^2) + p_2(\sigma_2^2 + \mu_2^2) \\[5pt] &= 0.3 \times (4 + 0) + 0.7 \times (9 + 100) \\[5pt] &= 0.3 \times 4 + 0.7 \times 109 = 1.2 + 76.3 = 77.5 \end{aligned}
V[X] = E[X^2] - (E[X])^2 = 77.5 - 7^2 = 77.5 - 49 = 28.5
問3. p_1 = p_2 = 0.5, \sigma_1 = \sigma_2 = 2 の混合正規分布が二峰性を示すためには、|\mu_1 - \mu_2| はいくつより大きければよいか。

等混合・等分散の場合の二峰性条件より

\dfrac{|\mu_1 - \mu_2|}{\sigma} > 2

\sigma = 2 を代入すると

|\mu_1 - \mu_2| > 2 \times 2 = 4

よって、2つの平均の差が 4 より大きいとき二峰性を示す。

まとめ

項目 内容
分布名 混合正規分布(Gaussian mixture distribution)
パラメータ p_j(混合比率)、\mu_j(平均)、\sigma_j(標準偏差)
確率密度関数 f(x) = \sum_{j=1}^{K} p_j f_j(x)f_jN(\mu_j, \sigma_j^2) の密度関数
累積分布関数 F(x) = \sum_{j=1}^{K} p_j \Phi\left(\dfrac{x - \mu_j}{\sigma_j}\right)
期待値 E[X] = \sum_{j=1}^{K} p_j \mu_j
分散 V[X] = \sum_{j=1}^{K} p_j (\sigma_j^2 + \mu_j^2) - \left(\sum_{j=1}^{K} p_j \mu_j\right)^2
二峰性条件 \dfrac{|\mu_1 - \mu_2|}{\sigma} > 2(等混合・等分散の場合)
応用 クラスタリング(GMM)、多峰性データのモデリング

Pythonで実装する

Pythonを使って混合正規分布の計算やシミュレーションを行う。

mixture_normal.py
import numpy as np
from scipy import stats

print("=== 混合正規分布 ===")

# パラメータ設定
# 成分1: N(2, 1^2), 混合比率 0.4
# 成分2: N(6, 2^2), 混合比率 0.6
params = [
    {'p': 0.4, 'mu': 2, 'sigma': 1},
    {'p': 0.6, 'mu': 6, 'sigma': 2}
]

# 混合正規分布の確率密度関数
def mixture_pdf(x, params):
    pdf = 0
    for comp in params:
        pdf += comp['p'] * stats.norm.pdf(x, comp['mu'], comp['sigma'])
    return pdf

# 混合正規分布の累積分布関数
def mixture_cdf(x, params):
    cdf = 0
    for comp in params:
        cdf += comp['p'] * stats.norm.cdf(x, comp['mu'], comp['sigma'])
    return cdf

# 理論値の計算
print("\n【理論値】")

# 期待値
E_X = sum(comp['p'] * comp['mu'] for comp in params)
print(f"E[X] = {E_X}")

# E[X^2]
E_X2 = sum(comp['p'] * (comp['sigma']**2 + comp['mu']**2) for comp in params)
print(f"E[X²] = {E_X2}")

# 分散
V_X = E_X2 - E_X**2
print(f"V[X] = {V_X}")

# 累積分布関数
print(f"\nF(4) = {mixture_cdf(4, params):.4f}")

# 確率の計算
print(f"P(X ≤ 3) = {mixture_cdf(3, params):.4f}")
print(f"P(3 < X ≤ 7) = {mixture_cdf(7, params) - mixture_cdf(3, params):.4f}")

# サンプリングによる検証
print("\n【モンテカルロシミュレーション】")
np.random.seed(42)
n_samples = 100000

# 混合分布からのサンプリング
samples = []
for _ in range(n_samples):
    # まず成分を選択
    if np.random.random() < params[0]['p']:
        comp = params[0]
    else:
        comp = params[1]
    # 選択した成分からサンプリング
    samples.append(np.random.normal(comp['mu'], comp['sigma']))

samples = np.array(samples)

print(f"サンプル数: {n_samples}")
print(f"標本平均: {np.mean(samples):.4f} (理論値: {E_X})")
print(f"標本分散: {np.var(samples):.4f} (理論値: {V_X})")
print(f"P(X ≤ 4) ≈ {np.mean(samples <= 4):.4f} (理論値: {mixture_cdf(4, params):.4f})")

# 二峰性の確認
print("\n【二峰性の確認】")
params_bimodal = [
    {'p': 0.5, 'mu': 0, 'sigma': 1},
    {'p': 0.5, 'mu': 4, 'sigma': 1}
]
separation = abs(params_bimodal[0]['mu'] - params_bimodal[1]['mu']) / params_bimodal[0]['sigma']
print(f"μ=(0, 4), σ=1 の場合: |μ1-μ2|/σ = {separation}")
print(f"二峰性条件 (> 2): {'満たす' if separation > 2 else '満たさない'}")
=== 混合正規分布 === 【理論値】 E[X] = 4.4 E[X²] = 26.0 V[X] = 6.640000000000001 F(4) = 0.4861 P(X ≤ 3) = 0.3535 P(3 < X ≤ 7) = 0.4390 【モンテカルロシミュレーション】 サンプル数: 100000 標本平均: 4.3934 (理論値: 4.4) 標本分散: 6.6268 (理論値: 6.640000000000001) P(X ≤ 4) ≈ 0.4869 (理論値: 0.4861) 【二峰性の確認】 μ=(0, 4), σ=1 の場合: |μ1-μ2|/σ = 4.0 二峰性条件 (> 2): 満たす

モンテカルロシミュレーションの結果が理論値とよく一致していることが確認できる。混合正規分布からのサンプリングは、まず混合比率に従って成分を選択し、次に選択した成分からサンプルを生成するという2段階の手順で行う。