覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

ND4J - ベクトルの演算

前回のエントリでND4Jの利用準備をして、ベクトルと行列の定義だけしてみました

今回はベクトルの演算を試してみます。


各種演算

ベクトルの和

ベクトルとベクトルの足し算です。

\begin
{pmatrix}
1.0\\
2.0
\end
{pmatrix}
+
\begin
{pmatrix}
5.0\\
7.0
\end
{pmatrix}=\begin{pmatrix}
6.0\\
9.0
\end{pmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1});
INDArray vectorB = Nd4j.create(new double[]{5.0, 7.0}, new int[]{2, 1});

// ベクトルの和
INDArray vRet1 = vectorA.add(vectorB);
System.out.println("vRet1: \n" + vRet1);
System.out.println("vRet1 is Vector?: " + vRet1.isVector());

■実行結果

要素同士の値が足し算されたベクトルの形で結果が出ています

vRet1: 
[6.00, 9.00]
vRet1 is Vector?: true


ベクトルの差

ベクトルとベクトルの引き算です。

\begin
{pmatrix}
1.0\\
2.0
\end
{pmatrix}
-
\begin
{pmatrix}
5.0\\
7.0
\end
{pmatrix}=\begin{pmatrix}
-4.0\\
-5.0
\end{pmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1});
INDArray vectorB = Nd4j.create(new double[]{5.0, 7.0}, new int[]{2, 1});

// ベクトルの差
INDArray vRet2 = vectorA.sub(vectorB);
System.out.println("vRet2: \n" + vRet2);
System.out.println("vRet2 is Vector?: " + vRet2.isVector());

■実行結果

要素同士の値が引き算されたベクトルの形で結果が出ています

vRet2: 
[-4.00, -5.00]
vRet2 is Vector?: true


ベクトル×スカラー

ベクトルをスカラー倍します。

\begin
{pmatrix}
1.0\\
2.0
\end
{pmatrix}
\cdot10=\begin{pmatrix}
10.0\\
20.0
\end{pmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

INDArray vectorA = Nd4j.create(new double[]{1.0, 2.0}, new int[]{2, 1});

INDArray vRet3 = vectorA.mul(10);
System.out.println("vRet3: \n" + vRet3);
System.out.println("vRet3 is Vector?: " + vRet3.isVector());

■実行結果

ベクトルの各要素の値がスカラー倍されています

vRet3: 
[10.00, 20.00]
vRet3 is Vector?: true


内積(inner product)

ベクトルの内積は、行ベクトル×列ベクトルの演算を行って値をもとめます

\begin
{pmatrix}
1.0 \ 2.0 \ 3.0
\end
{pmatrix}
\begin
{pmatrix}
4.0\\
5.0\\
6.0
\end
{pmatrix}=32.0

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

// ベクトルの内積(inner product)(行ベクトル×列ベクトル)
INDArray rowVector1 = Nd4j.create(new double[]{1.0, 2.0, 3.0}, new int[]{1, 3});
INDArray colVector1 = Nd4j.create(new double[]{4.0, 5.0, 6.0}, new int[]{3, 1});

INDArray vRet4 = rowVector1.mmul(colVector1);
System.out.println("vRet4: \n" + vRet4);
System.out.println("vRet4 is Scalar? -> " + vRet4.isScalar());

■実行結果

スカラーで対象のベクトルの値が算出されています

vRet4: 
32.00
vRet4 is Scalar? -> true


直積(outer product)

ベクトルの直積は、列ベクトル×行ベクトルの演算を行ってもとめます

\begin
{pmatrix}
4.0 \\
5.0 \\
6.0
\end
{pmatrix}
\begin
{pmatrix}
1.0\ 2.0\ 3.0
\end
{pmatrix}=\begin{pmatrix}
4.0 \ 8.0\ 12.0\\
5.0 \ 10.0\ 15.0\\
6.0 \ 12.0\ 18.0
\end{pmatrix}

■サンプルコード

import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

// ベクトルの直積(outer product)(列ベクトル×行ベクトル)
INDArray colVector2 = Nd4j.create(new double[]{4.0, 5.0, 6.0}, new int[]{3, 1});
INDArray rowVector2 = Nd4j.create(new double[]{1.0, 2.0, 3.0}, new int[]{1, 3});

INDArray vRet5 = colVector2.mmul(rowVector2);
System.out.println("vRet5: \n" + vRet5);
System.out.println("vRet5 is Matrix? -> " + vRet5.isMatrix());

■実行結果

vRet5: 
[[4.00, 8.00, 12.00],
 [5.00, 10.00, 15.00],
 [6.00, 12.00, 18.00]]
vRet5 is Matrix? -> true


その他

外積(クロス積 cross product)に該当するAPI(いわゆるNumPynumpy.crossに対応するもの)が良くわからなくて今回試せてません・・・。
ND4Jに対する知識がなさ過ぎて見つけられてません。むしろ誰か教えてください。



関連エントリ