Clustering con Dirichlet Process Mixture Model en Java PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Agrupación con el modelo de mezcla de procesos Dirichlet en Java

En los artículos anteriores discutimos en detalle el Modelos de mezcla de proceso de Dirichlet y cómo se pueden usar en el análisis de conglomerados. En este artículo presentaremos una implementación Java de dos modelos DPMM diferentes: el modelo de mezcla normal multivariada de Dirichlet que se puede usar para agrupar datos gaussianos y el modelo de mezcla multinomial de Dirichlet que se usa para agrupar documentos. El código Java es de código abierto bajo licencia GPL v3 y se puede descargar libremente desde Github.

Actualización: el marco de aprendizaje automático de Datumbox ahora es de código abierto y gratuito para descargar. Consulte el paquete com.datumbox.framework.machinelearning.clustering para ver la implementación de los modelos de mezcla de procesos de Dirichlet en Java.

Implementación del modelo de mezcla de procesos Dirichlet en Java

El código implementa el modelo de mezcla de procesos Dirichlet con Gibbs Sampler y utiliza Apache Commons Math 3.3 como una biblioteca matricial. Está licenciado bajo GPLv3, así que siéntase libre de usarlo, modificarlo y redistribuirlo libremente y puede descargar la implementación de Java desde Github. Tenga en cuenta que puede encontrar todas las partes teóricas del método de agrupamiento en los 5 artículos anteriores y comentarios detallados de Javadoc para su implementación en el código fuente.

A continuación, enumeramos una descripción de alto nivel en el código:

1. clase DPMM

El DPMM es una clase abstracta y actúa como una base para los diferentes modelos, implementa el Proceso de restaurante chino y contiene el Muestra de Gibbs contraída. Tiene el método público cluster () que recibe el conjunto de datos como una lista de puntos y es responsable de realizar el análisis del cluster. Otros métodos útiles de la clase son getPointAssignments () que se usa para recuperar las asignaciones de clústeres después de que se completa el clúster y getClusterList () que se usa para obtener la lista de clústeres identificados. El DPMM contiene el clúster de clase abstracta anidada estática; contiene varios métodos abstractos relacionados con la gestión de los puntos y la estimación de la pdf posterior que se utilizan para la estimación de las asignaciones de clústeres.

2. Clase GaussianDPMM

GaussianDPMM es la implementación del modelo de mezcla normal multivariante de Dirichlet y extiende la clase DPMM. Contiene todos los métodos necesarios para estimar las probabilidades bajo el supuesto gaussiano. Además, contiene la clase anidada estática Cluster que implementa todos los métodos abstractos de la clase DPMM.Cluster.

3. Clase MultinomialDPMM

MultinomialDPMM implementa el modelo Dirichlet-Multinomial Mixture y extiende la clase DPMM. De manera similar a la clase GaussianDPMM, contiene todos los métodos necesarios para estimar las probabilidades bajo el supuesto Multinomial-Dirichlet y contiene el clúster de clase anidada estática que implementa los métodos abstractos de DPMM.Cluster.

4. clase SRS

La clase SRS se utiliza para realizar un muestreo aleatorio simple desde una tabla de frecuencias. El Gibbs Sampler lo utiliza para estimar las nuevas asignaciones de clúster en cada paso del proceso iterativo.

5. Clase de puntos

La clase Point sirve como una tupla que almacena los datos del registro junto con su id.

6. Librería matemática de Apache Commons

La biblioteca Apache Commons Math 3.3 se utiliza para las multiplicaciones de Matrix y es la única dependencia de nuestra implementación.

7. Clase DPMMExample

Esta clase contiene ejemplos de cómo usar la implementación de Java.

Usando la implementación de Java

El usuario del código puede configurar todos los parámetros de los modelos de mezcla, incluidos los tipos de modelo y los hiperparámetros. En el siguiente fragmento de código podemos ver cómo se inicializa y ejecuta el algoritmo:

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();

A continuación podemos ver los resultados de ejecutar el algoritmo en un conjunto de datos sintético que consta de 300 puntos de datos. Los puntos fueron generados originalmente por 3 distribuciones diferentes: N ([10,50], I), N ([50,10], I) y N ([150,100], I).

diagrama de dispersión1
Figura 1: Gráfico de dispersión del conjunto de datos de demostración

El algoritmo después de ejecutarse durante 10 iteraciones, identificó los siguientes 3 centros de clúster: [10.17, 50.11], [49.99, 10.13] y [149.97, 99.81]. Finalmente, dado que tratamos todo de manera bayesiana, no solo podemos proporcionar estimaciones de un solo punto de los centros de agrupación, sino también su distribución de probabilidad mediante el uso de fórmula ecuación.

diagrama de dispersión2-mapa de calor
Figura 2: Gráfico de dispersión de probabilidades de los centros de los grupos

En la figura anterior graficamos esas probabilidades; las áreas rojas indican alta probabilidad de ser el centro de un grupo y las áreas negras indican baja probabilidad.

Para usar la implementación de Java en aplicaciones del mundo real, debe escribir código externo que convierta su conjunto de datos original al formato requerido. Además, puede ser necesario un código adicional si desea visualizar la salida como vemos arriba. Finalmente, tenga en cuenta que la biblioteca de Apache Commons Math está incluida en el proyecto y, por lo tanto, no se requiere configuración adicional para ejecutar las demostraciones.

Si utiliza la implementación en un proyecto interesante, escríbanos y presentaremos su proyecto en nuestro blog. Además, si te gusta el artículo, tómate un momento y compártelo en Twitter o Facebook.

Sello de tiempo:

Mas de Caja de datos