線型代数学の基礎
Mix.install([{:nx, "~> 0.4"}])
# Mix.install(
# [
# {:nx, "~> 0.4.0"},
# {:exla, "~> 0.4.0"}
# ],
# config: [nx: [default_backend: EXLA.Backend]]
# )
import IEx.Helpers
:ok
概要
- Elixir Nx を使って基本的な線型代数学の計算をやる
資料
- https://hexdocs.pm/nx/Nx.html
- 深掘り Nx シリーズ ~ tensor を知る ① ~
- 深掘り Nx シリーズ ~ tensor を知る ② 算術計算 ~
- 深掘り Nx シリーズ ~ tensor を知る ③ 算術計算その 2 行列の積 ~
- 線型代数学 - Wikipedia
- 行列 - Wikipedia
- 中学数学からはじめる AI(人工知能)のための数学入門
- 高校 1,2 年生でも分かる線形代数@東京大学
スカラー
_scaler = Nx.tensor(2)
ベクトル
- 数を(縦や横に)並べたもの
- 行列の特殊な場合

# 行ベクトル
_row = Nx.tensor([1, 2, 3])
# 列ベクトル
_col = Nx.tensor([[1], [3], [8]])

col1 = Nx.tensor([[2], [1], [3]])
col2 = Nx.tensor([[0], [1], [2]])
Nx.add(col1, col2)
col1 = Nx.tensor([[2], [0], [1], [3]])
col2 = Nx.tensor([[1], [2], [4], [0]])
Nx.subtract(col1, col2)
row = Nx.tensor([2, 3, 0])
Nx.multiply(row, 3)
col = Nx.tensor([[1], [2], [0]])
Nx.multiply(col, -2)
行列
- 数を(縦と横に)並べたもの

matrix1 = Nx.tensor([[2, 4], [0, 3]])
matrix2 = Nx.tensor([[1, 1], [0, -1]])
Nx.add(matrix1, matrix2)
matrix1 = Nx.tensor([[2, 0], [1, 1], [3, 4]])
matrix2 = Nx.tensor([[0, 1], [2, 3], [-1, 4]])
Nx.subtract(matrix1, matrix2)

matrix1 = Nx.tensor([[1, 2], [3, 4]])
matrix2 = Nx.tensor([[0, 2], [4, 6]])
Nx.dot(matrix1, matrix2)
matrix1 = Nx.tensor([[1, 2], [3, 4]])
matrix2 = Nx.tensor([[0, 2], [4, 6]])
Nx.multiply(matrix1, matrix2)
スカラーの計算
Nx.add(1, 2)
s1 = Nx.tensor(1)
s2 = Nx.tensor(2)
Nx.add(s1, s2)
s1 = Nx.tensor(5)
s2 = Nx.tensor(2)
Nx.subtract(s1, s2)
s1 = Nx.tensor(2)
s2 = Nx.tensor(3)
Nx.multiply(s1, s2)
s1 = Nx.tensor(2)
s2 = Nx.tensor(3)
Nx.divide(s1, s2)
スカラーとベクトルの計算
add
scaler = Nx.tensor(2)
row = Nx.tensor([1, 2, 3])
Nx.add(scaler, row)
scaler = Nx.tensor(2)
column = Nx.tensor([[1], [2], [3]])
Nx.add(scaler, column)
subtract
scaler = Nx.tensor(2)
row = Nx.tensor([1, 2, 3])
Nx.subtract(scaler, row)
scaler = Nx.tensor(2)
column = Nx.tensor([[1], [2], [3]])
Nx.subtract(scaler, column)
multiply
scaler = Nx.tensor(2)
row = Nx.tensor([1, 2, 3])
Nx.multiply(scaler, row)
scaler = Nx.tensor(2)
column = Nx.tensor([[1], [2], [3]])
Nx.multiply(scaler, column)
divide
scaler = Nx.tensor(2)
row = Nx.tensor([1, 2, 3])
Nx.divide(scaler, row)
scaler = Nx.tensor(2)
column = Nx.tensor([[1], [2], [3]])
Nx.divide(scaler, column)
3 行ベクトルと 3 行ベクトルの計算
row1 = Nx.tensor([1, 2, 3])
row2 = Nx.tensor([10, 20, 30])
Nx.add(row1, row2)
row1 = Nx.tensor([1, 2, 3])
row2 = Nx.tensor([10, 20, 30])
Nx.subtract(row1, row2)
row1 = Nx.tensor([1, 2, 3])
row2 = Nx.tensor([10, 20, 30])
Nx.multiply(row1, row2)
row1 = Nx.tensor([1, 2, 3])
row2 = Nx.tensor([3, 4, 5])
Nx.divide(row1, row2)
3 列ベクトルと 3 列ベクトルの計算
col1 = Nx.tensor([[1], [2], [3]])
col2 = Nx.tensor([[10], [20], [30]])
Nx.add(col1, col2)
col1 = Nx.tensor([[1], [2], [3]])
col2 = Nx.tensor([[10], [20], [30]])
Nx.subtract(col1, col2)
col1 = Nx.tensor([[1], [2], [3]])
col2 = Nx.tensor([[10], [20], [30]])
Nx.multiply(col1, col2)
col1 = Nx.tensor([[1], [2], [3]])
col2 = Nx.tensor([[3], [4], [5]])
Nx.divide(col1, col2)
3 行ベクトルと 3 列ベクトルの計算
import Nx, only: :sigils
row = ~M"""
10 20 30
"""s32
col = ~M"""
1
2
3
"""s32
Nx.add(row, col)
import Nx, only: :sigils
row = ~M"""
10 20 30
"""s32
col = ~M"""
1
2
3
"""s32
Nx.subtract(row, col)
import Nx, only: :sigils
row = ~M"""
10 20 30
"""s32
col = ~M"""
1
2
3
"""s32
Nx.multiply(row, col)
import Nx, only: :sigils
row = ~M"""
10 20 30
"""s32
col = ~M"""
1
2
3
"""s32
Nx.divide(row, col)
要素数が違うベクトルの計算
例として 3 行ベクトル x 2 列ベクトル
import Nx, only: :sigils
row = ~M"""
10 20
"""s32
col = ~M"""
1
2
3
"""s32
Nx.add(row, col)
行列とベクトルの計算
import Nx, only: :sigils
vec = ~V"""
10 20
"""s32
mat = ~M"""
1 2
3 4
"""s32
Nx.add(mat, vec)
行列と行列の計算
同じ位置の要素同士で計算
t1 = ~M"""
1 0 1
3 2 0
1 1 2
"""
t2 = ~M"""
0 3 1
2 0 1
0 2 0
"""
Nx.multiply(t1, t2)
行列の積
- 行列の乗法
- Difference between np.dot and np.multiply with np.sum in binary cross-entropy loss calculation
要素ごとの積
|A B| ⊙ |E F| = |A*E B*F|
|C D| |G H| |C*G D*H|
import Nx, only: :sigils
mat1 = ~M"""
1 2
3 4
"""
mat2 = ~M"""
5 6
7 8
"""
Nx.multiply(mat1, mat2)
ドット積(内積)
|A B| . |E F| = |A*E+B*G A*F+B*H|
|C D| |G H| |C*E+D*G C*F+D*H|
import Nx, only: :sigils
mat1 = ~M"""
1 2
3 4
"""
mat2 = ~M"""
5 6
7 8
"""
Nx.dot(mat1, mat2)
ニューラルネットワークの計算
