Clustering med Dirichlet Process Mixture Model i Java PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Clustering med Dirichlet Process Mixture Model i Java

I de forrige artiklene diskuterte vi detaljert Dirichlet prosessblandingsmodeller og hvordan de kan brukes i klyngeanalyse. I denne artikkelen vil vi presentere en Java-implementering av to forskjellige DPMM-modeller: Dirichlet Multivariate Normal Mixture Model som kan brukes til å klynge Gauss-data og Dirichlet-Multinomial Mixture Model som brukes til å gruppere dokumenter. Java-koden er åpen med GPL v3-lisensen og kan lastes ned fritt fra Github.

Oppdatering: Datumbox Machine Learning Framework er nå åpen kildekode og gratis å nedlasting. Sjekk ut pakken com.datumbox.framework.machinelearning.clustering for å se implementeringen av Dirichlet Process Mixture Models i Java.

Dirichlet Process Mixture Model implementering i Java

Koden implementerer Dirichlet Process Mixture Model med Gibbs Sampler og bruker Apache Commons Math 3.3 som et matrisebibliotek. Det er lisensiert under GPLv3, så bruk det gjerne, modifiser det og omfordel det fritt, og du kan laste ned Java-implementeringen fra Github. Merk at du kan finne alle de teoretiske delene av klyngemetoden i de 5 foregående artiklene og detaljerte Javadoc-kommentarer for implementering i kildekoden.

Nedenfor viser vi en beskrivelse på høyt nivå på koden:

1. DPMM-klasse

DPMM er en abstrakt klasse og fungerer som en base for de forskjellige modellene, implementerer Kinesisk restaurantprosess og inneholder Samarbeidet Gibbs Sampler. Den har den offentlige metodeklyngen () som mottar datasettet som en liste over poeng og er ansvarlig for å utføre klyngeanalysen. Andre nyttige metoder i klassen er getPointAssignments () som brukes til å hente klyngetildelingene etter at klyngingen er fullført, og getClusterList () som brukes til å få listen over identifiserte klynger. DPMM inneholder den statiske nestede abstrakte klassen Cluster; den inneholder flere abstrakte metoder for styring av poengene og estimeringen av den bakre pdfen som brukes til estimering av klyngetildelingene.

2. GaussianDPMM-klasse

GaussianDPMM er implementeringen av Dirichlet Multivariate Normal Mixture Model og utvider DPMM-klassen. Den inneholder alle metodene som er nødvendige for å estimere sannsynlighetene under den Gaussiske forutsetningen. Videre inneholder den den statiske nestede klassen Cluster som implementerer alle de abstrakte metodene i DPMM.Cluster-klassen.

3. Multinomial DPMM-klasse

MultinomialDPMM implementerer Dirichlet-Multinomial blandingsmodell og utvider DPMM-klassen. På samme måte som GaussianDPMM-klassen, inneholder den alle metodene som er nødvendige for å estimere sannsynlighetene under antagelsen Multinomial-Dirichlet og inneholder den statiske nestede klassen Cluster som implementerer de abstrakte metodene til DPMM.Cluster.

4. SRS-klasse

SRS-klassen brukes til å utføre Simple Random Sampling fra en frekvens tabell. Den brukes av Gibbs Sampler for å estimere de nye klyngeoppgavene i hvert trinn i den iterative prosessen.

5. Poengklasse

Point-klassen fungerer som en tuple som lagrer dataene til posten sammen med dens ID.

6. Apache Commons Math Lib

Apache Commons Math 3.3 lib brukes til matrise-multiplikasjoner og er den eneste avhengigheten av implementeringen vår.

7. DPMMExample-klasse

Denne klassen inneholder eksempler på hvordan du bruker Java-implementeringen.

Bruker Java-implementeringen

Brukeren av koden kan konfigurere alle parametrene til blandingsmodellene, inkludert modelltypene og hyperparametrene. I det følgende kodebiten kan vi se hvordan algoritmen initialiseres og utføres:

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

Nedenfor kan vi se resultatene fra å kjøre algoritmen på et syntetisk datasett som består av 300 datapunkter. Poengene ble opprinnelig generert av 3 forskjellige distribusjoner: N ([10,50], I), N ([50,10], I) og N ([150,100], I).

spredningsplott1
Figur 1: Scatter Plot of demo dataset

Algoritmen etter å ha kjørt i 10 iterasjoner, identifiserte den følgende 3 klyngesentre: [10.17, 50.11], [49.99, 10.13] og [149.97, 99.81]. Til slutt, siden vi behandler alt på en bayesisk måte, er vi ikke bare i stand til å gi enkeltpunktestimeringer av klyngesentrene, men også deres sannsynlighetsfordeling ved å bruke formel ligning.

scatterplot2-varmekart
Figur 2: Spredning Plot av sannsynligheter for klyngesentre

I figuren over plotter vi disse sannsynlighetene; de røde områdene indikerer stor sannsynlighet for å være sentrum i en klynge, og svarte områder indikerer lav sannsynlighet.

For å bruke Java-implementeringen i virkelige applikasjoner, må du skrive ekstern kode som konverterer det opprinnelige datasettet til ønsket format. Dessuten kan det være nødvendig med ytterligere kode hvis du vil visualisere utdataene som vi ser ovenfor. Legg til slutt merke til at Apache Commons Math-biblioteket er inkludert i prosjektet, og det er derfor ikke nødvendig med noen ekstra konfigurasjon for å kjøre demoer.

Hvis du bruker implementeringen i et interessant prosjekt, slipp oss en linje, så viser vi prosjektet ditt på bloggen vår. Hvis du liker artikkelen, kan du ta et øyeblikk og dele den på Twitter eller Facebook.

Tidstempel:

Mer fra Datoboks