Úvod do matematiky Apache Commons

1. Prehľad

Často často potrebujeme matematické nástroje java.lang.Math jednoducho nestačí. Cieľom Apache Commons je našťastie zaplniť úniky štandardnej knižnice pomocou Apache Commons Math.

Apache Commons Math je najväčšia open-source knižnica matematických funkcií a nástrojov pre Javu. Vzhľadom na to, že tento článok je iba úvodom, poskytneme iba prehľad knižnice a predstavíme najpútavejšie prípady použitia.

2. Počnúc programom Apache Commons Math

2.1. Využitie matematiky Apache Commons

Apache Commons Math pozostáva z matematických funkcií (erf napríklad), štruktúry predstavujúce matematické pojmy (ako komplexné čísla, polynómy, vektory atď.) a algoritmy, ktoré môžeme na tieto štruktúry použiť (nájdenie koreňa, optimalizácia, prispôsobenie krivky, výpočet priesečníkov geometrických útvarov atď.).

2.2. Konfigurácia Maven

Ak používate Maven, jednoducho pridajte túto závislosť:

 org.apache.commons commons-math3 3.6.1 

2.3. Prehľad balíkov

Apache Commons Math je rozdelený do niekoľkých balíkov:

  • org.apache.commons.math3.stat - štatistika a štatistické testy
  • org.apache.commons.math3.distribution - rozdelenie pravdepodobnosti
  • org.apache.commons.math3.random - náhodné čísla, reťazce a generovanie údajov
  • org.apache.commons.math3.analýza - koreňový nález, integrácia, interpolácia, polynómy atď.
  • org.apache.commons.math3.linear - matice, riešenie lineárnych sústav
  • org.apache.commons.math3.geometry - geometria (euklidovské priestory a rozdelenie binárnych priestorov)
  • org.apache.commons.math3.transform - transformačné metódy (rýchly Fourier)
  • org.apache.commons.math3.ode - integrácia bežných diferenciálnych rovníc
  • org.apache.commons.math3.fitting - zakrivenie
  • org.apache.commons.math3.optim - maximalizácia alebo minimalizácia funkcie
  • org.apache.commons.math3.genetics - genetické algoritmy
  • org.apache.commons.math3.ml - strojové učenie (klastrovanie a neurónové siete)
  • org.apache.commons.math3.util - bežné matematické / štatistické funkcie rozširujúce java.lang.Math
  • org.apache.commons.math3.special - špeciálne funkcie (Gamma, Beta)
  • org.apache.commons.math3.complex - komplexné čísla
  • org.apache.commons.math3.fraction - racionálne čísla

3. Štatistika, pravdepodobnosť a náhodnosť

3.1. Štatistika

Balík org.apache.commons.math3.stat poskytuje niekoľko nástrojov na štatistické výpočty. Napríklad môžeme vypočítať priemer, štandardnú odchýlku a mnoho ďalších Deskriptívna štatistika:

hodnoty double [] = nový double [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = new DescriptiveStatistics (); pre (dvojité v: hodnoty) {descriptiveStatistics.addValue (v); } dvojitý priemer = descriptiveStatistics.getMean (); dvojitý medián = descriptiveStatistics.getPercentile (50); double standardDeviation = descriptiveStatistics.getStandardDeviation (); 

V tomto balíku nájdeme nástroje na výpočet kovariancie, korelácie alebo na vykonávanie štatistických testov (pomocou TestUtils).

3.2. Pravdepodobnosti a rozdelenia

V základnej Jave Math.random () možno použiť na generovanie náhodných hodnôt, ale tieto hodnoty sú rovnomerne rozdelené medzi 0 a 1.

Niekedy chceme vyrobiť náhodnú hodnotu pomocou zložitejšej distribúcie. Na tento účel môžeme použiť rámec, ktorý poskytuje org.apache.commons.math3.distribution.

Týmto spôsobom je možné generovať náhodné hodnoty podľa normálneho rozdelenia s priemerom 10 a štandardnou odchýlkou ​​3:

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

Alebo môžeme získať pravdepodobnosť P (X = x) získania hodnoty pre diskrétne rozdelenia alebo kumulatívnej pravdepodobnosti P (X <= x) pre spojité rozvody.

4. Analýza

Funkcie a algoritmy súvisiace s analýzou nájdete v org.apache.commons.math3.analýza.

4.1. Koreňový nález

Koreň je hodnota, kde funkcia má hodnotu 0. Commons-Math obsahuje implementáciu niekoľkých algoritmov na hľadanie koreňov.

Tu sa snažíme nájsť koreň v -> (v * v) - 2 :

Funkcia UnivariateFunction = v -> Math.pow (v, 2) - 2; Riešiteľ UnivariateSolver = nový BracketingNthOrderBrentSolver (1.0e-12, 1.0e-8, 5); double c = solver.solve (100, funkcia, -10.0, 10.0, 0); 

Najskôr začneme definovaním funkcie, potom definujeme riešiteľa a nastavíme požadovanú presnosť. Nakoniec hovoríme vyriešiť () API.

Operácia hľadania koreňa sa bude vykonávať pomocou niekoľkých iterácií, takže ide o hľadanie kompromisu medzi časom vykonania a presnosťou.

4.2. Výpočet integrálov

Integrácia funguje takmer ako nájdenie root:

Funkcia UnivariateFunction = v -> v; Integrátor UnivariateIntegrator = nový SimpsonIntegrator (1.0e-12, 1.0e-8, 1, 32); dvojité i = integrátor.integrovať (100, funkcia, 0, 10); 

Začíname definovaním funkcie, spomedzi dostupných integračných riešení, ktoré si vyberieme, si vyberieme integrátora, nastavíme požadovanú presnosť a nakoniec integrujeme.

5. Lineárna algebra

Ak máme lineárny systém rovníc v tvare AX = B, kde A je matica reálnych čísel a B vektor reálnych čísel - Commons Math poskytuje štruktúry reprezentujúce maticu aj vektor a tiež poskytuje riešiteľov na nájdenie hodnota X:

RealMatrix a = new Array2DRowRealMatrix (nový double [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, false); RealVector b = nový ArrayRealVector (n ew double [] {1, -2, 1}, false); Riešiteľ DecompositionSolver = nový LUDecomposition (a) .getSolver (); RealVector solution = solver.solve (b); 

Prípad je dosť priamy: definujeme maticu a z radu dvojíc a vektora b z poľa vektora.

Potom vytvoríme ĽUDekompozícia ktorá poskytuje riešenie rovníc v tvare AX = B. Ako už hovorí jeho názov, ĽUDekompozícia sa spolieha na rozklad LU, a pracuje teda iba so štvorcovými maticami.

Pre ďalšie matice existujú rôzne riešitele, ktoré zvyčajne riešia rovnicu metódou najmenších štvorcov.

6. Geometria

Balík org.apache.commons.math3.geometry poskytuje niekoľko tried na reprezentáciu geometrických objektov a niekoľko nástrojov na ich manipuláciu. Je dôležité poznamenať, že tento balík je rozdelený do rôznych čiastkových balíkov, čo sa týka druhu geometrie, ktorú chceme použiť:

Je dôležité poznamenať, že tento balík je rozdelený do rôznych čiastkových balíkov, čo sa týka druhu geometrie, ktorú chceme použiť:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D euklidovská geometria
  • org.apache.commons.math3.geometry.euclidean.twod - 2D euklidovská geometria
  • org.apache.commons.math3.geometry.euclidean.threed - 3D euklidovská geometria
  • org.apache.commons.math3.geometry.spherical.oned - 1D sférická geometria
  • org.apache.commons.math3.geometry.spherical.twod - 2D sférická geometria

Najužitočnejšie triedy sú pravdepodobne Vector2D, Vector3D, Riadoka Segment. Používajú sa na reprezentáciu 2D vektorov (alebo bodov), 3D vektorov, čiar a segmentov.

Pri použití vyššie spomenutých tried je možné vykonať určitý výpočet. Napríklad nasledujúci kód vykonáva výpočet priesečníka dvoch 2D čiar:

Riadok l1 = nový riadok (nový Vector2D (0, 0), nový Vector2D (1, 1), 0); Riadok l2 = nový riadok (nový Vector2D (0, 1), nový Vector2D (1, 1,5), 0); Vector2D križovatka = l1.intersection (l2); 

Je tiež možné použiť tieto štruktúry na získanie vzdialenosti bodu od priamky alebo najbližšieho bodu úsečky k inej úsečke (v 3D).

7. Optimalizácia, genetické algoritmy a strojové učenie

Commons-Math tiež poskytuje niektoré nástroje a algoritmy pre zložitejšie úlohy spojené s optimalizáciou a strojovým učením.

7.1. Optimalizácia

Optimalizácia zvyčajne spočíva v minimalizácii alebo maximalizácii nákladových funkcií. Algoritmy na optimalizáciu nájdete v org.apache.commons.math3.optim a org.apache.commons.math3.optimimization. Zahŕňa lineárne a nelineárne optimalizačné algoritmy.

Môžeme si všimnúť, že v optim a optimalizácia balíčky: optimalizácia balík je väčšinou zastaraný a bude odstránený v Commons Math 4.

7.2. Genetické algoritmy

Genetické algoritmy sú druhom meta-heuristiky: sú riešením na nájdenie prijateľného riešenia problému, keď sú deterministické algoritmy príliš pomalé. Prehľad genetických algoritmov nájdete tu.

Balík org.apache.commons.math3.genetics poskytuje rámec na vykonávanie výpočtov pomocou genetických algoritmov. Obsahuje štruktúru, ktorú je možné použiť na reprezentáciu populácie a chromozómu, a štandardné algoritmy na vykonávanie mutačných, krížových a selekčných operácií.

Nasledujúce triedy poskytujú dobrý východiskový bod:

  • Genetický algoritmus - rámec genetických algoritmov
  • Populácia - rozhranie predstavujúce populáciu
  • Chromozóm - rozhranie predstavujúce chromozóm

7.3. Strojové učenie

Strojové učenie v Commons-Math je rozdelené do dvoch častí: klastrovanie a neurónové siete.

Klastrová časť spočíva v umiestnení značky na vektory podľa ich podobnosti, pokiaľ ide o metriku vzdialenosti. Poskytnuté klastrové algoritmy sú založené na algoritme K-means.

Časť neurónová sieť dáva triedam reprezentovať siete (Sieť) a neuróny (Neurón). Možno si všimnúť, že poskytované funkcie sú obmedzené v porovnaní s najbežnejšími rámcami neurónových sietí, ale aj tak môžu byť užitočné pre malé aplikácie s nízkymi požiadavkami.

8. Verejné služby

8.1. FastMath

FastMath je statická trieda umiestnená v org.apache.commons.math3.util a funguje presne ako java.lang.Math.

Jeho účelom je poskytnúť prinajmenšom rovnaké funkcie, aké môžeme nájsť v java.lang.Math, ale s rýchlejšími implementáciami. Keď sa teda program vo veľkej miere spolieha na matematické výpočty, je dobré nahradiť hovory na Math.sin () (napríklad) na hovory do FastMath.sin () na zlepšenie výkonu aplikácie. Na druhej strane si to uvedomte FastMath je menej presný ako java.lang.Math.

8.2. Spoločné a špeciálne funkcie

Commons-Math poskytuje štandardné matematické funkcie, ktoré nie sú implementované v java.lang.Math (ako faktoriál). Väčšinu z týchto funkcií nájdete v balíkoch org.apache.commons.math3.special a org.apache.commons.math3.util.

Napríklad, ak chceme vypočítať faktoriál 10, môžeme jednoducho urobiť:

long factororial = CombinatorialUtils.factorial (10); 

Funkcie spojené s aritmetikou (gcd, lcm, atď.) nájdete v AritmetikaUltilsa funkcie týkajúce sa kombinatorických možno nájsť v CombinatorialUtils. Niektoré ďalšie špeciálne funkcie, napríklad erf, je prístupný v org.apache.commons.math3.special.

8.3. Zlomok a komplexné čísla

Je tiež možné zvládnuť zložitejšie typy pomocou commons-math: zlomok a komplexné čísla. Tieto štruktúry nám umožňujú vykonávať špecifické výpočty na tomto druhu čísel.

Potom môžeme vypočítať súčet dvoch zlomkov a výsledok zobraziť ako reťazcové vyjadrenie zlomku (t. J. Pod tvarom „a / b“):

Frakcia lhs = nová frakcia (1, 3); Frakcia rhs = nová frakcia (2, 5); Zlomkový súčet = lhs.add (rhs); Reťazec str = nový FractionFormat (). Formát (suma); 

Alebo môžeme rýchlo vypočítať silu komplexných čísel:

Komplex prvý = nový Komplex (1.0, 3.0); Komplexná sekunda = nový Komplex (2.0, 5.0); Komplexná sila = prvý. Sila (druhá); 

9. Záver

V tomto tutoriáli sme predstavili niekoľko zaujímavých vecí, ktoré môžete urobiť pomocou Apache Commons Math.

Tento článok bohužiaľ nedokáže pokryť celú oblasť analýzy alebo lineárnu algebru a poskytuje preto iba príklady najbežnejších situácií.

Avšak pre viac informácií si môžeme prečítať dobre napísanú dokumentáciu, ktorá poskytuje veľa podrobností o všetkých aspektoch knižnice.

A ako vždy, ukážky kódu nájdete tu na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found