Pengantar Apache Commons Math

1. Ikhtisar

Kami sering membutuhkan alat matematika, dan terkadang java.lang.Math tidak cukup. Untungnya, Apache Commons memiliki tujuan untuk mengisi kebocoran pustaka standar, dengan Apache Commons Math.

Apache Commons Math adalah pustaka sumber terbuka terbesar untuk fungsi dan utilitas matematika untuk Java. Mengingat bahwa artikel ini hanyalah pengantar, kami hanya akan memberikan gambaran umum tentang pustaka dan menyajikan kasus penggunaan yang paling menarik.

2. Dimulai dengan Apache Commons Math

2.1. Penggunaan Apache Commons Math

Apache Commons Math terdiri dari fungsi matematika ( misalnya erf ), struktur yang mewakili konsep matematika (seperti bilangan kompleks, polinomial, vektor, dll.), Dan algoritme yang dapat kita terapkan pada struktur ini (temuan root, pengoptimalan, pemasangan kurva, komputasi persimpangan angka geometris, dll.).

2.2. Konfigurasi Maven

Jika Anda menggunakan Maven, cukup tambahkan dependensi ini:

 org.apache.commons commons-math3 3.6.1  

2.3. Ikhtisar Paket

Apache Commons Math dibagi menjadi beberapa paket:

  • org.apache.commons.math3.stat - statistik dan uji statistik
  • org.apache.commons.math3.distribution - distribusi probabilitas
  • org.apache.commons.math3.random - bilangan acak, string, dan pembuatan data
  • org.apache.commons.math3.analysis - pencarian akar, integrasi, interpolasi, polinomial, dll.
  • org.apache.commons.math3.linear - matriks, menyelesaikan sistem linier
  • org.apache.commons.math3.geometry - geometri (ruang Euclidean dan partisi ruang biner)
  • org.apache.commons.math3.transform - metode transformasi (Fast Fourier)
  • org.apache.commons.math3.ode - integrasi persamaan diferensial biasa
  • org.apache.commons.math3.fitting - pemasangan kurva
  • org.apache.commons.math3.optim - maksimalisasi atau minimisasi fungsi
  • org.apache.commons.math3.genetics - algoritma genetika
  • org.apache.commons.math3.ml - pembelajaran mesin (pengelompokan dan jaringan neural)
  • org.apache.commons.math3.util - fungsi matematika / stat umum yang memperluas java.lang.Math
  • org.apache.commons.math3.special - fungsi khusus (Gamma, Beta)
  • org.apache.commons.math3.complex - bilangan kompleks
  • org.apache.commons.math3.fraction - bilangan rasional

3. Statistik, Probabilitas, dan Keacakan

3.1. Statistik

Paket org.apache.commons.math3.stat menyediakan beberapa alat untuk penghitungan statistik. Misalnya, untuk menghitung mean, standar deviasi, dan banyak lagi, kita bisa menggunakan 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(); 

Dalam paket ini, kita dapat menemukan alat untuk menghitung kovarian, korelasi, atau untuk melakukan uji statistik (menggunakan TestUtils ).

3.2. Probabilitas dan Distribusi

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

Terkadang, kami ingin menghasilkan nilai acak menggunakan distribusi yang lebih kompleks. Untuk ini, kita dapat menggunakan kerangka kerja yang disediakan oleh org.apache.commons.math3.distribution .

Berikut adalah cara menghasilkan nilai acak menurut distribusi normal dengan mean 10 dan standar deviasi 3:

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

Atau kita dapat memperoleh probabilitas P (X = x) untuk mendapatkan nilai untuk distribusi diskrit, atau probabilitas kumulatif P (X <= x) untuk distribusi kontinu.

4. Analisis

Fungsi dan algoritme terkait analisis dapat ditemukan di org.apache.commons.math3.analysis .

4.1. Pencarian Root

Root adalah nilai di mana fungsi memiliki nilai 0. Commons-Math mencakup implementasi dari beberapa algoritma pencarian root.

Di sini, kami mencoba menemukan root dari 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 mulai dengan mendefinisikan fungsi, lalu kita mendefinisikan pemecah, dan kita mengatur akurasi yang diinginkan. Terakhir, kami memanggil API Solving () .

Operasi pencarian root akan dilakukan menggunakan beberapa iterasi, jadi ini masalah menemukan kompromi antara waktu eksekusi dan akurasi.

4.2. Menghitung Integral

Integrasi bekerja hampir seperti pencarian 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); 

Kami mulai dengan mendefinisikan fungsi, kami memilih integrator di antara solusi integrasi yang tersedia yang ada, kami menetapkan akurasi yang diinginkan, dan akhirnya, kami mengintegrasikan.

5. Aljabar Linear

Jika kita memiliki sistem persamaan linier dalam bentuk AX = B di mana A adalah matriks bilangan real, dan B adalah vektor bilangan real - 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); 

Kasusnya cukup mudah: kita mendefinisikan matriks a dari larik larik ganda, dan vektor b dari larik vektor.

Kemudian, kita membuat dekomposisi LUD yang menyediakan pemecah persamaan di bawah bentuk AX = B. Seperti yang dinyatakan oleh namanya, dekomposisi LUD bergantung pada dekomposisi LU, dan karenanya hanya berfungsi dengan matriks persegi.

Untuk matriks lain, terdapat pemecah yang berbeda, biasanya menyelesaikan persamaan menggunakan metode kuadrat terkecil.

6. Geometri

Paket org.apache.commons.math3.geometry menyediakan beberapa kelas untuk merepresentasikan objek geometris dan beberapa alat untuk memanipulasinya. Penting untuk dicatat bahwa paket ini dibagi ke dalam sub-paket yang berbeda, sehubungan dengan jenis geometri yang ingin kami gunakan:

Penting untuk dicatat bahwa paket ini dibagi ke dalam sub-paket yang berbeda, sehubungan dengan jenis geometri yang ingin kami 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 bola 1D
  • org.apache.commons.math3.geometry.spherical.twod - geometri bola 2D

Kelas yang paling berguna mungkin adalah Vector2D , Vector3D , Garis , dan Segmen . Mereka digunakan untuk mewakili masing-masing vektor 2D (atau titik), vektor 3D, garis, dan segmen.

Saat menggunakan kelas yang disebutkan di atas, dimungkinkan untuk melakukan beberapa komputasi. Misalnya, kode berikut melakukan perhitungan perpotongan dua garis 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); 

Struktur ini juga dapat digunakan untuk mendapatkan jarak suatu titik ke suatu garis, atau titik terdekat dari suatu garis ke garis lain (dalam 3D).

7. Optimasi, Algoritma Genetika, dan Pembelajaran Mesin

Commons-Math juga menyediakan beberapa alat dan algoritme untuk tugas yang lebih kompleks terkait pengoptimalan dan pembelajaran mesin.

7.1. Optimasi

Optimasi biasanya terdiri dari meminimalkan atau memaksimalkan fungsi biaya. Algoritme untuk pengoptimalan dapat ditemukan di org.apache.commons.math3.optim dan org.apache.commons.math3.optimimization . Ini mencakup algoritme pengoptimalan linier dan nonlinier.

Kita dapat mencatat bahwa ada kelas duplikat dalam paket optim dan optimasi : paket optimasi sebagian besar sudah tidak digunakan lagi dan akan dihapus di Commons Math 4.

7.2. Algoritma Genetika

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

Dimungkinkan juga untuk menangani tipe yang lebih kompleks menggunakan commons-math: pecahan dan bilangan kompleks. Struktur ini memungkinkan kita untuk melakukan penghitungan khusus pada jenis angka ini.

Kemudian, kita dapat menghitung jumlah dua pecahan dan menampilkan hasilnya sebagai representasi string 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 dengan cepat menghitung kekuatan bilangan kompleks:

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

9. Kesimpulan

Dalam tutorial ini, kami menyajikan beberapa hal menarik yang dapat Anda lakukan menggunakan Apache Commons Math.

Sayangnya, artikel ini tidak dapat mencakup seluruh bidang analisis atau aljabar linier, dan karenanya, hanya memberikan contoh untuk situasi yang paling umum.

Namun, untuk informasi lebih lanjut, kita dapat membaca dokumentasi yang ditulis dengan baik, yang memberikan banyak detail untuk semua aspek perpustakaan.

Dan, seperti biasa, contoh kode dapat ditemukan di sini di GitHub.