ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
ในสมุดบันทึกนี้เราจะแสดงวิธีการใช้ 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)}\) เป็นส่วนผสม factorial ของ 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\)) ในทางตรงกันข้ามมีส่วนผสมของการกระจาย 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$");