1. 概要

私たちは頻繁に数学ツールを使用する必要があり、時には java.lang.Mathでは不十分な場合があります。 幸い、Apache Commonsは、 Apache Commons Math を使用して、標準ライブラリのリークを埋めることを目標としています。

Apache Commons Mathは、Java用の数学関数とユーティリティの最大のオープンソースライブラリです。 この記事は単なる紹介であるため、ライブラリの概要を示し、最も説得力のあるユースケースを紹介します。

2. ApacheCommonsMathから始める

2.1. ApacheCommonsMathの使用法

Apache Commons Mathは、数学関数( erf など)、数学概念を表す構造(複素数、多項式、ベクトルなど)、およびこれらの構造に適用できるアルゴリズム(ルート検索、最適化)で構成されます。 、カーブフィッティング、幾何学的図形の交点の計算など)。

2.2. Maven構成

Mavenを使用している場合は、この依存関係を追加するだけです。

<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 – ジオメトリ(ユークリッド空間とバイナリ空間分割)
  • 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は、統計計算のためのいくつかのツールを提供します。 たとえば、平均、標準偏差などを計算するには、DescriptionStatisticsを使用できます。

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には、いくつかの求根アルゴリズムの実装が含まれています。

ここでは、 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);

関数を定義することから始め、既存の利用可能な積分ソリューションから積分器を選択し、必要な精度を設定し、最後に積分します。

5. 線形代数

AX = Bの形式の線形連立方程式がある場合、Aは実数の行列、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を定義し、ベクトルの配列からベクトルbを定義します。

次に、 LUDecomposition を作成します。これは、AX=Bの形式で方程式のソルバーを提供します。 その名前が示すように、 LUDecompositionLU分解に依存しているため、正方行列でのみ機能します。

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

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

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

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

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

7.1. 最適化

最適化は通常、コスト関数を最小化または最大化することで構成されます。 最適化のアルゴリズムは、org.apache.commons.math3.optimおよびorg.apache.commons.math3.optimimizationにあります。 これには、線形および非線形の最適化アルゴリズムが含まれています。

optimizationパッケージとoptimizationパッケージに重複するクラスがあることに注意してください。optimizationパッケージはほとんど非推奨であり、CommonsMath4で削除されます。

7.2. 遺伝的アルゴリズム

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

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

次のクラスは、良い出発点を提供します。

  • GeneticAlgorithm –遺伝的アルゴリズムフレームワーク
  • 人口–人口を表すインターフェース
  • 染色体–染色体を表すインターフェース

7.3. 機械学習

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

クラスタリングの部分は、距離計量に関する類似性に応じてベクトルにラベルを付けることで構成されます。 提供されるクラスタリングアルゴリズムは、K-meansアルゴリズムに基づいています。

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

8. ユーティリティ

8.1. FastMath

FastMath は、 org.apache.commons.math3.util にある静的クラスであり、java.lang.Mathとまったく同じように機能します。

その目的は、少なくとも java.lang.Math にあるものと同じ関数を提供することですが、より高速な実装を備えています。 したがって、プログラムが数学的計算に大きく依存している場合は、 Math.sin()の呼び出しを FastMath.sin()の呼び出しに置き換えることをお勧めします。アプリケーションのパフォーマンスを向上させるため。 一方、FastMathjava.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[にあります。 X186X]。 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. 結論

このチュートリアルでは、ApacheCommonsMathを使用して実行できる興味深いことをいくつか紹介しました。

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

ただし、詳細については、ライブラリのすべての側面に関する多くの詳細を提供する、よく書かれたドキュメントを読むことができます。

そして、いつものように、コードサンプルはここGitHubにあります。