फैक्टोरियल मिश्रण

TensorFlow.org पर देखें Google Colab में चलाएं GitHub पर स्रोत देखें नोटबुक डाउनलोड करें

इस नोटबुक में हम कैसे उपयोग करने के लिए दिखाने के TensorFlow संभावना : के रूप में परिभाषित Gaussians वितरण की एक भाज्य मिश्रण से नमूना करने के लिए (टीएफपी)\(p(x_1, ..., x_n) = \prod_i p_i(x_i)\) जहां: \(\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*}\)

प्रत्येक चर \(x_i\) Gaussians का मिश्रण है, और सब कुछ खत्म हो संयुक्त वितरण के रूप में मॉडलिंग की है \(n\) चर इन घनत्व का एक उत्पाद है।

एक डाटासेट को देखते हुए \(x^{(1)}, ..., x^{(T)}\), हम प्रत्येक dataponit मॉडल \(x^{(j)}\) Gaussians के भाज्य मिश्रण के रूप में:

\[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.

# 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 । इस 'मेटा-वितरण "एक लागू होता है reduce_sum में log_prob सबसे दायीं ओर से अधिक गणना reinterpreted_batch_ndims बैच आयाम। हमारे मामले में, बाहर चर इस रकम केवल बैच आयाम छोड़ने आयाम जब हम गणना log_prob । ध्यान दें कि यह नमूने को प्रभावित नहीं करता है।

घनत्व प्लॉट करें

बिंदुओं के ग्रिड पर घनत्व की गणना करें, और लाल सितारों के साथ मोड के स्थान दिखाएं। फैक्टोरियल मिश्रण में प्रत्येक मोड गाऊसी के अंतर्निहित व्यक्तिगत-चर मिश्रण से मोड की एक जोड़ी से मेल खाती है। हम नीचे साजिश में 9 मोड देख सकते हैं, लेकिन हम केवल 6 मानकों की जरूरत (3 में मोड के स्थानों को निर्दिष्ट करने के लिए \(x_1\), और 3 में मोड के स्थानों को निर्दिष्ट करने के लिए \(x_2\))। इसके विपरीत, 2 डी अंतरिक्ष में Gaussians वितरण का एक मिश्रण \((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');

पीएनजी

प्लॉट के नमूने और सीमांत घनत्व अनुमान

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$");

पीएनजी