- Juli 7, 2014
- Vasilis Vryniotis
- . 1 kommentar
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).
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 .
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.
- AI
- ai kunst
- ai art generator
- du har en robot
- kunstig intelligens
- sertifisering av kunstig intelligens
- kunstig intelligens robot
- kunstig intelligens roboter
- programvare for kunstig intelligens
- blockchain
- blockchain konferanse ai
- coingenius
- samtale kunstig intelligens
- kryptokonferanse ai
- dall sin
- Datoboks
- dyp læring
- google det
- maskinlæring
- Maskinlæring og statistikk
- plato
- plato ai
- Platon Data Intelligence
- Platon spill
- PlatonData
- platogaming
- Programmering
- skala ai
- syntaks
- zephyrnet