Inleiding tot Apache Commons Math

1. Overzicht

We hebben vaak wiskundige hulpmiddelen nodig, en soms ook java.lang.Math is gewoon niet genoeg. Gelukkig heeft Apache Commons het doel om de lekken van de standaardbibliotheek op te vullen met Apache Commons Math.

Apache Commons Math is de grootste open-sourcebibliotheek met wiskundige functies en hulpprogramma's voor Java. Aangezien dit artikel slechts een inleiding is, geven we alleen een overzicht van de bibliotheek en presenteren we de meest overtuigende gebruiksscenario's.

2. Beginnen met Apache Commons Math

2.1. Het gebruik van Apache Commons Math

Apache Commons Math bestaat uit wiskundige functies (erf bijvoorbeeld), structuren die wiskundige concepten vertegenwoordigen (zoals complexe getallen, polynomen, vectoren, enz.), en algoritmen die we op deze structuren kunnen toepassen (wortelopsporing, optimalisatie, curve-aanpassing, berekening van snijpunten van geometrische figuren, enz.).

2.2. Maven-configuratie

Als u Maven gebruikt, voegt u eenvoudig deze afhankelijkheid toe:

 org.apache.commons commons-math3 3.6.1 

2.3. Pakketoverzicht

Apache Commons Math is onderverdeeld in verschillende pakketten:

  • org.apache.commons.math3.stat - statistieken en statistische tests
  • org.apache.commons.math3.distribution - kansverdelingen
  • org.apache.commons.math3.random - willekeurige getallen, tekenreeksen en gegevensgeneratie
  • org.apache.commons.math3.analysis - wortelopsporing, integratie, interpolatie, polynomen, etc.
  • org.apache.commons.math3.linear - matrices, het oplossen van lineaire systemen
  • org.apache.commons.math3.geometry - geometrie (Euclidische spaties en binaire spaties)
  • org.apache.commons.math3.transform - transformatiemethoden (snelle Fourier)
  • org.apache.commons.math3.ode - gewone differentiaalvergelijkingen integratie
  • org.apache.commons.math3.fitting - curve-aanpassing
  • org.apache.commons.math3.optim - functie maximalisatie of minimalisatie
  • org.apache.commons.math3.genetics - genetische algoritmes
  • org.apache.commons.math3.ml - machine learning (clustering en neurale netwerken)
  • org.apache.commons.math3.util - algemene wiskundige / stat-functies die java.lang.Math uitbreiden
  • org.apache.commons.math3.special - speciale functies (Gamma, Beta)
  • org.apache.commons.math3.complex - complexe getallen
  • org.apache.commons.math3.fraction - rationele nummers

3. Statistieken, kansen en willekeur

3.1. Statistieken

Het pakket org.apache.commons.math3.stat biedt verschillende tools voor statistische berekeningen. Om bijvoorbeeld gemiddelde, standaarddeviatie en nog veel meer te berekenen, kunnen we gebruiken Beschrijvende statistieken:

dubbele [] waarden = nieuwe dubbele [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = nieuw DescriptiveStatistics (); voor (dubbele v: waarden) {descriptiveStatistics.addValue (v); } dubbel gemiddelde = descriptiveStatistics.getMean (); dubbele mediaan = descriptiveStatistics.getPercentile (50); dubbele standardDeviation = descriptiveStatistics.getStandardDeviation (); 

In dit pakket kunnen we tools vinden om de covariantie of correlatie te berekenen of om statistische tests uit te voeren (met TestUtils).

3.2. Waarschijnlijkheden en uitkeringen

In kern Java, Math.random () kan worden gebruikt voor het genereren van willekeurige waarden, maar deze waarden zijn uniform verdeeld tussen 0 en 1.

Soms willen we een willekeurige waarde produceren met een complexere verdeling. Hiervoor kunnen we gebruik maken van het framework van org.apache.commons.math3.distribution.

Hier ziet u hoe u willekeurige waarden genereert volgens de normale verdeling met het gemiddelde van 10 en de standaarddeviatie van 3:

NormalDistribution normalDistribution = nieuwe NormalDistribution (10, 3); dubbele randomValue = normalDistribution.sample (); 

Of we kunnen de waarschijnlijkheid verkrijgen P (X = x) om een ​​waarde te krijgen voor discrete verdelingen, of de cumulatieve kans P (X <= x) voor continue distributies.

4. Analyse

Analysegerelateerde functies en algoritmen zijn te vinden in org.apache.commons.math3.analyse.

4.1. Root Finding

Een root is een waarde waarbij een functie de waarde 0 heeft. Commons-Math omvat de implementatie van verschillende root-zoekalgoritmen.

Hier proberen we de wortel van v -> (v * v) - 2 :

UnivariateFunction-functie = v -> Math.pow (v, 2) - 2; UnivariateSolver-oplosser = nieuwe BracketingNthOrderBrentSolver (1.0e-12, 1.0e-8, 5); dubbele c = solver.solve (100, functie, -10.0, 10.0, 0); 

Eerst beginnen we met het definiëren van de functie, daarna definiëren we de oplosser en stellen we de gewenste nauwkeurigheid in. Ten slotte noemen we de oplossen() API.

De root-zoekoperatie wordt uitgevoerd met behulp van verschillende iteraties, dus het is een kwestie van een compromis vinden tussen uitvoeringstijd en nauwkeurigheid.

4.2. Integralen berekenen

De integratie werkt bijna als rootopsporing:

UnivariateFunction-functie = v -> v; UnivariateIntegrator-integrator = nieuwe SimpsonIntegrator (1.0e-12, 1.0e-8, 1, 32); dubbele i = integrator.integrate (100, functie, 0, 10); 

We beginnen met het definiëren van een functie, we kiezen een integrator uit de beschikbare integratieoplossingen, we stellen de gewenste nauwkeurigheid in en uiteindelijk integreren we.

5. Lineaire algebra

Als we een lineair stelsel van vergelijkingen hebben onder de vorm AX = B waarbij A een matrix van reële getallen is en B een vector van reële getallen - Commons Math biedt structuren om zowel de matrix als de vector weer te geven, en biedt ook oplossers om te vinden de waarde van X:

RealMatrix a = nieuwe Array2DRowRealMatrix (nieuwe dubbele [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, false); RealVector b = nieuwe ArrayRealVector (n ieuw dubbel [] {1, -2, 1}, false); DecompositionSolver solver = nieuwe LUDecomposition (a) .getSolver (); RealVector-oplossing = solver.solve (b); 

De casus is vrij eenvoudig: we definiëren een matrix een uit een reeks van dubbele rijen en een vector b uit een array van een vector.

Vervolgens maken we een LUDcompositie die een oplosser biedt voor vergelijkingen onder de vorm AX = B.Zoals de naam zegt, LUDcompositie is afhankelijk van de LU-ontleding en werkt dus alleen met vierkante matrices.

Voor andere matrices bestaan ​​verschillende oplossers, die de vergelijking meestal oplossen met behulp van de kleinste kwadratenmethode.

6. Geometrie

Het pakket org.apache.commons.math3.geometry biedt verschillende klassen om geometrische objecten weer te geven en verschillende tools om ze te manipuleren. Het is belangrijk op te merken dat dit pakket is onderverdeeld in verschillende subpakketten, met betrekking tot het soort geometrie dat we willen gebruiken:

Het is belangrijk op te merken dat dit pakket is onderverdeeld in verschillende subpakketten, met betrekking tot het soort geometrie dat we willen gebruiken:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D Euclidische meetkunde
  • org.apache.commons.math3.geometry.euclidean.twod - 2D Euclidische meetkunde
  • org.apache.commons.math3.geometry.euclidean.threed - 3D Euclidische meetkunde
  • org.apache.commons.math3.geometry.sferical.oned - 1D sferische geometrie
  • org.apache.commons.math3.geometry.sherical.twod - 2D sferische geometrie

De meest bruikbare klassen zijn waarschijnlijk Vector2D, Vector 3D, Lijn, en Segment. Ze worden gebruikt voor het weergeven van respectievelijk 2D-vectoren (of punten), 3D-vectoren, lijnen en segmenten.

Bij het gebruik van de hierboven genoemde klassen is het mogelijk om wat berekeningen uit te voeren. De volgende code voert bijvoorbeeld de berekening uit van het snijpunt van twee 2D-lijnen:

Regel l1 = nieuwe regel (nieuwe Vector2D (0, 0), nieuwe Vector2D (1, 1), 0); Regel l2 = nieuwe regel (nieuwe Vector2D (0, 1), nieuwe Vector2D (1, 1.5), 0); Vector2D intersection = l1.intersection (l2); 

Het is ook mogelijk om deze structuren te gebruiken om de afstand van een punt tot een lijn te bepalen, of het dichtstbijzijnde punt van een lijn tot een andere lijn (in 3D).

7. Optimalisatie, genetische algoritmen en machine learning

Commons-Math biedt ook enkele tools en algoritmen voor complexere taken met betrekking tot optimalisatie en machine learning.

7.1. Optimalisatie

Optimalisatie bestaat meestal uit het minimaliseren of maximaliseren van kostenfuncties. Algoritmen voor optimalisatie zijn te vinden in org.apache.commons.math3.optim en org.apache.commons.math3.optimimization. Het bevat lineaire en niet-lineaire optimalisatie-algoritmen.

We kunnen opmerken dat er dubbele klassen zijn in het optim en optimalisatie pakketten: het optimalisatie pakket is grotendeels verouderd en zal worden verwijderd in de Commons Math 4.

7.2. Genetische algoritmes

Genetische algoritmen zijn een soort meta-heuristieken: ze zijn een oplossing voor het vinden van een acceptabele oplossing voor een probleem wanneer deterministische algoritmen te traag zijn. Een overzicht van genetische algoritmen vind je hier.

Het pakket org.apache.commons.math3.genetics biedt een raamwerk om berekeningen uit te voeren met behulp van genetische algoritmen. Het bevat een structuur die kan worden gebruikt om een ​​populatie en een chromosoom weer te geven, en standaardalgoritmen om mutatie-, crossover- en selectiebewerkingen uit te voeren.

De volgende lessen geven een goed startpunt:

  • Genetisch algoritme - het genetische algoritmekader
  • Bevolking - de interface die een populatie vertegenwoordigt
  • Chromosoom - de interface die een chromosoom vertegenwoordigt

7.3. Machine leren

Machine learning in Commons-Math is onderverdeeld in twee delen: clustering en neurale netwerken.

Het clustergedeelte bestaat uit het aanbrengen van een label op vectoren volgens hun gelijkenis met betrekking tot een afstandsmetriek. De geleverde clusteralgoritmen zijn gebaseerd op het K-mean-algoritme.

Het neurale netwerkgedeelte geeft klassen om netwerken weer te geven (Netwerk) en neuronen (Neuron). Men kan opmerken dat de aangeboden functies beperkt zijn in vergelijking met de meest voorkomende neurale netwerkframeworks, maar het kan nog steeds nuttig zijn voor kleine toepassingen met lage vereisten.

8. Hulpprogramma's

8.1. FastMath

FastMath is een statische klasse in org.apache.commons.math3.util en werkt precies zoals java.lang.Math.

Het doel is om in ieder geval dezelfde functies te bieden die we kunnen vinden in java.lang.Math, maar met snellere implementaties. Dus als een programma sterk afhankelijk is van wiskundige berekeningen, is het een goed idee om de aanroepen naar Math.sin () (bijvoorbeeld) om te bellen naar FastMath.sin () om de prestaties van de applicatie te verbeteren. Houd er echter rekening mee dat FastMath is minder nauwkeurig dan java.lang.Math.

8.2. Gemeenschappelijke en speciale functies

Commons-Math biedt standaard wiskundige functies die niet zijn geïmplementeerd in java.lang.Math (zoals faculteit). De meeste van deze functies zijn te vinden in de pakketten org.apache.commons.math3.special en org.apache.commons.math3.util.

Als we bijvoorbeeld de faculteit van 10 willen berekenen, kunnen we eenvoudig doen:

lange faculteit = CombinatorialUtils.factorial (10); 

Functies gerelateerd aan rekenkunde (gcd, lcm, etc.) zijn te vinden in ArithmeticUtils, en functies die verband houden met combinatorisch zijn te vinden in CombinatorialUtils. Enkele andere speciale functies, zoals erf, is toegankelijk in org.apache.commons.math3.special.

8.3. Breuk en complexe getallen

Het is ook mogelijk om meer complexe typen te behandelen met commons-wiskunde: breuken en complexe getallen. Deze structuren stellen ons in staat om specifieke berekeningen uit te voeren op dit soort getallen.

Vervolgens kunnen we de som van twee breuken berekenen en het resultaat weergeven als een stringvoorstelling van een breuk (d.w.z. onder de vorm "a / b"):

Breuk lhs = nieuwe breuk (1, 3); Breuk rhs = nieuwe breuk (2, 5); Fractiesom = lhs.add (rhs); String str = nieuwe FractionFormat (). Format (som); 

Of we kunnen snel de kracht van complexe getallen berekenen:

Complex eerst = nieuw complex (1.0, 3.0); Complexe tweede = nieuw complex (2.0, 5.0); Complexe kracht = first.pow (second); 

9. Conclusie

In deze tutorial hebben we een paar van de interessante dingen gepresenteerd die je kunt doen met Apache Commons Math.

Helaas kan dit artikel niet het hele gebied van analyse of lineaire algebra bestrijken, en geeft het dus alleen voorbeelden voor de meest voorkomende situaties.

Voor meer informatie kunnen we echter de goedgeschreven documentatie lezen, die veel details biedt voor alle aspecten van de bibliotheek.

En, zoals altijd, zijn de codevoorbeelden hier op GitHub te vinden.