方向データを表現するために、フォンミーゼス・フィッシャー分布(Von Mises-Fisher Distribution)と呼ばれる確率分布があります。この分布は、方向データをモデリングする際に広く使われており、自然言語処理の文書分類や地球科学、天文学など多くの分野で活用されています。
通常の正規分布が実数直線上のデータに対する分布であるのに対し、フォンミーゼス・フィッシャー分布は単位球面上のデータに対する分布です。
本記事の内容
- フォンミーゼス・フィッシャー分布の定義
- パラメータの直感的な意味
- 2次元の特殊ケース(フォンミーゼス分布)
- Python での可視化
前提知識
- ベクトルの内積とノルムの基本
- 正規分布の基本的な知識
フォンミーゼス・フィッシャー分布の定義
$M$ 次元の単位球面 $S^{M-1} = \{\bm{x} \in \mathbb{R}^M : \|\bm{x}\| = 1\}$ 上の確率分布として、フォンミーゼス・フィッシャー分布は次のように定義されます。
$$ \begin{equation} \mathcal{M}(\bm{x}|\bm{\mu}, \kappa) = \frac{\kappa^{M/2-1}}{(2\pi)^{M/2} I_{M/2-1}(\kappa)} \exp(\kappa \bm{\mu}^T \bm{x}) \end{equation} $$
ここで、
- $\bm{x} \in S^{M-1}$:単位球面上のデータ点($\|\bm{x}\| = 1$)
- $\bm{\mu} \in S^{M-1}$:平均方向ベクトル($\|\bm{\mu}\| = 1$)
- $\kappa \geq 0$:集中度パラメータ
- $I_{M/2-1}(\kappa)$:第1種変形ベッセル関数
パラメータの意味
平均方向 $\bm{\mu}$
$\bm{\mu}$ は分布の「中心」に相当する方向を表します。データ点は $\bm{\mu}$ の方向に集中する傾向があります。
集中度パラメータ $\kappa$
$\kappa$ は分布の集中度を制御します。
- $\kappa = 0$:球面上の一様分布(すべての方向に等しい確率)
- $\kappa$ が大きい:$\bm{\mu}$ の周りに強く集中
- $\kappa \to \infty$:デルタ関数的に $\bm{\mu}$ に集中
正規分布における精度パラメータ $1/\sigma^2$ に相当します。
第1種変形ベッセル関数
正規化定数に現れる $I_\nu(\kappa)$ は、
$$ \begin{equation} I_\nu(\kappa) = \frac{(\kappa/2)^\nu}{\sqrt{\pi} \Gamma(\nu + 1/2)} \int_0^\pi e^{\kappa\cos\theta} \sin^{2\nu}\theta \, d\theta \end{equation} $$
で定義されます。scipy では scipy.special.iv で計算できます。
2次元の場合: フォンミーゼス分布
$M = 2$ のとき、単位円上の分布となり、角度 $\theta$ のパラメトリゼーションで、
$$ \begin{equation} f(\theta|\mu, \kappa) = \frac{1}{2\pi I_0(\kappa)} \exp(\kappa \cos(\theta – \mu)) \end{equation} $$
これはフォンミーゼス分布(Von Mises Distribution)と呼ばれ、「円上の正規分布」と考えることができます。
正規分布との関係
$\kappa$ が十分大きいとき、フォンミーゼス分布は平均方向 $\mu$ を中心とした正規分布に近似できます。
$$ f(\theta|\mu, \kappa) \approx \sqrt{\frac{\kappa}{2\pi}} \exp\left(-\frac{\kappa(\theta – \mu)^2}{2}\right) $$
Python での可視化
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import iv as bessel_iv
# フォンミーゼス分布のPDF
def von_mises_pdf(theta, mu, kappa):
return np.exp(kappa * np.cos(theta - mu)) / (2 * np.pi * bessel_iv(0, kappa))
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
theta = np.linspace(-np.pi, np.pi, 500)
mu = 0
# 左: 異なるkappaでのPDF
ax1 = axes[0]
for kappa in [0, 1, 3, 10, 30]:
pdf = von_mises_pdf(theta, mu, kappa)
ax1.plot(theta, pdf, linewidth=2, label=f'kappa={kappa}')
ax1.set_xlabel('theta', fontsize=12)
ax1.set_ylabel('f(theta)', fontsize=12)
ax1.set_title('Von Mises Distribution (mu=0)', fontsize=13)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
# 中央: 極座標でのプロット
ax2 = axes[1]
ax2 = plt.subplot(132, projection='polar')
for kappa in [1, 5, 20]:
theta_polar = np.linspace(0, 2*np.pi, 500)
pdf = von_mises_pdf(theta_polar, 0, kappa)
ax2.plot(theta_polar, pdf, linewidth=2, label=f'kappa={kappa}')
ax2.set_title('Von Mises (Polar Plot)', fontsize=12, pad=20)
ax2.legend(loc='lower right', fontsize=9)
# 右: 3次元球面上の分布(射影)
ax3 = axes[2]
np.random.seed(42)
n_samples = 2000
# kappa=10でのサンプリング(近似: 3次元vMF分布)
kappa_3d = 10
mu_3d = np.array([1, 0, 0])
# 簡易サンプリング(棄却法)
samples = []
while len(samples) < n_samples:
# 球面上の一様分布からサンプル
z = np.random.randn(3)
z = z / np.linalg.norm(z)
# 受理確率
log_prob = kappa_3d * np.dot(mu_3d, z)
if np.log(np.random.uniform()) < log_prob - kappa_3d:
samples.append(z)
samples = np.array(samples)
colors = samples @ mu_3d # muとの内積で色付け
sc = ax3.scatter(samples[:, 1], samples[:, 2], c=colors, cmap='Reds', s=5, alpha=0.5)
ax3.set_xlabel('y', fontsize=12)
ax3.set_ylabel('z', fontsize=12)
ax3.set_title('vMF Samples on Sphere (projected, kappa=10)', fontsize=12)
ax3.set_aspect('equal')
plt.colorbar(sc, ax=ax3, label='cos(angle with mu)')
ax3.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
左のグラフでは $\kappa$ が大きくなるほど分布が集中すること、中央の極座標プロットでは方向性が視覚的に確認できます。
応用例
- 自然言語処理: TF-IDFベクトルを正規化して単位球面上に配置し、文書のクラスタリングに利用
- 地球科学: 地磁気データの方向分布のモデリング
- コンピュータビジョン: 特徴量の方向ベクトルのモデリング
まとめ
本記事では、フォンミーゼス・フィッシャー分布について解説しました。
- フォンミーゼス・フィッシャー分布は単位球面上の確率分布であり、方向データのモデリングに使われる
- 平均方向 $\bm{\mu}$ と集中度 $\kappa$ の2つのパラメータで特徴づけられる
- $\kappa = 0$ で球面一様分布、$\kappa$ が大きいほど $\bm{\mu}$ の周りに集中する
- 2次元の特殊ケースはフォンミーゼス分布(円上の正規分布)と呼ばれる
次のステップとして、以下の記事も参考にしてください。