Clustering com modelo de mistura de processos Dirichlet em Java PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Armazenamento em Cluster com o Modelo de Mistura de Processo Dirichlet em Java

Nos artigos anteriores, discutimos em detalhes o Modelos de Mistura de Processo de Dirichlet e como eles podem ser usados ​​na análise de cluster. Neste artigo, apresentaremos uma implementação Java de dois modelos DPMM diferentes: o Modelo de Mistura Normal Multivariado de Dirichlet que pode ser usado para agrupar dados Gaussianos e o Modelo de Mistura Multinomial de Dirichlet que é usado para agrupar documentos. O código Java é de código aberto sob a licença GPL v3 e pode ser baixado gratuitamente em Github.

Atualização: O Datumbox Machine Learning Framework agora é de código aberto e gratuito para download. Confira o pacote com.datumbox.framework.machinelearning.clustering para ver a implementação de Modelos de Mistura de Processo Dirichlet em Java.

Implementação de Dirichlet Process Mixture Model em Java

O código implementa o Modelo de Mistura de Processo de Dirichlet com Gibbs Sampler e usa o Apache Commons Math 3.3 como uma biblioteca de matriz. Ele é licenciado sob GPLv3, então fique à vontade para usá-lo, modificá-lo e redistribuí-lo gratuitamente e você pode baixar a implementação Java em Github. Observe que você pode encontrar todas as partes teóricas do método de armazenamento em cluster nos 5 artigos anteriores e nos comentários Javadoc detalhados para implementação no código-fonte.

Abaixo, listamos uma descrição de alto nível do código:

1. Classe DPMM

O DPMM é uma classe abstrata e atua como uma base para os vários modelos diferentes, implementa o Processo de restaurante chinês e contém o Amostrador Gibbs recolhido. Possui o método público cluster () que recebe o conjunto de dados na forma de Lista de Pontos e é responsável por realizar a análise de cluster. Outros métodos úteis da classe são getPointAssignments () que é usado para recuperar as atribuições de cluster após a conclusão do cluster e getClusterList () que é usado para obter a lista de clusters identificados. O DPMM contém a classe abstrata aninhada estática Cluster; contém vários métodos abstratos relativos ao gerenciamento dos pontos e à estimativa da fdp posterior que são usados ​​para a estimativa das atribuições de cluster.

2. Classe GaussianDPMM

O GaussianDPMM é a implementação do modelo de mistura normal multivariada de Dirichlet e estende a classe DPMM. Ele contém todos os métodos necessários para estimar as probabilidades sob a suposição gaussiana. Além disso, ele contém a classe aninhada estática Cluster, que implementa todos os métodos abstratos da classe DPMM.Cluster.

3. Classe MultinomialDPMM

O MultinomialDPMM implementa o Dirichlet-Multinomial Mixture Model e estende a classe DPMM. Similarmente à classe GaussianDPMM, ela contém todos os métodos necessários para estimar as probabilidades sob a suposição de Multinomial-Dirichlet e contém a classe aninhada estática Cluster que implementa os métodos abstratos de DPMM.Cluster.

4. Classe SRS

A classe SRS é usada para realizar Amostragem Aleatória Simples a partir de uma tabela de frequência. É usado pelo Gibbs Sampler para estimar as novas atribuições de cluster em cada etapa do processo iterativo.

5. Classe de pontos

A classe Point serve como uma tupla que armazena os dados do registro junto com seu id.

6. Biblioteca de matemática do Apache Commons

A biblioteca Apache Commons Math 3.3 é usada para multiplicações de matrizes e é a única dependência de nossa implementação.

7. Classe DPMMExample

Esta classe contém exemplos de como usar a implementação Java.

Usando a implementação Java

O usuário do código é capaz de configurar todos os parâmetros dos modelos de mistura, incluindo os tipos de modelo e os hiperparâmetros. No seguinte snippet de código, podemos ver como o algoritmo é inicializado e executado:

List<Point> pointList = new ArrayList<>();
//add records in pointList

//Dirichlet Process parameter
Integer dimensionality = 2;
double alpha = 1.0;

//Hyper parameters of Base Function
int kappa0 = 0;
int nu0 = 1;
RealVector mu0 = new ArrayRealVector(new double[]{0.0, 0.0});
RealMatrix psi0 = new BlockRealMatrix(new double[][]{{1.0,0.0},{0.0,1.0}});

//Create a DPMM object
DPMM dpmm = new GaussianDPMM(dimensionality, alpha, kappa0, nu0, mu0, psi0);

int maxIterations = 100;
int performedIterations = dpmm.cluster(pointList, maxIterations);

//get a list with the point ids and their assignments
Map<Integer, Integer> zi = dpmm.getPointAssignments();

Abaixo, podemos ver os resultados da execução do algoritmo em um conjunto de dados sintético que consiste em 300 pontos de dados. Os pontos foram gerados originalmente por 3 distribuições diferentes: N ([10,50], I), N ([50,10], I) e N ([150,100], I).

gráfico de dispersão1
Figura 1: Gráfico de dispersão do conjunto de dados de demonstração

O algoritmo, após rodar por 10 iterações, identificou os seguintes 3 centros de cluster: [10.17, 50.11], [49.99, 10.13] e [149.97, 99.81]. Finalmente, uma vez que tratamos tudo de maneira bayesiana, somos capazes não apenas de fornecer estimativas de um único ponto dos centros do cluster, mas também de sua distribuição de probabilidade usando o Fórmula equação.

mapa de calor de gráfico de dispersão2
Figura 2: Gráfico de dispersão das probabilidades dos centros dos clusters

Na figura acima, representamos essas probabilidades; as áreas vermelhas indicam alta probabilidade de ser o centro de um cluster e as áreas pretas indicam baixa probabilidade.

Para usar a implementação Java em aplicativos do mundo real, você deve escrever um código externo que converta seu conjunto de dados original no formato necessário. Além disso, um código adicional pode ser necessário se você quiser visualizar a saída como vemos acima. Finalmente, observe que a biblioteca Apache Commons Math está incluída no projeto e, portanto, nenhuma configuração adicional é necessária para executar as demos.

Se você usar a implementação em um projeto interessante, entre em contato conosco e apresentaremos seu projeto em nosso blog. Além disso, se você gostou do artigo, por favor, reserve um momento e compartilhe no Twitter ou Facebook.

Carimbo de hora:

Mais de Caixa de dados