1概要

私たちはしばしば数学的な道具を使う必要がある、そして時には

java.lang.Math

は単に十分ではない。幸い、Apache Commonsはhttp://commons.apache.org/proper/commons-math/[Apache Commons Math]を使って標準ライブラリのリークを埋めることを目標としています。

Apache Commons Mathは、Java用の数学関数とユーティリティの最大のオープンソースライブラリです。この記事は紹介にすぎないので、ライブラリの概要を説明し、最も魅力的なユースケースを紹介します。


2 Apache Commons Math

から始める


2.1. Apache Commons Math

の使い方

Apache Commons Mathは、数学関数(

erf

など)、数学的概念を表す構造(複素数、多項式、ベクトルなど)、およびこれらの構造に適用できるアルゴリズム(ルート探索、最適化、曲線近似、次式の計算)で構成されています。幾何学図形の交差点など)


2.2. Mavenの設定

Mavenを使用している場合は、単にhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22commons-math3%22[この依存関係]を追加してください。

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-math3</artifactId>
  <version>3.6.1</version>
</dependency>


2.3. パッケージの概要

Apache Commons Mathはいくつかのパッケージに分かれています。



  • org.apache.commons.math3.stat –


    統計と統計テスト



  • org.apache.commons.math3.distribution –


    確率分布



  • org.apache.commons.math3.random –


    乱数、文字列、データ

世代




org.apache.commons.math3.analysis – ** ルート検索、統合、

補間、多項式など



  • org.apache.commons.math3.linear –


    行列、線形システムを解く



  • org.apache.commons.math3.geometry –


    geometry(ユークリッドスペースと

バイナリ空間分割)




org.apache.commons.math3.transform – ** 変換メソッド(高速

フーリエ)




org.apache.commons.math3.ode – ** 常微分方程式

統合




org.apache.commons.math3.fitting – ** カーブフィッティング



  • org.apache.commons.math3.optim –


    関数の最大化または

最小化




org.apache.commons.math3.genetics – ** 遺伝的アルゴリズム



  • org.apache.commons.math3.ml –


    機械学習(クラスタリングと

ニューラルネットワーク)




org.apache.commons.math3.util – ** 一般的な数学/統計関数

java.lang.Mathの拡張




org.apache.commons.math3.special – ** 特殊関数(ガンマ、ベータ)



  • org.apache.commons.math3.complex –


    複素数



  • org.apache.commons.math3.fraction –


    有理数


3統計、確率、およびランダムネス


3.1. 統計

パッケージ

org.apache.commons.math3.stat

は、統計計算用のいくつかのツールを提供します。たとえば、平均値、標準偏差などを計算するには、

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

このパッケージには、共分散、相関の計算、または統計的検定の実行(

TestUtils

を使用)のためのツールがあります。


3.2. 確率と分布

コアJavaでは、

Math.random()

を使用して乱数を生成できますが、これらの値は0から1の間で一様に分布しています。

時には、もっと複雑な分布を使って乱数を作りたいと思うこともあります。これには、

org.apache.commons.math3.distribution

が提供するフレームワークを使用できます。

これは、平均10、標準偏差3の正規分布に従って乱数を生成する方法です。

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

あるいは、離散分布の値を取得する確率

P(X = x)

、または連続分布の累積確率

P(X ⇐ x)

を取得できます。


4分析

分析関連の関数とアルゴリズムは

org.apache.commons.math3.analysis

にあります。


4.1. ルート検索

ルートは関数が0の値を持つ値です。Commons-Mathはいくつかのhttp://commons.apache.org/proper/commons-math/userguide/analysis.html#a4.3__Root-finding[rootの実装を含みます発見アルゴリズム]。

ここでは、

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

まず、関数を定義することから始め、次にソルバーを定義して、希望の精度を設定します。最後に、

solve()

APIを呼び出します。

ルート検出操作は数回の反復を使用して実行されるので、実行時間と正確さの間の妥協点を見つけることが問題です。


4.2. 積分の計算

統合は、ルート検出とほぼ同じように機能します。

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

関数を定義することから始め、既存のhttp://commons.apache.org/proper/commons-math/userguide/analysis.html#a4.5__Integration[利用可能な統合ソリューション]の中からインテグレータを選択し、必要な精度を設定します。そして最後に、統合します。


5線形代数

Aが実数の行列、Bが実数のベクトルであるAX = Bの形の線形連立方程式がある場合 – Commons Mathは行列とベクトルの両方を表す構造体を提供し、また、求めるためのソルバーを提供します。 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);

そのケースはかなり簡単です:私たちはdoubleの配列の配列から行列

a

を、そしてベクトルの配列からvector

b

を定義します。

それから、AX = Bの形で方程式のためのソルバーを提供する

LUDecomposition

を作成します。正方行列のみ。

他の行列に対しては、通常最小二乗法を使用して方程式を解くさまざまなソルバーが存在します。


6. ジオメトリ

パッケージ

org.apache.commons.math3.geometry

は、幾何学的オブジェクトを表すためのクラスとそれらを操作するためのツールを提供します。使用するジオメトリの種類に関して、このパッケージはさまざまなサブパッケージに分割されていることに注意することが重要です。

使用するジオメトリの種類に関して、このパッケージは異なるサブパッケージに分割されていることに注意することが重要です。



  • org.apache.commons.math3.geometry.euclidean.oned –


    1Dユークリッド

幾何学




org.apache.commons.math3.geometry.euclidean.twod – ** 2Dユークリッド

幾何学




org.apache.commons.math3.geometry.euclidean.threed – ** 3Dユークリッド

幾何学




org.apache.commons.math3.geometry.spherical.oned – ** 1D球形

幾何学




org.apache.commons.math3.geometry.spherical.twod – ** 2D球形

幾何学

最も有用なクラスはおそらく

Vector2D



Vector3D



Line

、および

Segment

です。それらは、それぞれ2Dベクトル(または点)、3Dベクトル、線、およびセグメントを表すために使用されます。

上記のクラスを使用するときは、何らかの計算を実行することが可能です。たとえば、次のコードは2本の2次元線の交点の計算を実行します。

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

これらの構造を使用して、点から線までの距離、または線から別の線までの最も近い点(3D)を取得することもできます。


7. 最適化、遺伝的アルゴリズム、および機械学習

Commons-Mathはまた、最適化と機械学習に関連するより複雑なタスクのためのいくつかのツールとアルゴリズムを提供します。


7.1. 最適化

最適化は通常、コスト関数を最小化または最大化することからなります。最適化のためのアルゴリズムは

org.apache.commons.math3.optim



org.apache.commons.math3.optimimization

にあります。線形および非線形最適化アルゴリズムが含まれています。


optim



optimization

パッケージには重複したクラスがあることに気付くでしょう:

optimization

パッケージはほとんど非推奨であり、Commons Math 4で削除されるでしょう。


7.2. 遺伝的アルゴリズム

遺伝的アルゴリズムは一種のメタヒューリスティックであり、決定論的アルゴリズムが遅すぎる場合に問題に対する許容可能な解決策を見つけるための解決策です。遺伝的アルゴリズムの概要は

ここ

にあります。

パッケージ

org.apache.commons.math3.genetics

は、遺伝的アルゴリズムを使用して計算を実行するためのフレームワークを提供します。母集団と染色体を表すために使用できる構造、および突然変異、交差、選択操作を実行するための標準アルゴリズムが含まれています。

次のクラスは良い出発点を与えます:

  • __http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/genetics/GeneticAlgorithm.html[GeneticAlgorithm]



遺伝的アルゴリズムの枠組み
**


人口



母集団を表すインタフェース
**


染色体

  • 染色体を表すインタフェース


7.3. 機械学習

Commons-Mathの機械学習は、クラスタリングとニューラルネットワークの2つの部分に分けられます。

クラスタリング部分は、距離メトリックに関するそれらの類似性に従ってベクトルにラベルを付けることからなる。提供されるクラスタリングアルゴリズムは、K-meansアルゴリズムに基づいています。

ニューラルネットワーク部は、ネットワークを表現するクラスを提供します(http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/index.html?org/apache/commons/math3/ml/neuralnet/) Network.html[

Network

])とニューロン(http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/index.html?org/apache/commons/math3/ml/neuralnet/) Neuron.html[

Neuron

])。

提供されている機能は、最も一般的なニューラルネットワークフレームワークと比較して制限されていることに気付くかもしれませんが、それでもなお、要件の低い小規模なアプリケーションには便利です。


8公益事業


8.1. FastMath


FastMath

は、

org.apache.commons.math3.util

にあり、

java.lang.Math

とまったく同じように機能する静的クラスです。

その目的は、少なくとも

java.lang.Math

にあるものと同じ関数を、より高速な実装で提供することです。そのため、プログラムが数学的計算に大きく依存している場合は、

Math.sin()

の呼び出しを

FastMath.sin()

の呼び出しに置き換えて、アプリケーションのパフォーマンスを向上させることをお勧めします。一方、

FastMath



java.lang.Math.

よりも精度が低いことに注意してください。


8.2. 共通および特殊機能

Commons-Mathは

java.lang.Math

に実装されていない標準的な数学関数を提供します(階乗のように)。これらの関数のほとんどは、

org.apache.commons.math3.special

および

org.apache.commons.math3.util

パッケージにあります。

たとえば、10の階乗を計算したい場合は、次のようにします。

long factorial = CombinatorialUtils.factorial(10);

算術に関連する関数(

gcd



lcm

など)は

ArithmeticUtils

にあり、組み合わせに関連する関数は

CombinatorialUtils

にあります。

erf

のような他の特別な関数は

org.apache.commons.math3.special

でアクセスできます。


8.3. 分数と複素数

commons-mathを使ってより複雑な型を扱うことも可能です。

分数と複素数これらの構造により、この種の数値に対して特定の計算を実行できます。

次に、2つの分数の合計を計算し、その結果を分数の文字列表現として(つまり、 “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);

あるいは、複素数のべき乗を素早く計算することもできます。

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

Complex power = first.pow(second);


9結論

このチュートリアルでは、Apache Commons Mathを使ってできることをいくつか紹介しました。

残念ながら、この記事では解析や線形代数の全分野を網羅することはできません。したがって、最も一般的な状況の例のみを提供しています。

ただし、詳細については、ライブラリのすべての側面に関する詳細な情報を提供する、よく書かれたhttp://commons.apache.org/proper/commons-math/userguide/[ドキュメント]を参照してください。

そして、いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[ここGitHub]にあります。