Faktöriyel Karışım

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Bu elkitabında nasıl kullanılacağını gösterir TensorFlow Olasılık : olarak tanımlanan Gauss dağılımının bir faktöriyel Karışımından numuneye (TFP)\(p(x_1, ..., x_n) = \prod_i p_i(x_i)\) burada: \(\begin{align*} p_i &\equiv \frac{1}{K}\sum_{k=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*}\)

Her bir değişken \(x_i\) Gauss bir karışımı, ve üzerinde ortak dağıtımı olarak modellenmiştir \(n\) değişkenleri, bu yoğunlukların bir üründür.

Bir veri kümesi verilen \(x^{(1)}, ..., x^{(T)}\), her dataponit modellemek \(x^{(j)}\) Gauss bir faktöriyel karışımı olarak:

\[p(x^{(j)}) = \prod_i p_i (x_i^{(j)})\]

Faktöriyel karışımlar, az sayıda parametre ve çok sayıda mod ile dağılımlar oluşturmanın basit bir yoludur.

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 kullanarak Gaussların Faktöriyel Karışımını Oluşturun

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.

# 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)

Bizim kullanımına dikkat tfd.Independent . Bu "üst-dağılımı" terimi, bir uygulanır reduce_sum içinde log_prob en sağdaki fazla hesaplama reinterpreted_batch_ndims parti boyutları. Hesapladığımız zaman Bizim durumumuzda, değişkenler üzerinden bu meblağlar sadece toplu boyut bırakarak boyutlarıyla log_prob . Bunun örneklemeyi etkilemediğini unutmayın.

Yoğunluğu Çiz

Yoğunluğu bir nokta ızgarası üzerinde hesaplayın ve modların yerlerini kırmızı yıldızlarla gösterin. Faktöriyel karışımdaki her mod, temeldeki Gaussian bireysel değişken karışımından bir çift moda karşılık gelir. Aşağıda arsa 9 modlarını görebilirsiniz, ama biz sadece 6 parametre gerekli (içinde modların konumlarını belirlemek için 3 \(x_1\)ve 3'te modları yerlerini belirtmek için \(x_2\)). Bunun aksine, 2. alanı içinde Gauss dağılımının bir karışımı \((x_1, x_2)\) 9 modları belirtmek için 2 x 9 = 18 parametreleri gerektirecektir.

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');

png

Arsa örnekleri ve marjinal yoğunluk tahminleri

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

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

png