Я только что закончил Байесовский анализ в Python в книге Освальдо Мартин (отличная книга, чтобы понять байесовские концепции и некоторые фантазии индексации).
Я действительно хочу расширить свое понимание до байесовских моделей смеси для неконтролируемой кластеризации образцов. Все мои поисковые запросы привели меня в учебник Austin Rochford, который действительно информативен. Я понимаю, что происходит, но Я не понимаю, как это можно адаптировать для кластеризации (особенно с использованием нескольких атрибутов для кластерных назначений, но это другая тема).
Я понимаю, как назначить priors для 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/info/120209/pymc3-dirichlet-distribution для регрессии, а не кластеризации
https://stats.stackexchange.com/info/108251/image-clustering-and-dirichlet-process теория процесса DP
https://stats.stackexchange.com/info/116311/draw-a-multinomial-distribution-from-a-dirichlet-distribution объясняет DP
Процесс Дирихле в PyMC 3 направляет меня в учебник Остина Рочфорда выше