Introduksjon til Apache Commons Math

1. Oversikt

Vi har ofte behov for å bruke matematiske verktøy, og noen ganger java.lang.Math er rett og slett ikke nok. Heldigvis har Apache Commons målet å fylle ut lekkasjene til standardbiblioteket, med Apache Commons Math.

Apache Commons Math er det største open source-biblioteket med matematiske funksjoner og verktøy for Java. Gitt at denne artikkelen bare er en introduksjon, vil vi bare gi en oversikt over biblioteket og presentere de mest overbevisende brukssakene.

2. Starter med Apache Commons Math

2.1. Bruken av Apache Commons Math

Apache Commons Math består av matematiske funksjoner (erf for eksempel), strukturer som representerer matematiske begreper (som komplekse tall, polynomer, vektorer osv.), og algoritmer som vi kan bruke på disse strukturene (rotfunn, optimalisering, kurvetilpasning, beregning av kryss av geometriske figurer, etc.).

2.2. Maven-konfigurasjon

Hvis du bruker Maven, kan du bare legge til denne avhengigheten:

 org.apache.commons commons-math3 3.6.1 

2.3. Pakkeoversikt

Apache Commons Math er delt inn i flere pakker:

  • org.apache.commons.math3.stat - statistikk og statistiske tester
  • org.apache.commons.math3.distribution - sannsynlighetsfordelinger
  • org.apache.commons.math3.random - tilfeldige tall, strenger og data generering
  • org.apache.commons.math3.analyse - rotfunn, integrering, interpolasjon, polynomer osv.
  • org.apache.commons.math3.linear - matriser, løse lineære systemer
  • org.apache.commons.math3.geometry - geometri (euklidiske mellomrom og binær rompartisjonering)
  • org.apache.commons.math3.transform - transformere metoder (rask Fourier)
  • org.apache.commons.math3.ode - vanlig differensialligning integrasjon
  • org.apache.commons.math3.fitting - kurvetilpasning
  • org.apache.commons.math3.optim - funksjonsmaksimering eller minimering
  • org.apache.commons.math3.genetics - genetiske algoritmer
  • org.apache.commons.math3.ml - maskinlæring (klynging og nevrale nettverk)
  • org.apache.commons.math3.util - vanlige matte / stat-funksjoner som utvider java.lang.Math
  • org.apache.commons.math3.special - spesialfunksjoner (Gamma, Beta)
  • org.apache.commons.math3.complex - komplekse tall
  • org.apache.commons.math3.fraction - rasjonelle tall

3. Statistikk, sannsynlighet og tilfeldighet

3.1. Statistikk

Pakken org.apache.commons.math3.stat gir flere verktøy for statistiske beregninger. For å beregne gjennomsnitt, standardavvik og mange flere kan vi bruke Beskrivende statistikk:

doble [] verdier = ny doble [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = ny DescriptiveStatistics (); for (dobbel v: verdier) {descriptiveStatistics.addValue (v); } dobbelt gjennomsnitt = descriptiveStatistics.getMean (); dobbel median = deskriptivStatistics.getPercentile (50); dobbel standardDeviation = deskriptiveStatistics.getStandardDeviation (); 

I denne pakken kan vi finne verktøy for beregning av kovariansen, korrelasjonen eller for å utføre statistiske tester (ved hjelp av TestUtils).

3.2. Sannsynligheter og fordelinger

I kjernen Java, Math.random () kan brukes til å generere tilfeldige verdier, men disse verdiene er jevnt fordelt mellom 0 og 1.

Noen ganger ønsker vi å produsere en tilfeldig verdi ved hjelp av en mer kompleks fordeling. For dette kan vi bruke rammeverket gitt av org.apache.commons.math3.distribution.

Slik genererer du tilfeldige verdier i henhold til normalfordelingen med gjennomsnittet 10 og standardavviket 3:

NormalDistribution normalDistribution = ny NormalDistribution (10, 3); dobbelt randomValue = normalDistribution.sample (); 

Eller vi kan oppnå sannsynligheten P (X = x) for å få en verdi for diskrete distribusjoner, eller den kumulative sannsynligheten P (X <= x) for kontinuerlige distribusjoner.

4. Analyse

Analyserelaterte funksjoner og algoritmer finnes i org.apache.commons.math3.analyse.

4.1. Root Finding

En rot er en verdi der en funksjon har verdien 0. Commons-Math inkluderer implementering av flere rotfunnalgoritmer.

Her prøver vi å finne roten til v -> (v * v) - 2 :

UnivariateFunction-funksjon = v -> Math.pow (v, 2) - 2; UnivariateSolver solver = new BracketingNthOrderBrentSolver (1.0e-12, 1.0e-8, 5); dobbelt c = solver.solve (100, funksjon, -10.0, 10.0, 0); 

Først begynner vi med å definere funksjonen, deretter definerer vi løseren, og vi setter ønsket nøyaktighet. Til slutt kaller vi løse() API.

Rotfunn-operasjonen vil bli utført ved hjelp av flere iterasjoner, så det gjelder å finne et kompromiss mellom utførelsestid og nøyaktighet.

4.2. Beregning av integraler

Integrasjonen fungerer nesten som rotfunn:

UnivariateFunction-funksjon = v -> v; UnivariateIntegrator integrator = ny SimpsonIntegrator (1.0e-12, 1.0e-8, 1, 32); dobbelt i = integrator. integrer (100, funksjon, 0, 10); 

Vi begynner med å definere en funksjon, vi velger en integrator blant de tilgjengelige integreringsløsningene som eksisterer, vi setter ønsket nøyaktighet, og til slutt integrerer vi.

5. Lineær algebra

Hvis vi har et lineært ligningssystem under formen AX = B hvor A er en matrise av reelle tall, og B en vektor med reelle tall - Commons Math gir strukturer for å representere både matrisen og vektoren, og gir også løsere for å finne verdien av X:

RealMatrix a = ny Array2DRowRealMatrix (ny dobbel [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, usann); RealVector b = ny ArrayRealVector (ikke dobbel [] {1, -2, 1}, usann); DecompositionSolver solver = new LUDecomposition (a) .getSolver (); RealVector-løsning = solver.solve (b); 

Saken er ganske grei: vi definerer en matrise en fra en rekke dobbeltsamlinger, og en vektor b fra en matrise av en vektor.

Deretter lager vi en LUD-sammensetning som gir en løser for ligninger under skjemaet AX = B. Som navnet sier det, LUD-sammensetning er avhengig av LU-spaltning, og fungerer dermed bare med firkantede matriser.

For andre matriser finnes forskjellige løsere, som vanligvis løser ligningen ved å bruke den minste firkantede metoden.

6. Geometri

Pakken org.apache.commons.math3.geometry gir flere klasser for å representere geometriske objekter og flere verktøy for å manipulere dem. Det er viktig å merke seg at denne pakken er delt inn i forskjellige delpakker, med tanke på hvilken type geometri vi vil bruke:

Det er viktig å merke seg at denne pakken er delt inn i forskjellige delpakker, med tanke på hvilken type geometri vi vil bruke:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D euklidisk geometri
  • org.apache.commons.math3.geometry.euclidean.twod - 2D euklidisk geometri
  • org.apache.commons.math3.geometry.euclidean.threed - 3D euklidisk geometri
  • org.apache.commons.math3.geometry.sherical.oned - 1D sfærisk geometri
  • org.apache.commons.math3.geometry.spherical.twod - 2D sfærisk geometri

De mest nyttige klassene er sannsynligvis Vector2D, Vector3D, Linje, og Segmentet. De brukes til å representere henholdsvis 2D-vektorer (eller punkter), 3D-vektorer, linjer og segmenter.

Når du bruker klassene nevnt ovenfor, er det mulig å utføre noen beregninger. For eksempel utfører følgende kode beregningen av skjæringspunktet mellom to 2D-linjer:

Linje l1 = ny linje (ny Vector2D (0, 0), ny Vector2D (1, 1), 0); Linje l2 = ny linje (ny Vector2D (0, 1), ny Vector2D (1, 1.5), 0); Vector2D kryss = l1. kryss (l2); 

Det er også mulig å bruke disse strukturene for å få avstanden fra et punkt til en linje, eller det nærmeste punktet for en linje til en annen linje (i 3D).

7. Optimalisering, genetiske algoritmer og maskinlæring

Commons-Math tilbyr også noen verktøy og algoritmer for mer komplekse oppgaver knyttet til optimalisering og maskinlæring.

7.1. Optimalisering

Optimalisering består vanligvis av å minimere eller maksimere kostnadsfunksjoner. Algoritmer for optimalisering finner du i org.apache.commons.math3.optim og org.apache.commons.math3.optimization. Den inkluderer lineære og ikke-lineære optimaliseringsalgoritmer.

Vi kan merke oss at det er duplikatklasser i optim og optimalisering pakker: optimalisering pakken er for det meste utdatert og vil bli fjernet i Commons Math 4.

7.2. Genetiske algoritmer

Genetiske algoritmer er en slags metaheuristikk: de er en løsning for å finne en akseptabel løsning på et problem når deterministiske algoritmer er for sakte. En oversikt over genetiske algoritmer finner du her.

Pakken org.apache.commons.math3.genetics gir et rammeverk for å utføre beregninger ved hjelp av genetiske algoritmer. Den inneholder struktur som kan brukes til å representere en populasjon og et kromosom, og standardalgoritmer for å utføre mutasjons-, crossover- og seleksjonsoperasjoner.

Følgende klasser gir et godt utgangspunkt:

  • Genetisk algoritme - genetisk algoritmeramme
  • Befolkning - grensesnittet som representerer en befolkning
  • Kromosom - grensesnittet som representerer et kromosom

7.3. Maskinlæring

Maskinlæring i Commons-Math er delt inn i to deler: klynging og nevrale nettverk.

Klyngedelen består av å sette en etikett på vektorer i henhold til deres likhet med en avstandsmåling. Klyngealgoritmene som er gitt er basert på K-betyr-algoritmen.

Den nevrale nettverksdelen gir klasser for å representere nettverk (Nettverk) og nevroner (Neuron). Man kan merke seg at funksjonene som er gitt, er begrenset sammenlignet med de vanligste nevrale nettverksrammer, men det kan fortsatt være nyttig for små applikasjoner med lave krav.

8. Verktøy

8.1. FastMath

FastMath er en statisk klasse som ligger i org.apache.commons.math3.util og jobber akkurat som java.lang.Math.

Hensikten er å gi, i det minste de samme funksjonene som vi kan finne i java.lang.Math, men med raskere implementeringer. Så når et program er sterkt avhengig av matematiske beregninger, er det en god ide å erstatte samtaler til Math.sin () (for eksempel) å ringe til FastMath.sin () for å forbedre ytelsen til applikasjonen. På den annen side vær oppmerksom på at FastMath er mindre nøyaktig enn java.lang.Math.

8.2. Vanlige og spesielle funksjoner

Commons-Math gir standard matematiske funksjoner som ikke er implementert i java.lang.Math (som faktoria). De fleste av disse funksjonene finnes i pakkene org.apache.commons.math3.special og org.apache.commons.math3.util.

For eksempel, hvis vi ønsker å beregne faktoren på 10, kan vi ganske enkelt gjøre:

long factorial = CombinatorialUtils.factorial (10); 

Funksjoner relatert til regning (gcd, lcmosv.) finner du i ArithmeticUtils, og funksjoner relatert til kombinatoriske finner du i CombinatorialUtils. Noen andre spesielle funksjoner, som erf, kan nås i org.apache.commons.math3.special.

8.3. Brøk og komplekse tall

Det er også mulig å håndtere mer komplekse typer ved hjelp av commons-math: brøk og komplekse tall. Disse strukturene tillater oss å utføre spesifikk beregning på denne typen tall.

Deretter kan vi beregne summen av to brøker og vise resultatet som en strengrepresentasjon av en brøk (dvs. under skjemaet "a / b"):

Brøk lhs = ny brøk (1, 3); Brøk rhs = ny brøk (2, 5); Brøkssum = lhs.add (rhs); Strengstr = ny FractionFormat (). Format (sum); 

Eller vi kan raskt beregne kraften til komplekse tall:

Kompleks først = ny Kompleks (1.0, 3.0); Kompleks andre = nye Complex (2.0, 5.0); Kompleks kraft = first.pow (andre); 

9. Konklusjon

I denne opplæringen presenterte vi noen av de interessante tingene du kan gjøre ved hjelp av Apache Commons Math.

Dessverre kan denne artikkelen ikke dekke hele analysefeltet eller lineær algebra, og gir derfor bare eksempler på de vanligste situasjonene.

For mer informasjon kan vi imidlertid lese den velskrevne dokumentasjonen, som gir mange detaljer for alle aspekter av biblioteket.

Og som alltid kan kodeeksemplene bli funnet her på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found