Gaussian'ın Bayes Karışımına stokastik varyasyon çıkarımının uygulanması


9

Bunu izleyen stokastik varyasyon çıkarsama ile Gauss Karışım modeli uygulamak çalışıyorum kağıt .

resim açıklamasını buraya girin

Bu Gauss Karışımının pgm'si.

Makaleye göre, stokastik varyasyon çıkarımının tam algoritması: resim açıklamasını buraya girin

Ve hala GMM'ye ölçeklendirme yönteminden çok kafam karıştı.

İlk olarak, yerel varyasyon parametresinin sadece ve diğerlerinin de tüm global parametreler olduğunu düşündüm . Eğer yanılmışsam lütfen beni düzeltin. Adım 6 ne anlama geliyor ? Bunu başarmak için ne yapmam gerekiyor?qzas though Xi is replicated by N times

Bana bu konuda yardımcı olabilir misiniz? Şimdiden teşekkürler!


Veri kümesinin tamamını kullanmak yerine, bir veri noktasını örnekleyin ve aynı boyutta veri noktanız olduğunu iddia edin . Çoğu durumda bu, bir beklenti ile bir veri noktasının ile çarpılmasına eşdeğer olacaktır . NN
Daeyoung Lim

@DaeyoungLim Cevabınız için teşekkürler! Şimdi ne demek istediğini anladım, ancak hala hangi istatistiklerin yerel olarak güncellenmesi ve hangilerinin küresel olarak güncellenmesi gerektiği konusunda kafam karıştı. Örneğin , Gauss karışımının bir uygulaması , svi ile nasıl ölçeklendirileceğini söyleyebilir misiniz? Biraz kayboldum. Çok teşekkürler!
user5779223

Kodun tamamını okumadım ama bir Gauss karışım modeli ile uğraşıyorsanız, karışım bileşeni gösterge değişkenleri yerel değişkenler olmalıdır, çünkü her biri sadece bir gözlemle ilişkilidir. Bu nedenle, Multinoulli dağılımını (ML'de Kategorik dağılım olarak da bilinir) takip eden karışım bileşeni gizli değişkenleri z_Yukarıdaki açıklamanızdazi,i=1,,N
Daeyoung Lim

@DaeyoungLim Evet, şimdiye kadar ne dediğini anlıyorum. Dolayısıyla varyasyonel dağılım için q (Z) q (\ pi, \ mu, \ lambda), q (Z) yerel değişken olmalıdır. Ancak q (Z) ile ilişkili birçok parametre vardır. Öte yandan, q (\ pi, \ mu, \ lambda) ile ilişkili birçok parametre de vardır. Bunları nasıl güncelleyeceğimi bilmiyorum.
user5779223

Varyasyonel parametreler için en uygun varyasyon dağılımlarını elde etmek için ortalama alan varsayımını kullanmalısınız. İşte bir referans: maths.usyd.edu.au/u/jormerod/JTOpapers/Ormerod10.pdf
Daeyoung Lim

Yanıtlar:



1

İlk olarak, SVI belgesini anlamama yardımcı olan birkaç not:

  • Genel parametrelerin varyasyonel parametresi için ara değeri hesaplarken, bir veri noktası örnekliyoruz ve boyutundaki tüm veri setimizin kez tek nokta olduğunu iddia ediyoruz .NN
  • ηg , global değişkenin tam koşulunun doğal parametresidir . Gösterim, gözlemlenen veriler de dahil olmak üzere koşullu değişkenlerin bir işlevi olduğunu vurgulamak için kullanılır. β

Gaussian'ların bir karışımında, global parametrelerimiz her biri için ortalama ve kesinlik (ters varyans) parametreleri parametreleridir. Yani, bu dağılımın doğal parametresidir, formun Normal Gamakμk,τkηg

μ,τN(μ|γ,τ(2α1)Ga(τ|α,β)

ile , ve . (Bernardo ve Smith, Bayesian Teorisi ; bunun yaygın olarak göreceğiniz dört parametreli Normal-Gamma'dan biraz farklı olduğunu unutmayın .) için varyasyon parametrelerine başvurmak için kullanacağızη0=2α1η1=γ(2α1)η2=2β+γ2(2α1)a,b,mα,β,μ

Tam koşullu ile normal-Gamma olan parametreler , , , burada . ( Oradaki da kafa karıştırıcı olabilir; uygulanan numarasından başlamak mantıklıdır ve okuyucuya adil bir miktarda cebir ile biten.)μk,τkη˙+Nzn,kNzn,kxNNzn,kxn2η˙zn,kexpln(p))Np(xn|zn,α,β,γ)=NK(p(xn|αk,βk,γk))zn,k

Bununla, SVI sözde kodunun (5) adımını şu şekilde tamamlayabiliriz:

ϕn,kexp(ln(π)+Eqln(p(xn|αk,βk,γk))=exp(ln(π)+Eq[μkτk,τ2x,x2μ2τlnτ2)]

Genel parametrelerin güncellenmesi daha kolaydır, çünkü her parametre bir veri sayısına veya yeterli istatistiklerinden birine karşılık gelir:

λ^=η˙+Nϕn1,x,x2

Çok yapay, kolayca ayrılabilen veriler üzerinde eğitildiğinde, verilerin çok sayıda yinelemede marjinal olasılığı şöyle görünür (aşağıdaki kod). İlk grafik, başlangıçtaki, rastgele varyasyonel parametreler ve yinelemeleri olan olasılığı gösterir ; sonraki her iki yinelemenin bir sonraki gücünden sonra gelir. Kodda, için varyasyon parametrelerine başvurur .0a,b,mα,β,μ

resim açıklamasını buraya girin

resim açıklamasını buraya girin

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Aug 12 12:49:15 2018

@author: SeanEaster
"""

import numpy as np
from matplotlib import pylab as plt
from scipy.stats import t
from scipy.special import digamma 

# These are priors for mu, alpha and beta

def calc_rho(t, delay=16,forgetting=1.):
    return np.power(t + delay, -forgetting)

m_prior, alpha_prior, beta_prior = 0., 1., 1.
eta_0 = 2 * alpha_prior - 1
eta_1 = m_prior * (2 * alpha_prior - 1)
eta_2 = 2 *  beta_prior + np.power(m_prior, 2.) * (2 * alpha_prior - 1)

k = 3

eta_shape = (k,3)
eta_prior = np.ones(eta_shape)
eta_prior[:,0] = eta_0
eta_prior[:,1] = eta_1
eta_prior[:,2] = eta_2

np.random.seed(123) 
size = 1000
dummy_data = np.concatenate((
        np.random.normal(-1., scale=.25, size=size),
        np.random.normal(0.,  scale=.25,size=size),
        np.random.normal(1., scale=.25, size=size)
        ))
N = len(dummy_data)
S = 1

# randomly init global params
alpha = np.random.gamma(3., scale=1./3., size=k)
m = np.random.normal(scale=1, size=k)
beta = np.random.gamma(3., scale=1./3., size=k)

eta = np.zeros(eta_shape)
eta[:,0] = 2 * alpha - 1
eta[:,1] = m * eta[:,0]
eta[:,2] = 2. * beta + np.power(m, 2.) * eta[:,0]


phi = np.random.dirichlet(np.ones(k) / k, size = dummy_data.shape[0])

nrows, ncols = 4, 5
total_plots = nrows * ncols
total_iters = np.power(2, total_plots - 1)
iter_idx = 0

x = np.linspace(dummy_data.min(), dummy_data.max(), num=200)

while iter_idx < total_iters:

    if np.log2(iter_idx + 1) % 1 == 0:

        alpha = 0.5 * (eta[:,0] + 1)
        beta = 0.5 * (eta[:,2] - np.power(eta[:,1], 2.) / eta[:,0])
        m = eta[:,1] / eta[:,0]
        idx = int(np.log2(iter_idx + 1)) + 1

        f = plt.subplot(nrows, ncols, idx)
        s = np.zeros(x.shape)
        for _ in range(k):
            y = t.pdf(x, alpha[_], m[_], 2 * beta[_] / (2 * alpha[_] - 1))
            s += y
            plt.plot(x, y)
        plt.plot(x, s)
        f.axes.get_xaxis().set_visible(False)
        f.axes.get_yaxis().set_visible(False)

    # randomly sample data point, update parameters
    interm_eta = np.zeros(eta_shape)
    for _ in range(S):
        datum = np.random.choice(dummy_data, 1)

        # mean params for ease of calculating expectations
        alpha = 0.5 * ( eta[:,0] + 1)
        beta = 0.5 * (eta[:,2] - np.power(eta[:,1], 2) / eta[:,0])
        m = eta[:,1] / eta[:,0]

        exp_mu = m
        exp_tau = alpha / beta 
        exp_tau_m_sq = 1. / (2 * alpha - 1) + np.power(m, 2.) * alpha / beta
        exp_log_tau = digamma(alpha) - np.log(beta)


        like_term = datum * (exp_mu * exp_tau) - np.power(datum, 2.) * exp_tau / 2 \
            - (0.5 * exp_tau_m_sq - 0.5 * exp_log_tau)
        log_phi = np.log(1. / k) + like_term
        phi = np.exp(log_phi)
        phi = phi / phi.sum()

        interm_eta[:, 0] += phi
        interm_eta[:, 1] += phi * datum
        interm_eta[:, 2] += phi * np.power(datum, 2.)

    interm_eta = interm_eta * N / S
    interm_eta += eta_prior

    rho = calc_rho(iter_idx + 1)

    eta = (1 - rho) * eta + rho * interm_eta

    iter_idx += 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.