Рубрики
Без рубрики

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

Узнайте о математике Apache Commons, которая является крупнейшей библиотекой математических функций и утилит с открытым исходным кодом для Java.

Автор оригинала: baeldung.

1. Обзор

Мы часто нуждаемся в использовании математических инструментов, а иногда и java.lang.Математики просто недостаточно. К счастью, Apache Commons имеет цель заполнить утечки стандартной библиотеки с помощью Apache Commons Math .

Apache Commons Math-это крупнейшая библиотека математических функций и утилит с открытым исходным кодом для Java. Учитывая, что эта статья является всего лишь введением, мы просто дадим обзор библиотеки и представим наиболее убедительные примеры использования.

2. Начиная с Apache Commons Math

2.1. Использование Apache Commons Math

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 предоставляет несколько инструментов для статистических вычислений. Например, для вычисления среднего, стандартного отклонения и многого другого мы можем использовать Описательную статистику :

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) получения значения для дискретных распределений или кумулятивную вероятность P(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);

Сначала мы начинаем с определения функции, затем определяем решатель и устанавливаем желаемую точность. Наконец, мы вызываем solve() API.

Операция поиска корня будет выполняться с использованием нескольких итераций, поэтому речь идет о поиске компромисса между временем выполнения и точностью.

4.2. Вычисление Интегралов

Интеграция работает почти так же, как поиск корня:

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. Линейная алгебра

Если у нас есть линейная система уравнений в виде, где A – матрица действительных чисел, а B-вектор действительных чисел, – математика Commons предоставляет структуры для представления как матрицы, так и вектора, а также предоставляет решатели для нахождения значения 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 из массива вектора.

Затем мы создаем декомпозицию LU , которая обеспечивает решение уравнений в форме. Как следует из его названия, LU-декомпозиция опирается на 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 сферическая геометрия

Наиболее полезными классами, вероятно, являются Vector2D , Vector3D , Line и Segment . Они используются для представления 2D-векторов (или точек), 3D-векторов, линий и сегментов соответственно.

При использовании классов, упомянутых выше, можно выполнить некоторые вычисления. Например, следующий код выполняет вычисление пересечения двух 2D-линий:

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

Также возможно использовать эти структуры для получения расстояния от точки до линии или ближайшей точки линии до другой линии (в 3D).

7. Оптимизация, генетические алгоритмы и машинное обучение

Commons-Math также предоставляет некоторые инструменты и алгоритмы для более сложных задач, связанных с оптимизацией и машинным обучением.

7.1. Оптимизация

Оптимизация обычно заключается в минимизации или максимизации функций затрат. Алгоритмы оптимизации можно найти в org.apache.commons.math3.optim и org.apache.commons.math3.optimimization . Она включает в себя алгоритмы линейной и нелинейной оптимизации.

Мы можем отметить, что в пакетах optimal и optimization есть дубликаты классов: пакет optimization в основном устарел и будет удален в Commons Math 4.

7.2. Генетические алгоритмы

Генетические алгоритмы-это своего рода метаэвристика: они являются решением для поиска приемлемого решения проблемы, когда детерминированные алгоритмы работают слишком медленно. Обзор генетических алгоритмов можно найти здесь .

Пакет org.apache.commons.math3.genetics предоставляет платформу для выполнения вычислений с использованием генетических алгоритмов. Он содержит структуру, которая может быть использована для представления популяции и хромосомы, а также стандартные алгоритмы для выполнения операций мутации, кроссовера и отбора.

Следующие классы дают хорошую отправную точку:

7.3. Машинное обучение

Машинное обучение в Commons-Math делится на две части: кластеризация и нейронные сети.

Часть кластеризации состоит в нанесении метки на векторы в соответствии с их сходством относительно метрики расстояния. Предлагаемые алгоритмы кластеризации основаны на алгоритме K-средних.

Часть нейронной сети содержит классы для представления сетей ( Сеть ) и нейронов ( Нейрон ). Можно отметить, что предоставляемые функции ограничены по сравнению с наиболее распространенными фреймворками нейронных сетей, но они все равно могут быть полезны для небольших приложений с низкими требованиями.

8. Коммунальные услуги

8.1. FastMath

FastMath – это статический класс, расположенный в org.apache.commons.math3.util и работающий точно так же, как java.lang.Математика .

Его цель-предоставить, по крайней мере, те же функции, которые мы можем найти в java.lang.Математика , но с более быстрыми реализациями. Поэтому, когда программа сильно полагается на математические вычисления, рекомендуется заменить вызовы Math.sin() (например) на вызовы FastMath.sin() для повышения производительности приложения. С другой стороны, обратите внимание, что Fast Math менее точен, чем java.lang.Math.

8.2. Общие и специальные функции

Commons-Math предоставляет стандартные математические функции, которые не реализованы в java.lang.Математика (как факториал). Большинство из этих функций можно найти в пакетах org.apache.commons.math3.special и org.apache.commons.math3.util .

Например, если мы хотим вычислить факториал 10, мы можем просто сделать:

long factorial = CombinatorialUtils.factorial(10);

Функции, связанные с арифметикой ( gcd , lcm и т.д.), можно найти в Арифметические функции и функции , связанные с комбинаторными, можно найти в CombinatorialUtils . Некоторые другие специальные функции, такие как erf , доступны в файле org.apache.commons.math3.special .

8.3. Дробные и комплексные числа

Также можно обрабатывать более сложные типы с помощью 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 .