Powered by AppSignal & Oban Pro

線型代数学の基礎

linear_algebra_basics.livemd

線型代数学の基礎

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 を使って基本的な線型代数学の計算をやる

資料

スカラー

_scaler = Nx.tensor(2)

ベクトル

  • 数を(縦や横に)並べたもの
  • 行列の特殊な場合

55

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

07

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)

行列

  • 数を(縦と横に)並べたもの

17

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)

24

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)

行列の積

要素ごとの積

|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)

ニューラルネットワークの計算

02