Clustering med Dirichlet Process Mixture Model i Java PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Clustering med Dirichlet Process Mixture Model i Java

I de foregående artikler diskuterede vi detaljeret Dirichlet procesblandingsmodeller og hvordan de kan bruges i klyngeanalyse. I denne artikel vil vi præsentere en Java-implementering af to forskellige DPMM-modeller: Dirichlet Multivariate Normal Mixture Model, som kan bruges til at klynge gaussiske data og Dirichlet-Multinomial Mixture Model, som bruges til at klynge dokumenter. Java-koden er open source under GPL v3-licens og kan downloades gratis fra Github.

Opdatering: Datumbox Machine Learning Framework er nu open source og gratis til downloade. Tjek pakken com.datumbox.framework.machinelearning.clustering for at se implementeringen af ​​Dirichlet Process Mixture Models i Java.

Dirichlet Process Mixture Model implementering i Java

Koden implementerer Dirichlet Process Mixture Model med Gibbs Sampler og bruger Apache Commons Math 3.3 som et matrixbibliotek. Det er licenseret under GPLv3, så du er velkommen til at bruge det, ændre det og omdistribuere det frit, og du kan downloade Java-implementeringen fra Github. Bemærk, at du kan finde alle de teoretiske dele af klyngemetoden i de foregående 5 artikler og detaljerede Javadoc-kommentarer til implementering i kildekoden.

Nedenfor lister vi en beskrivelse på højt niveau af koden:

1. DPMM klasse

DPMM er en abstrakt klasse og fungerer som en base for de forskellige forskellige modeller, implementerer Kinesisk restaurant proces og indeholder Sammenklappet Gibbs Sampler. Den har den offentlige metode cluster(), som modtager datasættet som en liste over punkter og er ansvarlig for at udføre klyngeanalysen. Andre nyttige metoder i klassen er getPointAssignments() som bruges til at hente klyngetildelingerne efter at klyngedannelse er afsluttet og getClusterList() som bruges til at hente listen over identificerede klynger. DPMM'en indeholder den statiske indlejrede abstrakte klasse Cluster; den indeholder flere abstrakte metoder vedrørende styring af de point og estimering af den posteriore pdf, der bruges til estimering af klyngetildelingerne.

2. Gaussisk DPMM klasse

GaussianDPMM er implementeringen af ​​Dirichlet Multivariate Normal Mixture Model og udvider DPMM-klassen. Den indeholder alle de metoder, der er nødvendige for at estimere sandsynligheden under den Gaussiske antagelse. Desuden indeholder den den statiske indlejrede klasse Cluster, som implementerer alle de abstrakte metoder i klassen DPMM.Cluster.

3. MultinomialDPMM-klasse

MultinomialDPMM implementerer Dirichlet-Multinomial Mixture Model og udvider DPMM-klassen. På samme måde som GaussianDPMM-klassen indeholder den alle de metoder, der er nødvendige for at estimere sandsynligheden under Multinomial-Dirichlet-antagelsen, og den indeholder den statiske indlejrede klasse Cluster, som implementerer de abstrakte metoder i DPMM.Cluster.

4. SRS klasse

SRS-klassen bruges til at udføre Simple Random Sampling fra en frekvenstabel. Det bruges af Gibbs Sampler til at estimere de nye klyngetildelinger i hvert trin af den iterative proces.

5. Punktklasse

Point-klassen fungerer som en tuple, der gemmer dataene fra posten sammen med dens id.

6. Apache Commons Math Lib

Apache Commons Math 3.3 lib bruges til Matrix-multiplikationer, og det er den eneste afhængighed af vores implementering.

7. DPMMEksempel klasse

Denne klasse indeholder eksempler på, hvordan man bruger Java-implementeringen.

Brug af Java-implementeringen

Brugeren af ​​koden er i stand til at konfigurere alle parametrene for blandingsmodellerne, inklusive modeltyperne og hyperparametrene. I det følgende kodestykke kan vi se, hvordan algoritmen initialiseres og udfø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 resultaterne af at køre algoritmen på et syntetisk datasæt, som består af 300 datapunkter. Punkterne blev oprindeligt genereret af 3 forskellige fordelinger: N([10,50], I), N([50,10], I) og N([150,100], I).

scatterplot 1
Figur 1: Spredningsplot af demodatasæt

Algoritmen efter at have kørt i 10 iterationer identificerede den følgende 3 klyngecentre: [10.17, 50.11], [49.99, 10.13] og [149.97, 99.81]. Endelig, da vi behandler alt på en Bayesiansk måde, er vi ikke kun i stand til at give enkeltpunktsestimater af klyngecentrene, men også deres sandsynlighedsfordeling ved at bruge Formula ligning.

scatterplot2-varmekort
Figur 2: Spredningsplot af sandsynligheder for klyngers centre

I figuren ovenfor plotter vi disse sandsynligheder; de røde områder indikerer høj sandsynlighed for at være centrum af en klynge og sorte områder indikerer lav sandsynlighed.

For at bruge Java-implementeringen i applikationer fra den virkelige verden skal du skrive ekstern kode, der konverterer dit originale datasæt til det påkrævede format. Yderligere kode kan være nødvendig, hvis du vil visualisere outputtet, som vi ser ovenfor. Bemærk endelig, at Apache Commons Math-biblioteket er inkluderet i projektet, og der kræves derfor ingen yderligere konfiguration for at køre demoerne.

Hvis du bruger implementeringen i et interessant projekt, skriv til os, og vi vil præsentere dit projekt på vores blog. Hvis du også kan lide artiklen, så tag et øjeblik og del den på Twitter eller Facebook.

Tidsstempel:

Mere fra Datumboks