Я пытался понять выборку Гиббса в течение некоторого времени. Недавно я видел видео, которое имело большой смысл.
https://www.youtube.com/watch?v=a_08GKWHFWo
Автор использовал выборку Гиббса для сходимости средних значений (theta_1 и theta_2) двумерного нормального распределения, используя следующий процесс:
init: инициализировать theta_2 случайным значением.
Петля:
- образец theta_1, обусловленный theta_2 как N~(p(theta_2), [1-p**2])
- образец theta_2, обусловленный theta_1 как N~(p(theta_1), [1-p**2])
(повторять до сходимости).
Я попробовал это самостоятельно и столкнулся с проблемой:
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
rv = multivariate_normal(mean=[0.5, -0.2], cov=[[1, 0.9], [0.9, 1]])
rv.mean
>>>
array([ 0.5, -0.2])
rv.cov
>>>
array([[1. , 0.9],
[0.9, 1. ]])
import numpy as np
samples = []
curr_t2 = np.random.rand()
def gibbs(iterations=5000):
theta_1 = np.random.normal(curr_t2, (1-0.9**2), None)
theta_2 = np.random.normal(theta_1, (1-0.9**2), None)
samples.append((theta_1,theta_2))
for i in range(iterations-1):
theta_1 = np.random.normal(theta_2, (1-0.9**2), None)
theta_2 = np.random.normal(theta_1, (1-0.9**2), None)
samples.append((theta_1,theta_2))
gibbs()
sum([a for a,b in samples])/len(samples)
>>>
4.745736136676516
sum([b for a,b in samples])/len(samples)
>>>
4.746816908769834
Теперь я вижу, где я накосячил. Я обнаружил, что тета_1 зависит от фактического значения тета_2, а не от его вероятности. Точно так же я обнаружил, что тета_2 зависит от фактического значения тета_1, а не от его вероятности.
Где я застрял, так это в том, как мне оценить вероятность того, что тета примет любое заданное наблюдаемое значение?
Я вижу два варианта: плотность вероятности (на основе положения на нормальной кривой) И p-значение (интегрирование от бесконечности (и/или отрицательной бесконечности) до наблюдаемого значения). Ни одно из этих решений не кажется «правильным».
Как мне поступить?