JavaFX + ND4J〜数学への挑戦2: 行列の計算〜

イントロダクション

前回は、ND4JのインストールとンD4J版ハローワールドをやりました。

なので次のステップ、下の本は「2.9ベクトル」から始めます。

Javaの基本的なことは下の部分にリンクがありますのでわからない部分があれば参照してください。

ND4Jによる行列計算

ぶっちゃけて、ちょいとコードをかくだけで頭で計算する必要はありません。

なぜなら

パソコンは計算機だからです。

ジョークはさておき。。。行列(英語ではMatrix(マトリクス))はプログラム的には数値の配列です、これは「ベクトル」と呼んだり「配列」と呼んだり自分は混乱しました。参考にした、本なども初めの部分にある文言を読まなければ「???」となりました。※初めは読み飛ばしました(笑)

さて、コードです。このサイトを参考にしました。下の式をプログラムで表現すると次のようになります。

ソース(Gitにあります)

public static void main(String[] args) {
	/*
	 * 配列の計算をする
	 * x=(1.0, 2.0), y=(5.0, 7.0)を計算する
	 */
	INDArray x = Nd4j.create(new double[] {1.0, 2.0}, new int[] {2, 1});
	INDArray y = Nd4j.create(new double[] {5.0, 7.0}, new int[] {2, 1});
	// 行列の足し算「x + y」
	INDArray answer = x.add(y);
	System.out.println("行列の足し算: x + y = " + answer);
	// 行列の引き算「x + y」
	answer = x.sub(y);
	System.out.println("行列の引き算: x - y = " + answer);
	/* 下の計算はまた別の機会にします。ちょっとややこしい(笑) */
//	// 行列のかけ算「x * y」
//	answer = x.mmul(y);
//	System.out.println("行列の引き算: x * y = " + answer);
//	// 行列のわり算「x / y」
//	answer = x.div(y);
//	System.out.println("行列の引き算: x / y = " + answer);
}

<実行結果>

<掛け算と割り算>

上のキャプチャでは掛け算部分をコメントアウトしています。この部分が中途半端になっていたので、そいつらにけりをつけます。

ちなみに、上記のコードではコメントアウトしていますが、このコードを実行すると以下のようなエラーメッセージが出力されます。

Exception in thread "main" org.nd4j.linalg.exception.ND4JIllegalStateException: Cannot execute matrix multiplication: [2, 1]x[2, 1]: Column of left array 1 != rows of right 2
at org.nd4j.linalg.util.LinAlgExceptions.assertMultiplies(LinAlgExceptions.java:90)
at org.nd4j.linalg.api.ndarray.BaseNDArray.mmuli(BaseNDArray.java:2946)
at org.nd4j.linalg.api.ndarray.BaseNDArray.mmul(BaseNDArray.java:2812)
at jp.zenryoku.ml.nd4j.FirstNd4j.main(FirstNd4j.java:27)

キーワードは「Cannot execute matrix multiplication: [2, 1]x[2, 1]」の部分です。

なので、コードを以下のように修正して再実行して見ます。

/*
* 配列の計算をする
* x=(1.0, 2.0), y=(5.0, 7.0)を計算する
*/
INDArray x = Nd4j.create(new double[] {1.0, 2.0, 1.5, 2,5}, new int[] {2, 2});
INDArray y = Nd4j.create(new double[] {5.0, 7.0, 5.5, 7.5}, new int[] {2, 2});

初めのコードとの違いは行列の列の数が違うということです。

初めのコード→

ROWのサイズが2、COLのサイズが1

次のコード→

ちょっとあれですが。。。ROWのサイズが2、COLのサイズが2

このような違いがあります。

この状態だと「行列の演算で[2, 1] x [2, 1]はできません」というエラーは出ませんでした。

基本的な計算はこんなくらいかな?というところです。

感想

んー「NumPy」そックリだ。。。これならPythonで書かれた機械学習の本をJavaで学習できそうだ!

しかも、行列の列数など細かい調整が効くというところがNumPyと違うところだ。

関連ページ一覧

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement 
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜

TensorFLowを学ぶ(Python)

  1. Tensorflow Keras 〜初めてのKeras
  2. Tensorflow Keras Errors”python is not installed as a framework.”
  3. Python Tensorflow 〜初めての人工知能(TensorFlowインストール)
  4. Tensorflow Keras〜初めのトレーニング_1
  5. Tensorflow Keras〜初めのトレーニング_2:前処理〜
  6. TensorFlow Keras〜テキストの分類〜
    1. TensorFlow Keras 実行結果〜テキストの分類〜
  7. Python TensorFlow tutorial〜チュートリアルを進めるコツ、ワンポイント〜
  8. TensorFlow Keras〜回帰、準備から予測まで〜
  9. TensorFlow Java 環境構築〜JavaでもTensorFlow〜