Clustering cu Dirichlet Process Mixture Model în Java PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Clustering cu Dirichlet Proces Model de amestec în Java

În articolele anterioare am discutat în detaliu Modele de amestec de proces Dirichlet și cum pot fi utilizate în analiza clusterelor. În acest articol vom prezenta o implementare Java a două modele DPMM diferite: Modelul Dirichlet Multivariate Normal Mixture care poate fi utilizat pentru a grupa date Gaussiene și Modelul Dirichlet-Multinomial Mixture care este folosit pentru gruparea documentelor. Codul Java este open-source sub licență GPL v3 și poate fi descărcat gratuit de la Github.

Actualizare: Datumbox Machine Learning Framework este acum open-source și gratuit Descarca. Consultați pachetul com.datumbox.framework.machinelearning.clustering pentru a vedea implementarea modelelor Dirichlet Process Mixture în Java.

Implementarea Dirichlet Process Mixture Model în Java

Codul implementează modelul Dirichlet Process Mixture Model cu Gibbs Sampler și folosește Apache Commons Math 3.3 ca bibliotecă matricială. Este licențiat sub GPLv3, așa că nu ezitați să îl utilizați, să îl modificați și să îl redistribuiți liber și puteți descărca implementarea Java de pe Github. Rețineți că puteți găsi toate părțile teoretice ale metodei de grupare în cele 5 articole anterioare și comentariile Javadoc detaliate pentru implementare în codul sursă.

Mai jos listăm o descriere de nivel înalt a codului:

1. Clasa DPMM

DPMM este o clasă abstractă și acționează ca o bază pentru diferitele modele diferite, implementează Procesul restaurantului chinezesc și conține Sampler Gibbs prăbușit. Are metoda publică cluster () care primește setul de date ca Listă de puncte și este responsabilă pentru efectuarea analizei clusterului. Alte metode utile ale clasei sunt getPointAssignments (), care este utilizat pentru a prelua atribuțiile de cluster după finalizarea clusterizării și getClusterList (), care este utilizat pentru a obține lista clusterelor identificate. DPMM conține clasa abstractă imbricată statică Cluster; conține mai multe metode abstracte privind gestionarea punctelor și estimarea pdf-ului posterior care sunt utilizate pentru estimarea atribuirilor cluster.

2. Clasa GaussianDPMM

GaussianDPMM este implementarea modelului Dirichlet Multivariate Normal Mixture Model și extinde clasa DPMM. Conține toate metodele care sunt necesare pentru a estima probabilitățile sub ipoteza Gaussiană. Mai mult, conține clasa statică imbricată Cluster care implementează toate metodele abstracte ale clasei DPMM.Cluster.

3. Clasa MultinomialDPMM

MultinomialDPMM implementează modelul Dirichlet-Multinomial Mixture și extinde clasa DPMM. În mod similar cu clasa GaussianDPMM, conține toate metodele care sunt necesare pentru a estima probabilitățile în ipoteza Multinomial-Dirichlet și conține clasa statică imbricată Cluster care implementează metodele abstracte ale DPMM.Cluster.

4. Clasa SRS

Clasa SRS este utilizată pentru efectuarea eșantionării simple aleatorii dintr-un tabel de frecvențe. Este folosit de Gibbs Sampler pentru a estima noile atribuiri de cluster în fiecare etapă a procesului iterativ.

5. Clasa punctelor

Clasa Point servește ca un tuplu care stochează datele înregistrării împreună cu id-ul său.

6. Apache Commons Math Lib

Apache Commons Math 3.3 lib este utilizat pentru multiplicările Matrix și este singura dependență a implementării noastre.

7. Clasa DPMMExample

Această clasă conține exemple de utilizare a implementării Java.

Folosind implementarea Java

Utilizatorul codului poate configura toți parametrii modelelor de amestec, inclusiv tipurile de model și hiperparametrele. În următorul fragment de cod putem vedea cum este inițializat și executat algoritmul:

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

Mai jos putem vedea rezultatele executării algoritmului pe un set de date sintetic care constă din 300 de puncte de date. Punctele au fost generate inițial de 3 distribuții diferite: N ([10,50], I), N ([50,10], I) și N ([150,100], I).

grafic de dispersie1
Figura 1: Scatter Plot a setului de date demo

Algoritmul după ce a rulat pentru 10 iterații, a identificat următoarele 3 centre cluster: [10.17, 50.11], [49.99, 10.13] și [149.97, 99.81]. În cele din urmă, deoarece tratăm totul într-o manieră bayesiană, suntem capabili nu numai să furnizăm estimări punctuale unice ale centrelor cluster, dar și distribuția probabilității lor utilizând formulă ecuaţie.

scatterplot2-heatmap
Figura 2: Graficul Scatter al probabilităților centrelor clusterelor

În figura de mai sus trasăm acele probabilități; zonele roșii indică o probabilitate mare de a fi centrul unui cluster, iar zonele negre indică o probabilitate scăzută.

Pentru a utiliza implementarea Java în aplicații din lumea reală, trebuie să scrieți un cod extern care convertește setul de date original în formatul necesar. Mai mult, ar putea fi necesar un cod suplimentar dacă doriți să vizualizați rezultatul așa cum vedem mai sus. În cele din urmă, rețineți că biblioteca Apache Commons Math este inclusă în proiect și, prin urmare, nu este necesară nicio configurație suplimentară pentru a rula demonstrațiile.

Dacă utilizați implementarea într-un proiect interesant, trimiteți-ne o linie și vom prezenta proiectul dvs. pe blogul nostru. De asemenea, dacă vă place articolul, vă rugăm să luați un moment și să-l distribuiți pe Twitter sau Facebook.

Timestamp-ul:

Mai mult de la Datumbox