ホーム » TensorFlow » TensorFlow Probability : Tutorials : ガウス分布の階乗混合

TensorFlow Probability : Tutorials : ガウス分布の階乗混合

TensorFlow Probability : Tutorials : ガウス分布の階乗混合 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/02/2017

* 本ページは、TensorFlow の本家サイトの TensorFlow Probability – Tutorials の次のページを翻訳した上で
適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

TensorFlow Probability : ガウス分布の階乗混合

この notebook では次のように定義されるガウス分布の階乗混合分布からサンプリングするために TensorFlow Probability (TFP) をどのように使用するかを示します :

$$
p(x_1, …, x_n) = \prod_i p_i(x_i)
$$

ここで:
$$
\begin{align*} p_i &\equiv \frac{1}{K}\sum_{i=1}^K \pi_{ik}\,\text{Normal}\left(\text{loc}=\mu_{ik},\, \text{scale}=\sigma_{ik}\right)\\1&=\sum_{k=1}^K\pi_{ik}, \forall i.\hphantom{MMMMMMMMMMM}\end{align*}
$$

各変数 $x_i$ はガウス分布の混合としてモデル化され、そして総ての $n$ 変数に渡る結合分布はこれらの密度の積です。

データセット $x^{(1)}, …, x^{(T)}$ が与えられたとき、各データポイント $x^{(j)}$ をガウス分布の階乗混合としてモデル化します :
$$
p(x^{(j)}) = \prod_i p_i (x_i^{(j)})
$$

階乗混合は小さい数のパラメータと巨大な数のモードを持つ分布を作成する単純な方法です。

import tensorflow as tf
import numpy as np
import tensorflow_probability as tfp
import matplotlib.pyplot as plt
import seaborn as sns
tfd = tfp.distributions

# Use try/except so we can easily re-execute the whole notebook.
try:
  tf.enable_eager_execution()
except:
  pass

 

TFP を使用してガウス分布の階乗混合を構築する

num_vars = 2        # Number of variables (`n` in formula).
var_dim = 1         # Dimensionality of each variable `x[i]`.
num_components = 3  # Number of components for each mixture (`K` in formula).
sigma = 5e-2        # Fixed standard deviation of each component.

# Set seed. Remove this line to generate different mixtures!
tf.set_random_seed(77)

# Choose some random (component) modes.
component_mean = tfd.Uniform().sample([num_vars, num_components, var_dim])

factorial_mog = tfd.Independent(
   tfd.MixtureSameFamily(
       # Assume uniform weight on each component.
       mixture_distribution=tfd.Categorical(
           logits=tf.zeros([num_vars, num_components])),
       components_distribution=tfd.MultivariateNormalDiag(
           loc=component_mean, scale_diag=[sigma])),
   reinterpreted_batch_ndims=1)

tfd.Independent の使用に注意してください。この「メタ分布」は右端の reinterpreted_batch_ndims バッチ次元に渡る log_prob 計算内で reduce_sum を適用します。私達のケースでは、log_prob を計算するときこれはバッチ次元だけを残して variables 次元を総計します。

 

密度をプロットする

点のグリッド上で密度を計算して赤い星でモデルの位置を示します。階乗混合の各モードはガウス分布の基礎的な individual-variable 混合からのモードのペアに対応します。下のプロットでは 9 モードを見て取れますが、6 パラメータだけが必要でした ($x_1$ のモードの位置を指定するために 3 つと、$x_2$ のモードの位置を指定するために 3 つです)。対照的に、2d 空間 $(x_1, x_2)$ のガウス分布の混合は 9 モードを指定するために 2 * 9 = 18 パラメータを必要とするでしょう。

plt.figure(figsize=(6,5))

# Compute density.
nx = 250 # Number of bins per dimension.
x = np.linspace(-3 * sigma, 1 + 3 * sigma, nx).astype('float32')
vals = tf.reshape(tf.stack(np.meshgrid(x, x), axis=2), (-1, num_vars, var_dim))
probs = factorial_mog.prob(vals).numpy().reshape(nx, nx)

# Display as image.
from matplotlib.colors import ListedColormap
cmap = ListedColormap(sns.color_palette("Blues", 256))
p = plt.pcolor(x, x, probs, cmap=cmap)
ax = plt.axis('tight');

# Plot locations of means.
means_np = component_mean.numpy().squeeze()
for mu_x in means_np[0]:
  for mu_y in means_np[1]:
    plt.scatter(mu_x, mu_y, s=150, marker='*', c='r', edgecolor='none');
plt.axis(ax);

plt.xlabel('$x_1$')
plt.ylabel('$x_2$')
plt.title('Density of factorial mixture of Gaussians');

Plot samples and marginal density estimates

samples = factorial_mog.sample(1000).numpy()

g = sns.jointplot(
    x=samples[:, 0, 0],
    y=samples[:, 1, 0],
    kind="scatter",
    stat_func=None,
    marginal_kws=dict(bins=50))
g.set_axis_labels("$x_1$", "$x_2$");

 

以上






AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com