Właśnie ukończyłem książkę Bayesian Analysis in Python autorstwa Osvaldo Martin (świetna książka do zrozumienia pojęć bayesowskich i fantazyjnych indeksów numpy).Jak wyodrębnić nienadzorowane klastry z procesu Dirichlet w PyMC3?
Naprawdę chcę rozszerzyć moje zrozumienie na bayesowskie modele miksowania dla nienadzorowanego grupowania próbek. Wszystkie moje wyszukiwania google doprowadziły mnie do Austin Rochford's tutorial, która jest naprawdę pouczająca. Rozumiem, co się dzieje, ale Nie jestem jasne, w jaki sposób można go dostosować do klastrowania (zwłaszcza przy użyciu wielu atrybutów dla przypisania klastra, ale to jest inny temat).
Rozumiem, jak przypisywać priors dla Dirichlet distribution
, ale nie mogę dowiedzieć się, jak uzyskać klastry w PyMC3
. Wygląda na to, że większość z mus
zbiegają się do centroidów (tj. Środków z dystrybucji, z których próbkowałem), ale nadal są one oddzielne components
. Pomyślałem o zrobieniu cutoff dla weights
(w
w modelu), ale nie wydaje się działać tak, jak sobie wyobrażałem, ponieważ wiele components
mają nieco różniące się średnie parametry mus
, które są zbieżne.
Jak mogę wyodrębnić klastry (centroidy) z tego modelu PyMC3
? Dałem mu maksymalnie 15
komponentów, które chcę zjednoczyć do 3
. mus
wydaje się być we właściwym miejscu, ale wagi są pomieszane b/c są one dystrybuowane między innymi klastrami, więc nie mogę użyć progu wagi (chyba że je scalę, ale nie sądzę, że tak to jest zwykle jest zrobione).
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt
import multiprocessing
import seaborn as sns
import pandas as pd
import theano.tensor as tt
%matplotlib inline
# Clip at 15 components
K = 15
# Create mixture population
centroids = [0, 10, 50]
weights = [(2/5),(2/5),(1/5)]
mix_3 = np.concatenate([np.random.normal(loc=centroids[0], size=int(150*weights[0])), # 60 samples
np.random.normal(loc=centroids[1], size=int(150*weights[1])), # 60 samples
np.random.normal(loc=centroids[2], size=int(150*weights[2]))])# 30 samples
n = mix_3.size
# Create and fit model
with pm.Model() as Mod_dir:
alpha = pm.Gamma('alpha', 1., 1.)
beta = pm.Beta('beta', 1., alpha, shape=K)
w = pm.Deterministic('w', beta * tt.concatenate([[1], tt.extra_ops.cumprod(1 - beta)[:-1]]))
component = pm.Categorical('component', w, shape=n)
tau = pm.Gamma("tau", 1.0, 1.0, shape=K)
mu = pm.Normal('mu', 0, tau=tau, shape=K)
obs = pm.Normal('obs',
mu[component],
tau=tau[component],
observed=mix_3)
step1 = pm.Metropolis(vars=[alpha, beta, w, tau, mu, obs])
# step2 = pm.CategoricalGibbsMetropolis(vars=[component])
step2 = pm.ElemwiseCategorical([component], np.arange(K)) # Much, much faster than the above
tr = pm.sample(1e4, [step1, step2], njobs=multiprocessing.cpu_count())
#burn-in = 1000, thin by grabbing every 5th idx
pm.traceplot(tr[1e3::5])
Podobne pytania poniżej
https://stats.stackexchange.com/questions/120209/pymc3-dirichlet-distribution dla regresji i nie grupowanie
https://stats.stackexchange.com/questions/108251/image-clustering-and-dirichlet-process teoria na temat procesu DP
Dirichlet process in PyMC 3 kieruje mnie do samouczka Austin Rochford w powyższym
Edward może mieć przykłady z wykorzystaniem wnioskowania wariacyjnego dla mieszanin procesowych dirichletu. http://edwardlib.org/ – rafaelvalle
Zły sprawdzam to i sprawdzam, czy mogę wymyślić jak go przenieść! Dzięki. Nigdy nie słyszałem o Edwardu, ale jak dotąd wydaje się fajne. –
Czy tego szukasz? https://pymc-devs.github.io/pymc3/notebooks/dp_mix.html – rafaelvalle