Uvod u matematiku Apache Commons

1. Pregled

Često nam je potrebna upotreba matematičkih alata, a ponekad i java.lang.Math jednostavno nije dovoljno. Srećom, Apache Commons ima za cilj ispuniti curenja standardne biblioteke, s Apache Commons Math.

Apache Commons Math je najveća biblioteka matematičkih funkcija i uslužnih programa za Java s otvorenim kodom. S obzirom na to da je ovaj članak samo uvod, dat ćemo samo pregled knjižnice i predstaviti najzanimljivije slučajeve korištenja.

2. Počevši od Apache Commons Math

2.1. Upotrebe Apache Commons Math

Apache Commons Math sastoji se od matematičkih funkcija (erf na primjer), strukture koje predstavljaju matematičke pojmove (poput složenih brojeva, polinoma, vektora itd.) i algoritmi koje možemo primijeniti na te strukture (pronalaženje korijena, optimizacija, prilagođavanje krivulje, izračunavanje presjeka geometrijskih likova, itd.).

2.2. Maven konfiguracija

Ako koristite Maven, jednostavno dodajte ovu ovisnost:

 org.apache.commons commons-math3 3.6.1 

2.3. Pregled paketa

Apache Commons Math podijeljen je u nekoliko paketa:

  • org.apache.commons.math3.stat - statistika i statistički testovi
  • org.apache.commons.math3.distribution - raspodjele vjerojatnosti
  • org.apache.commons.math3.random - slučajni brojevi, nizovi i generiranje podataka
  • org.apache.commons.math3.analysis - pronalaženje korijena, integracija, interpolacija, polinomi itd.
  • org.apache.commons.math3.linear - matrice, rješavanje linearnih sustava
  • org.apache.commons.math3.geometry - geometrija (euklidski prostori i binarno razdvajanje prostora)
  • org.apache.commons.math3.transform - metode transformacije (brzi Fourier)
  • org.apache.commons.math3.ode - obična diferencijalna jednadžba integracija
  • org.apache.commons.math3.fitting - dolikuje krivulja
  • org.apache.commons.math3.optim - maksimizacija ili minimizacija funkcije
  • org.apache.commons.math3.genetics - genetski algoritmi
  • org.apache.commons.math3.ml - strojno učenje (klasteriranje i neuronske mreže)
  • org.apache.commons.math3.util - uobičajene matematičke / statističke funkcije koje proširuju java.lang.Math
  • org.apache.commons.math3.special - posebne funkcije (Gama, Beta)
  • org.apache.commons.math3.complex - složeni brojevi
  • org.apache.commons.math3.fraction - racionalni brojevi

3. Statistika, vjerojatnosti i slučajnost

3.1. Statistika

Paket org.apache.commons.math3.stat pruža nekoliko alata za statističke proračune. Na primjer, za izračunavanje srednje vrijednosti, standardne devijacije i mnogih drugih, možemo koristiti Opisne statistike:

vrijednosti double [] = novi double [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = novo DescriptiveStatistics (); za (dvostruko v: vrijednosti) {descriptiveStatistics.addValue (v); } dvostruka sredina = descriptiveStatistics.getMean (); dvostruka medijana = descriptiveStatistics.getPercentile (50); dvostruki standardDeviation = descriptiveStatistics.getStandardDeviation (); 

U ovom paketu možemo pronaći alate za izračunavanje kovarijancije, korelacije ili za provođenje statističkih testova (pomoću TestUtils).

3.2. Vjerojatnosti i raspodjele

U jezgri Java, Math.random () može se koristiti za generiranje slučajnih vrijednosti, ali te su vrijednosti jednoliko raspodijeljene između 0 i 1.

Ponekad želimo proizvesti slučajnu vrijednost koristeći složeniju distribuciju. Za to možemo koristiti okvir koji pruža org.apache.commons.math3.distribution.

Evo kako generirati slučajne vrijednosti prema normalnoj raspodjeli sa srednjom vrijednosti 10 i standardnom devijacijom 3:

NormalDistribution normalDistribution = novo NormalDistribution (10, 3); dvostruko randomValue = normalDistribution.sample (); 

Ili možemo dobiti vjerojatnost P (X = x) dobivanja vrijednosti za diskretne raspodjele ili kumulativne vjerojatnosti P (X <= x) za kontinuiranu raspodjelu.

4. Analiza

Funkcije i algoritmi povezani s analizom mogu se naći u org.apache.commons.math3.analysis.

4.1. Pronalaženje korijena

Korijen je vrijednost u kojoj funkcija ima vrijednost 0. Commons-Math uključuje implementaciju nekoliko algoritama za pronalaženje korijena.

Ovdje pokušavamo pronaći korijen v -> (v * v) - 2 :

Funkcija UnivariateFunction = v -> Math.pow (v, 2) - 2; Rješivač UnivariateSolver = novi BracketingNthOrderBrentSolver (1.0e-12, 1.0e-8, 5); dvostruko c = solver.solve (100, funkcija, -10,0, 10,0, 0); 

Prvo započinjemo definiranjem funkcije, zatim definiramo rješivač i postavljamo željenu točnost. Napokon, zovemo riješiti() API.

Operacija pronalaženja korijena izvest će se pomoću nekoliko ponavljanja, tako da je stvar pronalaska kompromisa između vremena izvršavanja i točnosti.

4.2. Izračunavanje integrala

Integracija djeluje gotovo kao pronalazak korijena:

Funkcija jednoznačne funkcije = v -> v; UnivariateIntegrator integrator = novi SimpsonIntegrator (1.0e-12, 1.0e-8, 1, 32); dvostruki i = integrator.integrate (100, funkcija, 0, 10); 

Počinjemo s definiranjem funkcije, odabiremo integrator među dostupnim integracijskim rješenjima, postavljamo željenu točnost i na kraju integriramo.

5. Linearna algebra

Ako imamo linearni sustav jednadžbi u obliku AX = B gdje je A matrica realnih brojeva, a B vektor stvarnih brojeva - Commons Math nudi strukture koje predstavljaju i matricu i vektor, a također pruža i rješavače za pronalaženje vrijednost X:

RealMatrix a = novi Array2DRowRealMatrix (novi dvostruki [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, netačno); RealVector b = novi ArrayRealVector (novi dvostruki [] {1, -2, 1}, netačno); Razrješivač DecompositionSolver = novi LUDecomposition (a) .getSolver (); Rješenje RealVector = solver.solve (b); 

Slučaj je prilično jednostavan: definiramo matricu a iz niza parova i vektora b iz niza vektora.

Zatim kreiramo LUDrazlaganje koji pruža rješenje za jednadžbe u obliku AX = B. Kao što mu i samo ime kaže, LUDrazlaganje oslanja se na LU razgradnju i tako radi samo s kvadratnim matricama.

Za ostale matrice postoje različiti rješavači koji obično rješavaju jednadžbu metodom najmanje kvadrata.

6. Geometrija

Paket org.apache.commons.math3.geometry pruža nekoliko klasa za predstavljanje geometrijskih objekata i nekoliko alata za upravljanje njima. Važno je napomenuti da je ovaj paket podijeljen u različite podpakete, s obzirom na vrstu geometrije koju želimo koristiti:

Važno je napomenuti da je ovaj paket podijeljen u različite podpakete, s obzirom na vrstu geometrije koju želimo koristiti:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D euklidska geometrija
  • org.apache.commons.math3.geometry.euclidean.twod - 2D euklidska geometrija
  • org.apache.commons.math3.geometry.euclidean.threed - 3D euklidska geometrija
  • org.apache.commons.math3.geometry.spherical.oned - 1D sferna geometrija
  • org.apache.commons.math3.geometry.spherical.twod - 2D sferna geometrija

Vjerojatno su najkorisnije satove Vector2D, Vector3D, Crta, i Segment. Koriste se za predstavljanje 2D vektora (ili točaka), 3D vektora, linija i segmenata.

Kada koristite gore spomenute klase, moguće je izvršiti neko računanje. Na primjer, sljedeći kod vrši izračun presjeka dviju 2D linija:

Linija l1 = nova linija (novi Vector2D (0, 0), novi Vector2D (1, 1), 0); Linija l2 = nova linija (novi Vector2D (0, 1), novi Vector2D (1, 1.5), 0); Presjek vektora2D = l1.sječak (l2); 

Također je moguće koristiti ove strukture za dobivanje udaljenosti točke do crte ili najbliže točke linije do druge crte (u 3D).

7. Optimizacija, genetski algoritmi i strojno učenje

Commons-Math također nudi neke alate i algoritme za složenije zadatke povezane s optimizacijom i strojnim učenjem.

7.1. Optimizacija

Optimizacija se obično sastoji od minimiziranja ili maksimiziranja troškovnih funkcija. Algoritme za optimizaciju možete pronaći u org.apache.commons.math3.optim i org.apache.commons.math3.optimimization. Uključuje algoritme linearne i nelinearne optimizacije.

Možemo primijetiti da u. Postoje duplikati klasa opt i optimizacija paketi: optimizacija paket je uglavnom zastario i uklonit će se u Commons Math 4.

7.2. Genetski algoritmi

Genetski algoritmi svojevrsna su metaheuristika: rješenje su za pronalaženje prihvatljivog rješenja problema kada su deterministički algoritmi prespori. Pregled genetskih algoritama možete pronaći ovdje.

Paket org.apache.commons.math3.genetics pruža okvir za izvođenje izračuna pomoću genetskih algoritama. Sadrži strukturu koja se može koristiti za predstavljanje populacije i kromosoma te standardne algoritme za izvođenje operacija mutacije, križanja i selekcije.

Sljedeći tečajevi daju dobru polaznu točku:

  • Genetički algoritam - okvir genetskog algoritma
  • Populacija - sučelje koje predstavlja populaciju
  • Kromosom - sučelje koje predstavlja kromosom

7.3. Strojno učenje

Strojno učenje u Commons-Math podijeljeno je u dva dijela: klasteriranje i neuronske mreže.

Dio klastera sastoji se od stavljanja oznake na vektore prema njihovoj sličnosti u odnosu na metriku udaljenosti. Navedeni algoritmi grupiranja temelje se na algoritmu K-sredina.

Dio neuronske mreže daje klase za predstavljanje mreža (Mreža) i neuroni (Neuron). Može se primijetiti da su pružene funkcije ograničene u usporedbi s najčešćim okvirima neuronske mreže, ali i dalje može biti korisna za male programe s malim zahtjevima.

8. Komunalije

8.1. FastMath

FastMath je statička klasa smještena u org.apache.commons.math3.util i rade točno kao java.lang.Math.

Njegova je svrha pružiti barem iste funkcije u kojima možemo naći java.lang.Math, ali bržim implementacijama. Dakle, kada se program u velikoj mjeri oslanja na matematička izračunavanja, dobra je zamjena pozivima na Math.sin () (na primjer) pozivima na FastMath.sin () za poboljšanje performansi aplikacije. S druge strane, imajte na umu da FastMath je manje precizan od java.lang.Math.

8.2. Zajedničke i posebne funkcije

Commons-Math pruža standardne matematičke funkcije koje nisu implementirane u java.lang.Math (poput faktora). Većina ovih funkcija može se naći u paketima org.apache.commons.math3.special i org.apache.commons.math3.util.

Na primjer, ako želimo izračunati faktorijel od 10, možemo jednostavno učiniti:

long factorial = CombinatorialUtils.factorial (10); 

Funkcije povezane s aritmetikom (gcd, lcmitd.) mogu se naći u ArithmeticUtils, a funkcije povezane s kombinatorstvom mogu se naći u Kombinacijski korisni programi. Neke druge posebne funkcije, poput erf, može se pristupiti u org.apache.commons.math3.special.

8.3. Razlomki i složeni brojevi

Također je moguće rukovati složenijim vrstama pomoću zajedničke matematike: razlomka i složenih brojeva. Te nam strukture omogućuju izvođenje određenih izračunavanja na ovoj vrsti brojeva.

Zatim možemo izračunati zbroj dviju frakcija i rezultat prikazati kao niz frakcije (tj. U obliku "a / b"):

Razlomak lhs = novi razlomak (1, 3); Razlomak rhs = novi razlomak (2, 5); Zbroj razlomka = lhs.add (rhs); Niz str = novi FractionFormat (). Format (zbroj); 

Ili možemo brzo izračunati snagu kompleksnih brojeva:

Prvo složeno = novi kompleks (1.0, 3.0); Kompleksni drugi = novi Kompleks (2.0, 5.0); Kompleksna snaga = first.pow (second); 

9. Zaključak

U ovom uputstvu predstavili smo nekoliko zanimljivih stvari koje možete učiniti pomoću Apache Commons Math.

Nažalost, ovaj članak ne može obuhvatiti cijelo područje analize ili linearnu algebru, pa stoga pruža samo primjere za najčešće situacije.

Međutim, za više informacija možemo pročitati dobro napisanu dokumentaciju koja pruža puno detalja o svim aspektima knjižnice.

I, kao i uvijek, uzorke koda možete pronaći ovdje na GitHubu.