Я только что закончил книгу Bayesian Analysis in Python от Osvaldo Martin (отличная книга, чтобы понять байесовские концепции и некоторые фантазии индексации).Как извлечь неконтролируемые кластеры из процесса Дирихле в PyMC3?
Я действительно хочу расширить свое понимание до байесовских моделей смеси для неконтролируемой кластеризации образцов. Все мои поисковые запросы привели меня к Austin Rochford's tutorial, который действительно информативен. Я понимаю, что происходит, но Непонятно, как это можно адаптировать для кластеризации (особенно с использованием нескольких атрибутов для кластерных назначений, но это другая тема).
Я понимаю, как назначить приоритеты для Dirichlet distribution
, но я не могу понять, как получить кластеры в PyMC3
. Похоже, что большинство из mus
сходятся к центроидам (т. Е. Средствам выборок I, отбираемых из), но они все еще являются отдельными components
. Я думал о том, чтобы сделать отсечение для weights
(w
в модели), но это, похоже, не работает так, как я себе представлял, поскольку несколько components
имеют несколько разные средние параметры mus
, которые сходятся.
Как извлечь кластеры (центроиды) из этой модели PyMC3
? Я дал ему максимум 15
компонентов, которые я хочу свести на 3
. mus
, кажется, находятся в правильном месте, но весы перепутаны b/c, они распределяются между другими кластерами, поэтому я не могу использовать порог веса (если я не объединю их, но я не думаю, что так оно и есть обычно делается).
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])
Подобные вопросы ниже
https://stats.stackexchange.com/questions/120209/pymc3-dirichlet-distribution для регрессии и не кластеризацию
https://stats.stackexchange.com/questions/108251/image-clustering-and-dirichlet-process теория о процессе DP
https://stats.stackexchange.com/questions/116311/draw-a-multinomial-distribution-from-a-dirichlet-distribution объясняет DP
Dirichlet process in PyMC 3 направляет меня учебник Остин Рокфорд в выше
Эдвард могут иметь примеры с использованием вариационного вывода для смесей дирихлевых процессов. http://edwardlib.org/ – rafaelvalle
Я проверю его и посмотрю, смогу ли я понять, как его портировать! Благодарю. Я никогда не слышал об Эдварде, но до сих пор кажется классным. –
Это то, что вы ищете? https://pymc-devs.github.io/pymc3/notebooks/dp_mix.html – rafaelvalle