Einführung in Apache Commons Math

Einführung in Apache Commons Math

1. Überblick

Wir benötigen häufig mathematische Werkzeuge, und manchmal reichtjava.lang.Math einfach nicht aus. Glücklicherweise hat Apache Commons das Ziel, die Lecks der Standardbibliothek mitApache Commons Math zu füllen.

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

2. Beginnend mit Apache Commons Math

2.1. Die Verwendung von Apache Commons Math

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

2.2. Maven-Konfiguration

Wenn Sie Maven verwenden, fügen Sie einfachthis dependency 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 Raumaufteilung)

  • 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. Statistik, Wahrscheinlichkeiten und Zufälligkeit

3.1. Statistiken

Das Paketorg.apache.commons.math3.stat bietet verschiedene Tools für statistische Berechnungen. Um beispielsweise Mittelwert, Standardabweichung und vieles mehr zu berechnen, können wirDescriptiveStatistics 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 (unter Verwendung vonTestUtils).

3.2. Wahrscheinlichkeiten und Verteilungen

In Kern-Java kannMath.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 vonorg.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 WahrscheinlichkeitP(X = x) erhalten, einen Wert für diskrete Verteilungen zu erhalten, oder die kumulative WahrscheinlichkeitP(X ⇐ x) für kontinuierliche Verteilungen.

4. Analyse

Analysebezogene Funktionen und Algorithmen sind inorg.apache.commons.math3.analysis angegeben.

4.1. Wurzelfindung

Eine Wurzel ist ein Wert, bei dem eine Funktion den Wert 0 hat. Commons-Math beinhaltet die Implementierung von mehrerenroot-finding algorithms.

Hier versuchen wir, die Wurzel vonv → (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 den Löser und stellen die gewünschte Genauigkeit ein. Schließlich rufen wir diesolve() 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 Auffinden 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 beginnen mit der Definition einer Funktion, wählen einen Integrator unter den vorhandenenavailable integration solutionsaus, stellen die gewünschte Genauigkeit ein und integrieren schließlich.

5. Lineare Algebra

Wenn wir ein lineares Gleichungssystem mit der Form AX = B haben, wobei A eine Matrix von reellen Zahlen und B ein Vektor von reellen Zahlen ist, liefert Commons Math Strukturen, um sowohl die Matrix als auch den Vektor darzustellen, und liefert auch zu findende Löser 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 Matrixa aus einem Array von Doppelarrays und einen Vektorb aus einem Array eines Vektors.

Dann erstellen wir einLUDecomposition, das einen Löser für Gleichungen in der Form AX = B liefert. Wie der Name schon sagt, stützt sichLUDecomposition aufLU decomposition und funktioniert daher nur mit quadratischen Matrizen.

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

6. Geometrie

Das Paketorg.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-Kugelgeometrie

  • org.apache.commons.math3.geometry.spherical.twod – sphärische 2D-Geometrie

Die nützlichsten Klassen sind wahrscheinlichVector2D,Vector3D,Line undSegment. Sie werden zur Darstellung von 2D-Vektoren (oder Punkten), 3D-Vektoren, Linien und Segmenten verwendet.

Bei Verwendung der oben genannten Klassen ist es möglich, einige Berechnungen durchzuführen. Mit dem folgenden Code wird beispielsweise die Schnittmenge zweier 2D-Linien berechnet:

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

Es ist auch möglich, diese Strukturen zu verwenden, um den Abstand eines Punkts zu einer Linie oder den nächstgelegenen Punkt einer Linie zu einer anderen Linie (in 3D) zu ermitteln.

7. Optimierung, genetische Algorithmen und maschinelles Lernen

Commons-Math bietet auch einige Tools und Algorithmen für komplexere Aufgaben im Zusammenhang mit Optimierung und maschinellem Lernen.

7.1. Optimierung

Die Optimierung besteht normalerweise darin, die Kostenfunktionen zu minimieren oder zu maximieren. Optimierungsalgorithmen sind inorg.apache.commons.math3.optim undorg.apache.commons.math3.optimimization zu finden. Es enthält lineare und nichtlineare Optimierungsalgorithmen.

Wir können feststellen, dass die Paketeoptim undoptimization doppelte Klassen enthalten: Das Paketoptimization ist größtenteils veraltet und wird in Commons Math 4 entfernt.

7.2. Genetische Algorythmen

Genetische Algorithmen sind eine Art Meta-Heuristik: Sie sind eine Lösung, um eine akzeptable Lösung für ein Problem zu finden, wenn deterministische Algorithmen zu langsam sind. Eine Übersicht über genetische Algorithmen finden Sie inhere.

Das Paketorg.apache.commons.math3.genetics bietet ein Framework für die Durchführung von Berechnungen mit genetischen Algorithmen. Es enthält eine Struktur, die zur Darstellung einer Population und eines Chromosoms verwendet werden kann, sowie Standardalgorithmen zur Durchführung von Mutations-, Crossover- und Selektionsoperationen.

Die folgenden Klassen geben einen guten Startpunkt:

  • GeneticAlgorithmist das genetische Algorithmus-Framework

  • Populationist die Schnittstelle, die eine Population darstellt

  • Chromosomeist die Grenzfläche, die ein Chromosom darstellt

7.3. Maschinelles lernen

Maschinelles Lernen in Commons-Math gliedert sich in zwei Teile: Clustering und Neuronale Netze.

Der Clustering-Teil besteht darin, Vektoren entsprechend ihrer Ähnlichkeit in Bezug auf eine Abstandsmetrik mit einem Label zu versehen. Die zur Verfügung gestellten Clustering-Algorithmen basieren auf dem K-Means-Algorithmus.

Der neuronale Netzwerkteil gibt Klassen an, um Netzwerke (Network) und Neuronen (Neuron) darzustellen. Man mag bemerken, dass die zur Verfügung gestellten Funktionen im Vergleich zu den gängigsten neuronalen Netzwerk-Frameworks begrenzt sind, aber dennoch für kleine Anwendungen mit geringen Anforderungen nützlich sein können.

8. Dienstprogramme

8.1. FastMath

FastMath ist eine statische Klasse inorg.apache.commons.math3.util, die genau wiejava.lang.Math funktioniert.

Ihr Zweck ist es, mindestens die gleichen Funktionen bereitzustellen, die wir injava.lang.Math finden können, jedoch mit schnelleren Implementierungen. Wenn ein Programm stark auf mathematische Berechnungen angewiesen ist, ist es eine gute Idee, Aufrufe vonMath.sin() (zum Beispiel) durch Aufrufe vonFastMath.sin() zu ersetzen, um die Leistung der Anwendung zu verbessern. Beachten Sie andererseits, dassFastMath weniger genau ist alsjava.lang.Math.

8.2. Gemeinsame und spezielle Funktionen

Commons-Math bietet mathematische Standardfunktionen, die nicht injava.lang.Math implementiert sind (wie Fakultät). Die meisten dieser Funktionen finden Sie in den Paketenorg.apache.commons.math3.special undorg.apache.commons.math3.util.

Wenn wir beispielsweise die Fakultät von 10 berechnen möchten, können wir einfach Folgendes tun:

long factorial = CombinatorialUtils.factorial(10);

Funktionen in Bezug auf Arithmetik (gcd,lcm usw.) sind inArithmeticUtils enthalten, und Funktionen in Bezug auf kombinatorische Funktionen sind inCombinatorialUtils enthalten. Auf einige andere Sonderfunktionen wieerf kann inorg.apache.commons.math3.special zugegriffen werden.

8.3. Bruch und komplexe Zahlen

Es ist auch möglich, komplexere Typen mit Commons-Math zu behandeln: Brüche 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 von zwei Brüchen berechnen und das Ergebnis als Zeichenfolgendarstellung eines Bruchs anzeigen (d. H. unter dem Formular "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.

Für weitere Informationen können wir jedoch die gut geschriebenendocumentation lesen, die viele Details für alle Aspekte der Bibliothek enthalten.

Und wie immer finden sich die Codebeispiele inhere on GitHub.