خليط عامل

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

في هذه المفكرة وتبين لنا كيفية استخدام TensorFlow الاحتمالات (TFP) لعينة من خليط مضروب التوزيع 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

قم ببناء المزيج العامل من Gaussians باستخدام 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\)). في المقابل، خليط من توزيع Gaussians في 2D الفضاء \((x_1, x_2)\) يتطلب 2 * 9 = 18 المعلمات لتحديد 9 وسائط.

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

بي إن جي