イントロダクション
前回は、ND4JのインストールとンD4J版ハローワールドをやりました。
なので次のステップ、下の本は「2.9ベクトル」から始めます。
[rakuten ids="hmvjapan:17123794"]
Javaの基本的なことは下の部分にリンクがありますのでわからない部分があれば参照してください。
ND4Jによる行列計算
ぶっちゃけて、ちょいとコードをかくだけで頭で計算する必要はありません。
なぜなら
パソコンは計算機だからです。
ジョークはさておき。。。行列(英語ではMatrix(マトリクス))はプログラム的には数値の配列です、これは「Vector」と書き「ベクトル」と呼んだり「配列」と呼んだり自分は混乱しました。参考にした、本なども初めの部分にある文言を読まなければ「???」となりました。※初めは読み飛ばしました(笑)
さて、コードです。このサイトを参考にしました。下の式をプログラムで表現すると次のようになります。
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
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
TensorFLowを学ぶ(Python)
- Tensorflow Keras 〜初めてのKeras〜
- Tensorflow Keras Errors〜”python is not installed as a framework.”〜
- Python Tensorflow 〜初めての人工知能(TensorFlowインストール)〜
- Tensorflow Keras〜初めのトレーニング_1〜
- Tensorflow Keras〜初めのトレーニング_2:前処理〜
- TensorFlow Keras〜テキストの分類〜
- Python TensorFlow tutorial〜チュートリアルを進めるコツ、ワンポイント〜
- TensorFlow Keras〜回帰、準備から予測まで〜
- TensorFlow Java 環境構築〜JavaでもTensorFlow〜