Klusterointi Dirichlet-prosessin sekoitusmallilla Java PlatoBlockchain Data Intelligencessä. Pystysuuntainen haku. Ai.

Klusterointi Java-Dirichlet-prosessiseosmallilla

Aikaisemmissa artikkeleissa keskustelimme yksityiskohtaisesti Dirichlet-prosessiseosmallit ja miten niitä voidaan käyttää klusterianalyysissä. Tässä artikkelissa esitellään Java-toteutus kaksi erilaista DPMM-mallia: Dirichlet Multivariate Normal Sexture Model, jota voidaan käyttää Gaussin tietojen klusterointiin, ja Dirichlet-Multinomial Sext Model, jota käytetään asiakirjojen ryhmittelyyn. Java-koodi on avointa lähdettä GPL v3 -lisenssillä, ja sen voi ladata ilmaiseksi osoitteesta Github.

Päivitys: Datumbox Machine Learning Framework on nyt avoimen lähdekoodin ja ilmainen download. Tutustu pakettiin com.datumbox.framework.machinelearning.clustering nähdäksesi Dirichlet-prosessisekoitusmallien käyttöönotto Javassa.

Dirichlet-prosessiseosmallin toteutus Java-sovelluksessa

Koodi toteuttaa Dirichlet-prosessiseosmallin Gibbs-samplerilla ja käyttää Apache Commons Math 3.3 -matriisikirjastoa. Sillä on lisenssi GPLv3: lla, joten voit käyttää sitä, muokata sitä ja levittää sitä vapaasti. Voit ladata Java-toteutuksen osoitteesta Github. Huomaa, että kaikki klusterointimenetelmän teoreettiset osat löytyvät edellisistä viidestä artikkelista ja yksityiskohtaiset Javadoc-kommentit lähdekoodin toteuttamiseksi.

Alla luetellaan koodin korkean tason kuvaus:

1. DPMM-luokka

DPMM on abstrakti luokka ja toimii pohjana erilaisille malleille, toteuttaa Kiinalainen ravintola-prosessi ja sisältää Kaatunut Gibbs-näytteenotin. Sillä on julkinen menetelmäklusteri (), joka vastaanottaa tietojoukon pisteiden luettelona ja vastaa klusterianalyysin suorittamisesta. Muita luokan hyödyllisiä menetelmiä ovat getPointAssignments (), jota käytetään hakemaan klusterimääritykset klusterin valmistuttua, ja getClusterList (), jota käytetään tunnistettujen klustereiden luettelon saamiseen. DPMM sisältää staattisen sisäkkäisen abstraktin luokan Cluster; se sisältää useita abstrakteja menetelmiä, jotka koskevat pisteiden hallintaa ja taka-pdf: n arviointia, joita käytetään klusterimääritysten estimointiin.

2. Gaussin DPMM-luokka

GaussianDPMM on Dirichlet Multivariate Normal Mixture Model -sovelluksen toteutus ja laajentaa DPMM-luokkaa. Se sisältää kaikki menetelmät, joita tarvitaan arvioimaan todennäköisyydet Gaussin oletuksen perusteella. Lisäksi se sisältää staattisen sisäkkäisen luokan Cluster, joka toteuttaa kaikki abstraktit DPMM.Cluster-luokan menetelmät.

3. MultinomialDPMM-luokka

MultinomialDPMM toteuttaa Dirichlet-Multinomial Seosmallin ja laajentaa DPMM-luokkaa. Samoin kuin GaussianDPMM-luokka, se sisältää kaikki menetelmät, joita tarvitaan todennäköisyyksien arvioimiseksi Multinomial-Dirichlet-oletuksen mukaisesti, ja sisältää staattisen sisäkkäisen luokan klusterin, joka toteuttaa DPMM.Clusterin abstraktit menetelmät.

4. SRS-luokka

SRS-luokkaa käytetään yksinkertaisen satunnaisen näytteenoton suorittamiseen taajuustaulukosta. Gibbs Sampler käyttää sitä arvioimaan uudet klusterimääritykset iteratiivisen prosessin jokaisessa vaiheessa.

5. Pisteluokka

Point-luokka toimii dupleksina, joka tallentaa tietueen tiedot yhdessä tunnuksen kanssa.

6. Apache Commons Math Lib

Apache Commons Math 3.3 lib -sovellusta käytetään matriisikertomuksiin, ja se on toteutuksemme ainoa riippuvuus.

7. DPMMExample-luokka

Tämä luokka sisältää esimerkkejä Java-toteutuksen käytöstä.

Java-toteutuksen käyttäminen

Koodin käyttäjä pystyy konfiguroimaan kaikki seosmallien parametrit, mukaan lukien mallityypit ja hyperparametrit. Seuraavassa koodinpätkässä voimme nähdä, kuinka algoritmi alustetaan ja suoritetaan:

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

Alla voimme nähdä algoritmin suorittamisen synteettisessä aineistossa, joka koostuu 300 datapisteestä. Pisteet luotiin alun perin kolmella eri jakaumalla: N ([3], I), N ([10,50], I) ja N ([50,10], I).

sirontapiiri 1
Kuva 1: Hajontakaavio demotiedostosta

Kymmenen iteraation suorittamisen jälkeen algoritmi tunnisti seuraavat 10 klusterikeskusta: [3, 10.17], [50.11, 49.99] ja [10.13, 149.97]. Lopuksi, koska käsittelemme kaikkea Bayesin tavalla, pystymme tarjoamaan klusterikeskusten yhden pisteen estimaatit myös niiden todennäköisyysjakauman käyttämällä kaava yhtälö.

scatterplot2-lämpökartta
Kuva 2: Hajontakaavio klustereiden keskusten todennäköisyydestä

Yllä olevassa kuvassa piirrämme nämä todennäköisyydet; punaiset alueet osoittavat suuren todennäköisyyden olla klusterin keskipiste ja mustat alueet osoittavat pienen todennäköisyyden.

Jos haluat käyttää Java-toteutusta reaalimaailman sovelluksissa, sinun on kirjoitettava ulkoinen koodi, joka muuntaa alkuperäisen tietojoukon vaadittuun muotoon. Lisäksi lisäkoodi voi olla tarpeen, jos haluat visualisoida lähdön kuten näemme yllä. Lopuksi huomaa, että Apache Commons Math -kirjasto sisältyy projektiin, joten esittelyjen suorittamiseen ei tarvita lisäasetuksia.

Jos käytät toteutusta mielenkiintoisessa projektissa, jätä meille rivi ja me mainitsemme projektisi blogissamme. Jos pidät artikkelista, ota hetki ja jaa se Twitterissä tai Facebookissa.

Aikaleima:

Lisää aiheesta Datumbox