Pengenalan Matematik Apache Commons

1. Gambaran keseluruhan

Kita sering memerlukan penggunaan alat matematik, dan kadang-kadang java.lang.Math tidak mencukupi. Nasib baik, Apache Commons mempunyai matlamat untuk mengisi kebocoran perpustakaan standard, dengan Apache Commons Math.

Apache Commons Math adalah perpustakaan sumber terbuka terbesar fungsi dan utiliti matematik untuk Java. Memandangkan artikel ini hanyalah pengenalan, kami hanya akan memberikan gambaran keseluruhan mengenai perpustakaan dan memaparkan kes penggunaan yang paling menarik.

2. Bermula dengan Apache Commons Math

2.1. Penggunaan Matematik Apache Commons

Apache Commons Math terdiri daripada fungsi matematik ( erf misalnya), struktur yang mewakili konsep matematik (seperti nombor kompleks, polinomial, vektor, dll.), Dan algoritma yang dapat kita terapkan pada struktur ini (penemuan root, pengoptimuman, pemasangan lengkung, pengiraan persilangan angka geometri, dan lain-lain).

2.2. Konfigurasi Maven

Sekiranya anda menggunakan Maven, cukup tambahkan kebergantungan ini:

 org.apache.commons commons-math3 3.6.1  

2.3. Gambaran Keseluruhan Pakej

Apache Commons Math dibahagikan kepada beberapa pakej:

  • org.apache.commons.math3.stat - ujian statistik dan statistik
  • org.apache.commons.math3.distribution - taburan kebarangkalian
  • org.apache.commons.math3.random - nombor rawak, rentetan dan penjanaan data
  • org.apache.commons.math3.analysis - penemuan akar, integrasi, interpolasi, polinomial, dll.
  • org.apache.commons.math3.linear - matriks, menyelesaikan sistem linear
  • org.apache.commons.math3.geometry - geometri (ruang Euclidean dan partisi ruang binari)
  • org.apache.commons.math3.transform - mengubah kaedah (cepat Fourier)
  • org.apache.commons.math3.ode - penyatuan persamaan pembezaan biasa
  • org.apache.commons.math3.fitting - pemasangan kurva
  • org.apache.commons.math3.optim - memaksimumkan fungsi atau meminimumkan
  • org.apache.commons.math3.genetics - algoritma genetik
  • org.apache.commons.math3.ml - pembelajaran mesin (pengelompokan dan rangkaian saraf)
  • org.apache.commons.math3.util - fungsi matematik / stat biasa yang memanjangkan java.lang.Math
  • org.apache.commons.math3.special - fungsi khas (Gamma, Beta)
  • org.apache.commons.math3.complex - nombor kompleks
  • org.apache.commons.math3.fraction - nombor rasional

3. Statistik, Kebarangkalian, dan Keacakan

3.1. Statistik

Pakej org.apache.commons.math3.stat menyediakan beberapa alat untuk pengiraan statistik. Sebagai contoh, untuk mengira min, sisihan piawai, dan banyak lagi, kita boleh menggunakan Statistik Deskriptif :

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

Dalam pakej ini, kita dapat mencari alat untuk menghitung kovarians, korelasi, atau untuk melakukan ujian statistik (menggunakan TestUtils ).

3.2. Kebarangkalian dan Taburan

Di Java inti, Math.random () dapat digunakan untuk menghasilkan nilai rawak, tetapi nilai-nilai ini diedarkan secara seragam antara 0 dan 1.

Kadang kala, kita ingin menghasilkan nilai rawak menggunakan sebaran yang lebih kompleks. Untuk ini, kita boleh menggunakan kerangka yang disediakan oleh org.apache.commons.math3.distribusi .

Berikut adalah cara menghasilkan nilai rawak mengikut taburan normal dengan min 10 dan sisihan piawai 3:

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

Atau kita dapat memperoleh kebarangkalian P (X = x) mendapatkan nilai untuk pengedaran diskrit, atau kebarangkalian kumulatif P (X <= x) untuk pengedaran berterusan.

4. Analisis

Fungsi dan algoritma berkaitan analisis boleh didapati di org.apache.commons.math3.analysis .

4.1. Mencari Akar

Akar adalah nilai di mana fungsi mempunyai nilai 0. Commons-Math merangkumi pelaksanaan beberapa algoritma pencarian akar.

Di sini, kami cuba mencari punca 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); 

Pertama, kita mulakan dengan menentukan fungsi, kemudian kita menentukan pemecah, dan kita menetapkan ketepatan yang diinginkan. Akhirnya, kami memanggil API penyelesaian () .

Operasi mencari akar akan dilakukan menggunakan beberapa lelaran, jadi masalah mencari kompromi antara waktu pelaksanaan dan ketepatan.

4.2. Mengira Integral

Penyatuan berfungsi hampir sama seperti penemuan akar:

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

Kita mulakan dengan menentukan fungsi, kita memilih integrator antara penyelesaian integrasi yang ada, kita menetapkan ketepatan yang diinginkan, dan akhirnya, kita mengintegrasikan.

5. Aljabar Linear

Sekiranya kita mempunyai sistem persamaan linear di bawah bentuk AX = B di mana A adalah matriks nombor nyata, dan B vektor nombor nyata - Commons Math menyediakan struktur untuk mewakili matriks dan vektor, dan juga menyediakan pemecah untuk mencari nilai 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); 

Sarungnya cukup mudah: kita menentukan matriks a dari array array ganda, dan vektor b dari array vektor.

Kemudian, kami membuat komposisi LUD yang menyediakan penyelesai untuk persamaan di bawah bentuk AX = B. Seperti namanya, LUDecomposition bergantung pada penguraian LU, dan dengan itu hanya berfungsi dengan matriks persegi.

Untuk matriks lain, penyelesai yang berbeza ada, biasanya menyelesaikan persamaan menggunakan kaedah kuasa dua paling sedikit.

6. Geometri

Pakej org.apache.commons.math3.geometry menyediakan beberapa kelas untuk mewakili objek geometri dan beberapa alat untuk memanipulasinya. Penting untuk diperhatikan bahawa pakej ini dibahagikan kepada sub-pakej yang berbeza, mengenai jenis geometri yang ingin kita gunakan:

Penting untuk diperhatikan bahawa pakej ini dibahagikan kepada sub-pakej yang berbeza, mengenai jenis geometri yang ingin kita gunakan:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D Euclidean geometri
  • org.apache.commons.math3.geometry.euclidean.twod - geometri Euclidean 2D
  • org.apache.commons.math3.geometry.euclidean.threed - geometri Euclidean 3D
  • org.apache.commons.math3.geometry.spherical.oned - geometri sfera 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

Juga mungkin untuk menangani jenis yang lebih kompleks menggunakan commons-math: pecahan dan nombor kompleks. Struktur ini membolehkan kita melakukan pengiraan khusus pada nombor seperti ini.

Kemudian, kita dapat menghitung jumlah dua pecahan dan menampilkan hasilnya sebagai representasi rentetan dari pecahan (yaitu di bawah bentuk "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); 

Atau, kita dapat mengira kekuatan nombor kompleks dengan cepat:

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

9. Kesimpulannya

Dalam tutorial ini, kami membentangkan beberapa perkara menarik yang boleh anda lakukan dengan menggunakan Apache Commons Math.

Malangnya, artikel ini tidak dapat merangkumi keseluruhan bidang analisis atau aljabar linear, dan dengan demikian, hanya memberikan contoh untuk situasi yang paling biasa.

Namun, untuk maklumat lebih lanjut, kami dapat membaca dokumentasi yang ditulis dengan baik, yang memberikan banyak perincian untuk semua aspek perpustakaan.

Dan, seperti biasa, contoh kod boleh didapati di GitHub di sini.