ส่วนผสมแฟกทอเรียล

ในสมุดบันทึกนี้เราจะแสดงวิธีการใช้ TensorFlow ความน่าจะเป็น (TFP) ตัวอย่างจากส่วนผสมปัจจัยของการกระจาย Gaussians หมายถึง:p(x1,...,xn)=ipi(xi) ที่: pi1Kk=1KπikNormal(loc=μik,scale=σik)1=k=1Kπik,i.MMMMMMMMMMM

แต่ละตัวแปร xi เป็นแบบจำลองเป็นส่วนผสมของ Gaussians และร่วมกันจำหน่ายมากกว่าทุก n ตัวแปรเป็นผลิตภัณฑ์ของความหนาแน่นเหล่านี้

ได้รับชุดข้อมูล x(1),...,x(T)เราแต่ละรุ่น dataponit x(j) เป็นส่วนผสม factorial ของ Gaussians:

p(x(j))=ipi(xi(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 เพื่อระบุตำแหน่งของโหมดที่ x1และ 3 เพื่อระบุตำแหน่งของโหมดใน x2) ในทางตรงกันข้ามมีส่วนผสมของการกระจาย Gaussians ในพื้นที่ 2d (x1,x2) จะต้องมี 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');

png

ตัวอย่างพล็อตและการประมาณความหนาแน่นส่วนเพิ่ม

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