Bevezetés az Apache Commons Math-ba

1. Áttekintés

Gyakran szükségünk van matematikai eszközök használatára, és néha java.lang.Math egyszerűen nem elég. Szerencsére az Apache Commons célja az, hogy pótolja a szabványos könyvtár szivárgását az Apache Commons Math segítségével.

Az Apache Commons Math a legnagyobb matematikai függvények és segédprogramok nyílt forráskódú könyvtára a Java számára. Tekintettel arra, hogy ez a cikk csak bevezetés, csak áttekintést adunk a könyvtárról, és bemutatjuk a legvonzóbb felhasználási eseteket.

2. Kezdve az Apache Commons Math-tal

2.1. Az Apache Commons Math használatai

Az Apache Commons Math matematikai függvényekből áll (erf például), matematikai fogalmakat ábrázoló struktúrák (például komplex számok, polinomok, vektorok stb.), és algoritmusok, amelyeket ezekre a struktúrákra alkalmazhatunk (gyökérkeresés, optimalizálás, görbeillesztés, geometriai ábrák metszéspontjának kiszámítása stb.).

2.2. Maven konfiguráció

Ha Maven-t használ, egyszerűen adja hozzá ezt a függőséget:

 org.apache.commons commons-math3 3.6.1 

2.3. A csomag áttekintése

Az Apache Commons Math több csomagra oszlik:

  • org.apache.commons.math3.stat - statisztikák és statisztikai tesztek
  • org.apache.commons.math3.distribution - valószínűségi eloszlások
  • org.apache.commons.math3.random - véletlenszámok, húrok és adatgenerálás
  • org.apache.commons.math3.analízis - gyökérkeresés, integráció, interpoláció, polinomok stb.
  • org.apache.commons.math3.linear - mátrixok, lineáris rendszerek megoldása
  • org.apache.commons.math3.geometry - geometria (euklideszi terek és bináris tér particionálás)
  • org.apache.commons.math3.transform - transzformációs módszerek (gyors Fourier)
  • org.apache.commons.math3.ode - közönséges differenciálegyenletek integrációja
  • org.apache.commons.math3.fitting - görbe illesztés
  • org.apache.commons.math3.optim - függvény maximalizálása vagy minimalizálása
  • org.apache.commons.math3.genetics - genetikai algoritmusok
  • org.apache.commons.math3.ml - gépi tanulás (klaszterezés és neurális hálózatok)
  • org.apache.commons.math3.util - a java.lang.Math kiterjesztésű közös math / stat függvények
  • org.apache.commons.math3.special - speciális funkciók (Gamma, Beta)
  • org.apache.commons.math3.complex - komplex számok
  • org.apache.commons.math3.fraction - racionális számok

3. Statisztikák, valószínűségek és véletlenszerűség

3.1. Statisztika

A csomag org.apache.commons.math3.stat számos eszközt nyújt a statisztikai számításokhoz. Például az átlag, a szórás és még sok más kiszámításához felhasználhatjuk Leíró statisztika:

dupla [] értékek = új dupla [] {65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32}; DescriptiveStatistics descriptiveStatistics = new DescriptiveStatistics (); for (dupla v: értékek) {descriptiveStatistics.addValue (v); } kettős átlag = leíróStatisztika.getMean (); kettős medián = leíróStatisztika.getPercentile (50); kettős standardDeviation = descriptiveStatistics.getStandardDeviation (); 

Ebben a csomagban eszközöket találhatunk a kovariancia, a korreláció kiszámításához vagy statisztikai tesztek elvégzéséhez (a TestUtils).

3.2. Valószínűségek és eloszlások

A Java-ban, Math.random () felhasználható véletlenszerű értékek előállítására, de ezek az értékek egyenletesen oszlanak el 0 és 1 között.

Néha véletlenszerű értéket akarunk előállítani egy összetettebb eloszlás segítségével. Ehhez felhasználhatjuk a org.apache.commons.math3.distribution.

Így állíthatunk elő véletlenszerű értékeket a normál eloszlás szerint 10-es átlaggal és 3-as szórással:

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

Vagy megszerezhetjük a valószínűséget P (X = x) diszkrét eloszlások értékének megszerzéséhez, vagy a kumulatív valószínűséghez P (X <= x) folyamatos eloszlásokhoz.

4. Elemzés

Az elemzéssel kapcsolatos funkciók és algoritmusok megtalálhatók a org.apache.commons.math3.analízis.

4.1. Gyökérkeresés

A gyökér olyan érték, ahol a függvény értéke 0. A Commons-Math több gyökér-kereső algoritmus megvalósítását tartalmazza.

Itt megpróbáljuk megtalálni a gyökerét v -> (v * v) - 2 :

UnivariateFunction függvény = v -> Math.pow (v, 2) - 2; UnivariateSolver solver = új BracketingNthOrderBrentSolver (1.0e-12, 1.0e-8, 5); kettős c = oldószer. megoldás (100, függvény, -10,0, 10,0, 0); 

Először a függvény definiálásával kezdjük, majd meghatározzuk a megoldót és beállítjuk a kívánt pontosságot. Végül hívjuk a megoldani () API.

A gyökérkeresési műveletet többféle iteráció segítségével hajtják végre, ezért kompromisszumot kell találni a végrehajtási idő és a pontosság között.

4.2. Integrálok kiszámítása

Az integráció szinte úgy működik, mint a gyökérkeresés:

UnivariateFunction függvény = v -> v; UnivariateIntegrator integrator = új SimpsonIntegrator (1.0e-12, 1.0e-8, 1, 32); kettős i = integrátor. integrál (100, függvény, 0, 10); 

Először egy funkció definiálásával választunk integrátort a meglévő integrációs megoldások közül, beállítjuk a kívánt pontosságot, végül integrálunk.

5. Lineáris algebra

Ha lineáris egyenletrendszerünk van AX = B formában, ahol A valós számok mátrixa, B pedig valós számok vektora - a Commons Math olyan struktúrákat biztosít, amelyek a mátrixot és a vektort egyaránt képviselik, és megoldókat is találnak X értéke:

RealMatrix a = new Array2DRowRealMatrix (új kettős [] [] {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}}, hamis); RealVector b = új ArrayRealVector (n ew kettős [] {1, -2, 1}, hamis); DecompositionSolver solver = új LUDompomposition (a) .getSolver (); RealVector megoldás = megoldó.megoldani (b); 

Az eset elég egyértelmű: meghatározunk egy mátrixot a egy kettős tömb tömbből és egy vektorból b egy vektor tömbjéből.

Ezután létrehozunk egy LUDösszetétel amely megoldót ad az egyenletekre az AX = B formában. Ahogy a neve is mondja, LUDösszetétel az LU bontására támaszkodik, és így csak négyzetmátrixokkal működik.

Más mátrixok esetében különböző megoldók léteznek, amelyek általában a legkisebb négyzet módszerrel oldják meg az egyenletet.

6. Geometria

A csomag org.apache.commons.math3.geometry több osztályt kínál a geometriai objektumok ábrázolásához, és számos eszközt biztosít az ezek kezeléséhez. Fontos megjegyezni, hogy ez a csomag különböző alcsomagokra oszlik, a használni kívánt geometriát tekintve:

Fontos megjegyezni, hogy ez a csomag különböző alcsomagokra van felosztva, a használni kívánt geometriát tekintve:

  • org.apache.commons.math3.geometry.euclidean.oned - 1D euklideszi geometria
  • org.apache.commons.math3.geometry.euclidean.twod - 2D euklideszi geometria
  • org.apache.commons.math3.geometry.euclidean.threed - 3D euklideszi geometria
  • org.apache.commons.math3.geometry.spherical.oned - 1D gömb alakú geometria
  • org.apache.commons.math3.geometry.spherical.twod - 2D gömb alakú geometria

A leghasznosabb osztályok valószínűleg Vector2D, Vector3D, Vonal, és Szegmens. 2D vektorok (vagy pontok), 3D vektorok, vonalak és szegmensek ábrázolására szolgálnak.

A fent említett osztályok használatakor lehetséges számítások elvégzése. Például a következő kód két 2D vonal metszéspontját számítja ki:

L1 = új vonal (új Vector2D (0, 0), új Vector2D (1, 1), 0); L2 = új vonal (új Vector2D (0, 1), új Vector2D (1, 1,5), 0); Vector2D metszéspont = l1.metszet (l2); 

Ezeket a struktúrákat is meg lehet valósítani, hogy megkapjuk a pont távolságát egy vonalig, vagy a vonal legközelebbi pontját egy másik vonalhoz (3D-ben).

7. Optimalizálás, genetikai algoritmusok és gépi tanulás

A Commons-Math emellett tartalmaz néhány eszközt és algoritmust az optimalizáláshoz és a gépi tanuláshoz kapcsolódó összetettebb feladatokhoz.

7.1. Optimalizálás

Az optimalizálás általában a költségfüggvények minimalizálásából vagy maximalizálásából áll. Az optimalizálás algoritmusai a org.apache.commons.math3.optim és org.apache.commons.math3.optimization. Lineáris és nemlineáris optimalizálási algoritmusokat tartalmaz.

Megjegyezhetjük, hogy vannak duplikált osztályok a optim és optimalizálás csomagok: a optimalizálás A csomag többnyire elavult, és a Commons Math 4 alkalmazásból eltávolításra kerül.

7.2. Genetikai algoritmusok

A genetikai algoritmusok egyfajta meta-heurisztikák: megoldást jelentenek egy probléma elfogadható megoldásának megtalálásához, ha a determinisztikus algoritmusok túl lassúak. A genetikai algoritmusok áttekintése itt található.

A csomag org.apache.commons.math3.genetics keretet biztosít a számítások elvégzéséhez genetikai algoritmusok segítségével. Tartalmaz egy struktúrát, amely felhasználható egy populáció és egy kromoszóma ábrázolására, valamint standard algoritmusokat mutációs, keresztezési és szelekciós műveletek végrehajtására.

A következő osztályok jó kiindulópontot jelentenek:

  • Genetikai algoritmus - a genetikai algoritmus keretrendszerét
  • Népesség - a populációt képviselő felület
  • Kromoszóma - a kromoszómát képviselő interfész

7.3. Gépi tanulás

A gépi tanulás a Commons-Math-ban két részre oszlik: klaszterezésre és neurális hálózatokra.

A klaszterező rész abból áll, hogy egy címkét teszünk a vektorokra, a távolságmérő mutatóval való hasonlóságuknak megfelelően. A megadott fürtözési algoritmusok a K-átlag algoritmuson alapulnak.

A neurális hálózat rész osztályokat ad a hálózatok reprezentálására (Hálózat) és az idegsejtek (Idegsejt). Megjegyezhetjük, hogy a biztosított funkciók korlátozottak a leggyakoribb neurális hálózati keretrendszerekhez képest, de még mindig hasznosak lehetnek alacsony követelményekkel rendelkező kicsi alkalmazások esetén.

8. Segédprogramok

8.1. FastMath

FastMath egy statikus osztály, amely org.apache.commons.math3.util és pontosan úgy működik, mint java.lang.Math.

Célja, hogy legalább ugyanazokat a funkciókat biztosítsa, amelyekben megtalálhatjuk java.lang.Math, de gyorsabb megvalósítással. Tehát, ha egy program nagymértékben támaszkodik matematikai számításokra, célszerű lecserélni a hívásokat Math.sin () (például) a FastMath.sin () az alkalmazás teljesítményének javítása érdekében. Másrészt kérjük, vegye figyelembe, hogy FastMath kevésbé pontos, mint java.lang.Math.

8.2. Közös és speciális funkciók

A Commons-Math szabványos matematikai függvényeket biztosít, amelyek nem valósulnak meg java.lang.Math (mint a faktoriális). Ezen funkciók többsége megtalálható a csomagokban org.apache.commons.math3.special és org.apache.commons.math3.util.

Például, ha ki akarjuk számolni a 10 tényezőjét, egyszerűen megtehetjük:

hosszú faktoriális = CombinatorialUtils.factorial (10); 

Az aritmetikával kapcsolatos függvények (gcd, lcmstb.) találhatók ArithmeticUtils, és a kombinatoriális funkciók megtalálhatók a CombinatorialUtils. Néhány egyéb speciális funkció, például erf, itt érhető el org.apache.commons.math3.special.

8.3. Törtek és összetett számok

A bonyolultabb típusok kezelése a commons-math használatával is lehetséges: tört és komplex számok. Ezek a struktúrák lehetővé teszik számunkra, hogy specifikus számítást végezzünk az ilyen típusú számokkal.

Ezután kiszámíthatjuk két tört összegét, és az eredményt egy törzs karakterlánc-reprezentációjaként jeleníthetjük meg (azaz „a / b” formában):

Frakció lhs = új frakció (1, 3); Frakció rhs = új frakció (2, 5); Töredékösszeg = lhs.add (rhs); String str = új FractionFormat (). Formátum (összeg); 

Vagy gyorsan kiszámíthatjuk a komplex számok erejét:

Complex first = új Complex (1.0, 3.0); Komplex második = új komplex (2.0, 5.0); Komplex teljesítmény = első. Teljesítmény (másodperc); 

9. Következtetés

Ebben az oktatóanyagban bemutattunk néhány érdekes dolgot, amelyeket megtehet az Apache Commons Math használatával.

Sajnos ez a cikk nem fedheti le az elemzés teljes területét vagy a lineáris algebrát, így csak példákat ad a leggyakoribb helyzetekre.

További információért azonban olvashatjuk a jól megírt dokumentációt, amely rengeteg részletet tartalmaz a könyvtár minden vonatkozásával kapcsolatban.

És mint mindig, a kódminták itt is megtalálhatók a GitHubon.


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