Einführung in Apache Commons Math

1. Übersicht

Wir brauchen häufig mathematische Werkzeuge, und manchmal reicht java.lang.Math einfach nicht aus. Glücklicherweise hat Apache Commons das Ziel, die Lücken der Standardbibliothek mit Apache Commons Math zu schließen.

Apache Commons Math ist die größte Open-Source-Bibliothek mit mathematischen Funktionen und Dienstprogrammen für Java. Da dieser Artikel nur eine Einführung ist, geben wir nur einen Überblick über die Bibliothek und präsentieren die überzeugendsten Anwendungsfälle.

2. Beginnen Sie mit Apache Commons Math

2.1. Die Verwendung von Apache Commons Math

Apache Commons Math besteht aus mathematischen Funktionen ( erf zum Beispiel), Strukturen, die mathematische Konzepte darstellen (wie komplexe Zahlen, Polynome, Vektoren usw.), und Algorithmen, die wir auf diese Strukturen anwenden können (Wurzelfindung, Optimierung, Kurvenanpassung, Berechnung von Schnittpunkte geometrischer Figuren usw.).

2.2. Maven-Konfiguration

Wenn Sie Maven verwenden, fügen Sie einfach diese Abhängigkeit hinzu:

 org.apache.commons commons-math3 3.6.1  

2.3. Paketübersicht

Apache Commons Math ist in mehrere Pakete unterteilt:

  • org.apache.commons.math3.stat - Statistiken und statistische Tests
  • org.apache.commons.math3.distribution - Wahrscheinlichkeitsverteilungen
  • org.apache.commons.math3.random - Zufallszahlen, Zeichenfolgen und Datengenerierung
  • org.apache.commons.math3.analysis - Wurzelfindung, Integration, Interpolation, Polynome usw.
  • org.apache.commons.math3.linear - Matrizen, die lineare Systeme lösen
  • org.apache.commons.math3.geometry - Geometrie (euklidische Räume und binäre Raumpartitionierung )
  • org.apache.commons.math3.transform - Transformationsmethoden (schnelles Fourier)
  • org.apache.commons.math3.ode - gewöhnliche Integration von Differentialgleichungen
  • org.apache.commons.math3.fitting - Kurvenanpassung
  • org.apache.commons.math3.optim - Funktionsmaximierung oder -minimierung
  • org.apache.commons.math3.genetics - genetische Algorithmen
  • org.apache.commons.math3.ml - maschinelles Lernen (Clustering und neuronale Netze)
  • org.apache.commons.math3.util - allgemeine mathematische / statistische Funktionen, die java.lang.Math erweitern
  • org.apache.commons.math3.special - Sonderfunktionen (Gamma, Beta)
  • org.apache.commons.math3.complex - komplexe Zahlen
  • org.apache.commons.math3.fraction - rationale Zahlen

3. Statistiken, Wahrscheinlichkeiten und Zufälligkeiten

3.1. Statistiken

Das Paket org.apache.commons.math3.stat bietet verschiedene Tools für statistische Berechnungen. Um beispielsweise Mittelwert, Standardabweichung und vieles mehr zu berechnen, können wir DescriptiveStatistics verwenden :

double[] values = new double[] {65, 51 , 16, 11 , 6519, 191 ,0 , 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = new DescriptiveStatistics(); for (double v : values) { descriptiveStatistics.addValue(v); } double mean = descriptiveStatistics.getMean(); double median = descriptiveStatistics.getPercentile(50); double standardDeviation = descriptiveStatistics.getStandardDeviation(); 

In diesem Paket finden Sie Tools zur Berechnung der Kovarianz, Korrelation oder zur Durchführung statistischer Tests (mithilfe von TestUtils ).

3.2. Wahrscheinlichkeiten und Verteilungen

In Java kann Math.random () zum Generieren von Zufallswerten verwendet werden, diese Werte sind jedoch gleichmäßig zwischen 0 und 1 verteilt.

Manchmal möchten wir einen zufälligen Wert mit einer komplexeren Verteilung erzeugen. Hierfür können wir das von org.apache.commons.math3.distribution bereitgestellte Framework verwenden .

So generieren Sie Zufallswerte gemäß der Normalverteilung mit dem Mittelwert von 10 und der Standardabweichung von 3:

NormalDistribution normalDistribution = new NormalDistribution(10, 3); double randomValue = normalDistribution.sample(); 

Oder wir können die Wahrscheinlichkeit P (X = x) erhalten , einen Wert für diskrete Verteilungen zu erhalten, oder die kumulative Wahrscheinlichkeit P (X <= x) für kontinuierliche Verteilungen.

4. Analyse

Analysebezogene Funktionen und Algorithmen finden Sie in org.apache.commons.math3.analysis .

4.1. Wurzelfindung

Eine Wurzel ist ein Wert, bei dem eine Funktion den Wert 0 hat. Commons-Math umfasst die Implementierung mehrerer Algorithmen zur Wurzelfindung.

Hier versuchen wir, die Wurzel von v -> (v * v) - 2 zu finden :

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

Zuerst definieren wir die Funktion, dann definieren wir den Löser und stellen die gewünschte Genauigkeit ein. Schließlich rufen wir die Lösung () API auf.

Die Root-Finding-Operation wird mit mehreren Iterationen ausgeführt. Es geht also darum, einen Kompromiss zwischen Ausführungszeit und Genauigkeit zu finden.

4.2. Integrale berechnen

Die Integration funktioniert fast wie das Finden von Wurzeln:

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

Wir definieren zunächst eine Funktion, wählen einen Integrator aus den verfügbaren Integrationslösungen aus, stellen die gewünschte Genauigkeit ein und integrieren schließlich.

5. Lineare Algebra

Wenn wir ein lineares Gleichungssystem in der Form AX = B haben, wobei A eine Matrix reeller Zahlen und B ein Vektor reeller Zahlen ist, liefert Commons Math Strukturen, um sowohl die Matrix als auch den Vektor darzustellen, und liefert auch Löser zum Finden der Wert von X:

RealMatrix a = new Array2DRowRealMatrix( new double[][] { { 2, 3, -2 }, { -1, 7, 6 }, { 4, -3, -5 } }, false); RealVector b = new ArrayRealVector(n ew double[] { 1, -2, 1 }, false); DecompositionSolver solver = new LUDecomposition(a).getSolver(); RealVector solution = solver.solve(b); 

Der Fall ist ziemlich einfach: Wir definieren eine Matrix a aus einem Array von Doppelarrays und einen Vektor b aus einem Array eines Vektors.

Dann erstellen wir eine LUDecomposition, die einen Löser für Gleichungen in der Form AX = B bereitstellt . Wie der Name schon sagt, basiert LUDecomposition auf der LU-Zerlegung und arbeitet daher nur mit quadratischen Matrizen.

Für andere Matrizen existieren andere Löser, die die Gleichung normalerweise mit der Methode der kleinsten Quadrate lösen.

6. Geometrie

Das Paket org.apache.commons.math3.geometry bietet mehrere Klassen zur Darstellung geometrischer Objekte und verschiedene Werkzeuge zur Bearbeitung. Es ist wichtig zu beachten, dass dieses Paket in Bezug auf die Art der Geometrie, die wir verwenden möchten, in verschiedene Unterpakete unterteilt ist:

Es ist wichtig zu beachten, dass dieses Paket in Bezug auf die Art der Geometrie, die wir verwenden möchten, in verschiedene Unterpakete unterteilt ist:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D euklidische Geometrie
  • org.apache.commons.math3.geometry.euclidean.twod - Euklidische 2D-Geometrie
  • org.apache.commons.math3.geometry.euclidean.threed - Euklidische 3D-Geometrie
  • org.apache.commons.math3.geometry.spherical.oned - 1D sphärische Geometrie
  • org.apache.commons.math3.geometry.spherical.twod – 2D spherical geometry

The most useful classes are probably Vector2D, Vector3D, Line, and Segment. They are used for representing 2D vectors (or points), 3D vectors, lines, and segments respectively.

When using classes mentioned above, it is possible to perform some computation. For instance, the following code performs the calculation of the intersection of two 2D lines:

Line l1 = new Line(new Vector2D(0, 0), new Vector2D(1, 1), 0); Line l2 = new Line(new Vector2D(0, 1), new Vector2D(1, 1.5), 0); Vector2D intersection = l1.intersection(l2); 

It is also feasible to use these structures to get the distance of a point to a line, or the closest point of a line to another line (in 3D).

7. Optimization, Genetic Algorithms, and Machine Learning

Commons-Math also provides some tools and algorithms for more complex tasks related to optimization and machine learning.

7.1. Optimization

Optimization usually consists of minimizing or maximizing cost functions. Algorithms for optimization can be found in org.apache.commons.math3.optim and org.apache.commons.math3.optimimization. It includes linear and nonlinear optimization algorithms.

We can note that there are duplicate classes in the optim and optimization packages: the optimization package is mostly deprecated and will be removed in the Commons Math 4.

7.2. Genetic Algorithms

Genetic algorithms are a kind of meta-heuristics: they are a solution to finding an acceptable solution to a problem when deterministic algorithms are too slow. An overview of genetic algorithms can be found here.

The package org.apache.commons.math3.genetics provides a framework to perform computations using genetic algorithms. It contains structure that can be used to represent a population and a chromosome, and standard algorithms to perform mutation, crossover, and selection operations.

The following classes give a good start point:

  • GeneticAlgorithm – the genetic algorithm framework
  • Population – the interface representing a population
  • Chromosome – the interface representing a chromosome

7.3. Machine Learning

Machine learning in Commons-Math is divided into two parts: clustering and neural networks.

The clustering part consists of putting a label on vectors according to their similarity regarding a distance metric. The clustering algorithms provided are based on the K-means algorithm.

The neural network part gives classes to represent networks (Network) and neurons (Neuron). One may note that the provided functions are limited compared to the most common neural network frameworks, but it can still be useful for small applications with low requirements.

8. Utilities

8.1. FastMath

FastMath is a static class located in org.apache.commons.math3.util and working exactly like java.lang.Math.

Its purpose is to provide, at least the same functions that we can found in java.lang.Math, but with faster implementations. So, when a program is heavily relying on mathematical computations, it is a good idea to replace calls to Math.sin() (for instance) to calls to FastMath.sin() to improve the performance of the application. On the other hand please note that FastMath is less accurate than java.lang.Math.

8.2. Common and Special Functions

Commons-Math provides standard mathematical functions that are not implemented in java.lang.Math (like factorial). Most of these functions can be found in the packages org.apache.commons.math3.special and org.apache.commons.math3.util.

For instance, if we want to compute the factorial of 10 we can simply do:

long factorial = CombinatorialUtils.factorial(10); 

Functions related to arithmetic (gcd, lcm, etc.) can be found in ArithmeticUtils, and functions related to combinatorial can be found in CombinatorialUtils. Some other special functions, like erf, can be accessed in org.apache.commons.math3.special.

8.3. Fraction and Complex Numbers

Es ist auch möglich, komplexere Typen mit Commons-Math zu behandeln: Bruch und komplexe Zahlen. Diese Strukturen ermöglichen es uns, spezifische Berechnungen für diese Art von Zahlen durchzuführen.

Dann können wir die Summe zweier Brüche berechnen und das Ergebnis als Zeichenfolgendarstellung eines Bruchs anzeigen (dh unter der Form „a / b“):

Fraction lhs = new Fraction(1, 3); Fraction rhs = new Fraction(2, 5); Fraction sum = lhs.add(rhs); String str = new FractionFormat().format(sum); 

Oder wir können die Potenz komplexer Zahlen schnell berechnen:

Complex first = new Complex(1.0, 3.0); Complex second = new Complex(2.0, 5.0); Complex power = first.pow(second); 

9. Fazit

In diesem Tutorial haben wir einige interessante Dinge vorgestellt, die Sie mit Apache Commons Math tun können.

Leider kann dieser Artikel nicht den gesamten Bereich der Analyse oder der linearen Algebra abdecken und bietet daher nur Beispiele für die häufigsten Situationen.

Weitere Informationen finden Sie in der gut geschriebenen Dokumentation, die viele Details zu allen Aspekten der Bibliothek enthält.

Und wie immer finden Sie die Codebeispiele hier auf GitHub.