Áp dụng suy luận đa dạng ngẫu nhiên cho hỗn hợp Bayes của Gaussian


9

Tôi đang cố gắng thực hiện mô hình Hỗn hợp Gaussian với suy luận đa dạng ngẫu nhiên, theo bài viết này .

nhập mô tả hình ảnh ở đây

Đây là pgm của hỗn hợp Gaussian.

Theo bài báo, thuật toán đầy đủ của suy luận biến thiên ngẫu nhiên là: nhập mô tả hình ảnh ở đây

Và tôi vẫn còn rất bối rối về phương pháp mở rộng nó thành GMM.

Đầu tiên, tôi nghĩ rằng tham số biến thiên cục bộ chỉ là qz và các tham số khác là tất cả các tham số toàn cục. Xin hãy sửa tôi nếu tôi sai. Bước 6 có nghĩa là as though Xi is replicated by N timesgì? Tôi phải làm gì để đạt được điều này?

Bạn có thể vui lòng giúp tôi điều này được không? Cảm ơn trước!


Có nghĩa là thay vì sử dụng toàn bộ tập dữ liệu, hãy lấy một mẫu dữ liệu và giả vờ bạn có datapoint có cùng kích thước. Trong nhiều trường hợp, đây sẽ là tương đương với nhân một kỳ vọng với một datapoint bởi N . NN
Daeyoung Lim

@DaeyoungLim Cảm ơn bạn đã trả lời! Tôi đã hiểu ý của bạn bây giờ, nhưng tôi vẫn bối rối rằng số liệu thống kê nào sẽ được cập nhật cục bộ và số liệu nào sẽ được cập nhật trên toàn cầu. Ví dụ, đây là một triển khai hỗn hợp của Gaussian, bạn có thể cho tôi biết làm thế nào để mở rộng nó thành svi? Tôi hơi lạc lõng. Cảm ơn rất nhiều!
user5779223

Tôi đã không đọc toàn bộ mã nhưng nếu bạn đang xử lý một mô hình hỗn hợp Gaussian, các biến chỉ báo thành phần hỗn hợp sẽ là các biến cục bộ vì mỗi biến được liên kết với chỉ một quan sát. Vì vậy, các biến tiềm ẩn thành phần hỗn hợp tuân theo phân phối Multinoulli (còn được gọi là phân phối Phân loại trong ML) là trong mô tả của bạn ở trên. zi,i=1,,N
Daeyoung Lim

@DaeyoungLim Vâng, tôi hiểu những gì bạn nói cho đến nay. Vì vậy, đối với phân phối biến thiên q (Z) q (\ pi, \ mu, \ lambda), q (Z) phải là biến cục bộ. Nhưng có rất nhiều tham số liên quan đến q (Z). Mặt khác, cũng có nhiều tham số liên quan đến q (\ pi, \ mu, \ lambda). Và tôi không biết làm thế nào để cập nhật chúng một cách thích hợp.
dùng5779223

Bạn nên sử dụng giả định trường trung bình để có được các phân phối biến thể tối ưu cho các tham số biến thiên. Đây là một tài liệu tham khảo: maths.usyd.edu.au/u/jormerod/JTOauge/Ormerod10.pdf
Daeyoung Lim

Câu trả lời:



1

Đầu tiên, một vài lưu ý giúp tôi hiểu ý nghĩa của bài báo SVI:

  • NN
  • ηgβ

kμk,τkηg

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

η0=2α1η1=γ(2α1)η2=2β+γ2(2α1)a,b,mα,β,μ

Các điều kiện đầy đủ các là bình thường-Gamma với params ˙ η + Σ N z n , k ) ) Bí quyết áp dụng choμk,τkη˙+Nzn,kNzn,kxNNzn,kxn2η˙zn,kexpln(p))Np(xn|zn,α,β,γ)=NK(p(xn|αk,βk,γk))zn,k

Với điều đó, chúng ta có thể hoàn thành bước (5) của mã giả SVI với:

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

Cập nhật các tham số toàn cầu dễ dàng hơn, vì mỗi tham số tương ứng với số lượng dữ liệu hoặc một trong những thống kê đầy đủ của nó:

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

0a,b,mα,β,μ

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.