Въведение в математиката на Apache Commons

1. Общ преглед

Често се нуждаем от използване на математически инструменти и понякога java.lang.Math просто не е достатъчен. За щастие Apache Commons има за цел да запълни изтичанията на стандартната библиотека с Apache Commons Math.

Apache Commons Math е най-голямата библиотека с математически функции и помощни програми за Java с отворен код. Като се има предвид, че тази статия е само въведение, ние просто ще дадем общ преглед на библиотеката и ще представим най-убедителните случаи на използване.

2. Започвайки с Apache Commons Math

2.1. Използването на математиката на Apache Commons

Apache Commons Math се състои от математически функции ( erf например), структури, представляващи математически концепции (като комплексни числа, полиноми, вектори и др.), И алгоритми, които можем да приложим към тези структури (намиране на корен, оптимизация, напасване на крива, изчисляване на пресичания на геометрични фигури и др.).

2.2. Maven конфигурация

Ако използвате Maven, просто добавете тази зависимост:

 org.apache.commons commons-math3 3.6.1  

2.3. Преглед на пакета

Apache Commons Math е разделен на няколко пакета:

  • org.apache.commons.math3.stat - статистика и статистически тестове
  • org.apache.commons.math3.distribution - разпределения на вероятности
  • org.apache.commons.math3.random - произволни числа, низове и генериране на данни
  • org.apache.commons.math3.analysis - намиране на корен, интегриране, интерполация, полиноми и др.
  • org.apache.commons.math3.linear - матрици, решаващи линейни системи
  • org.apache.commons.math3.geometry - геометрия (евклидови пространства и разделяне на двоично пространство)
  • org.apache.commons.math3.transform - методи за преобразуване (бърз Фурие)
  • org.apache.commons.math3.ode - интегриране на обикновени диференциални уравнения
  • org.apache.commons.math3.fitting - монтаж на крива
  • org.apache.commons.math3.optim - максимизиране или минимизиране на функциите
  • org.apache.commons.math3.genetics - генетични алгоритми
  • org.apache.commons.math3.ml - машинно обучение (клъстериране и невронни мрежи)
  • org.apache.commons.math3.util - общи математически / статистически функции, разширяващи java.lang.Math
  • org.apache.commons.math3.special - специални функции (гама, бета)
  • org.apache.commons.math3.complex - комплексни числа
  • org.apache.commons.math3.fraction - рационални числа

3. Статистика, вероятности и случайност

3.1. Статистика

Пакетът org.apache.commons.math3.stat предоставя няколко инструмента за статистически изчисления. Например, за да изчислим средното, стандартното отклонение и много други, можем да използваме DescriptiveStatistics :

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

В този пакет можем да намерим инструменти за изчисляване на ковариацията, корелация или за извършване на статистически тестове (използвайки TestUtils ).

3.2. Вероятности и разпределения

В основната Java Math.random () може да се използва за генериране на случайни стойности, но тези стойности са равномерно разпределени между 0 и 1.

Понякога искаме да създадем произволна стойност, използвайки по-сложно разпределение. За това можем да използваме рамката, предоставена от org.apache.commons.math3.distribution .

Ето как се генерират произволни стойности според нормалното разпределение със средната стойност 10 и стандартното отклонение 3:

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

Или можем да получим вероятността P (X = x) за получаване на стойност за дискретни разпределения или кумулативната вероятност P (X <= x) за непрекъснати разпределения.

4. Анализ

Функции и алгоритми, свързани с анализа, могат да бъдат намерени в org.apache.commons.math3.analysis .

4.1. Намиране на корен

Коренът е стойност, при която функцията има стойност 0. Commons-Math включва реализация на няколко алгоритми за намиране на корен.

Тук се опитваме да намерим корена на v -> (v * v) - 2 :

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

Първо започваме с дефиниране на функцията, след това дефинираме решаващия инструмент и задаваме желаната точност. И накрая, извикваме API за решаване () .

Операцията за откриване на корен ще се извърши с помощта на няколко повторения, така че е въпрос на намиране на компромис между времето за изпълнение и точността.

4.2. Изчисляване на интеграли

Интеграцията работи почти като намирането на root:

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

Започваме с дефиниране на функция, избираме интегратор измежду съществуващите интеграционни решения, задаваме желаната точност и накрая интегрираме.

5. Линейна алгебра

Ако имаме линейна система от уравнения под формата AX = B, където A е матрица от реални числа, а B вектор на реални числа - Commons Math предоставя структури, които да представят както матрицата, така и вектора, а също така предоставя решаващи решения за намиране стойността на 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); 

Случаят е доста ясен: дефинираме матрица a от масив от масив от двойници и вектор b от масив от вектор.

След това създаваме LUDecomposition, който осигурява решател на уравнения под формата AX = B. Както се посочва в името му, LUDecomposition разчита на LU разлагане и по този начин работи само с квадратни матрици.

За други матрици съществуват различни решатели, които обикновено решават уравнението с помощта на метода с най-малък квадрат.

6. Геометрия

Пакетът org.apache.commons.math3.geometry предоставя няколко класа за представяне на геометрични обекти и няколко инструмента за манипулиране с тях. Важно е да се отбележи, че този пакет е разделен на различни подпакети по отношение на вида геометрия, който искаме да използваме:

Важно е да се отбележи, че този пакет е разделен на различни подпакети по отношение на вида геометрия, който искаме да използваме:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D евклидова геометрия
  • org.apache.commons.math3.geometry.euclidean.twod - 2D евклидова геометрия
  • org.apache.commons.math3.geometry.euclidean.threed - 3D евклидова геометрия
  • org.apache.commons.math3.geometry.spherical.oned - 1D сферична геометрия
  • 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

Също така е възможно да се обработват по-сложни типове, като се използва commons-math: дроб и комплексни числа. Тези структури ни позволяват да извършим конкретни изчисления на този вид числа.

След това можем да изчислим сумата от две фракции и да покажем резултата като низово представяне на фракция (т.е. под формата „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); 

Или можем бързо да изчислим мощността на комплексните числа:

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

9. Заключение

В този урок представихме няколко от интересните неща, които можете да направите с помощта на Apache Commons Math.

За съжаление тази статия не може да обхване цялото поле на анализ или линейна алгебра и по този начин предоставя само примери за най-често срещаните ситуации.

За повече информация обаче можем да прочетем добре написаната документация, която предоставя много подробности за всички аспекти на библиотеката.

И както винаги, примерните кодове могат да бъдат намерени тук на GitHub.