統計や機械学習に関するプログラミングではPython
やR
が用いられることが多いですが、近年Julia
も注目を集めています。そこで当シリーズではJulia
の基本構文からライブラリの用い方などについて取りまとめます。当記事ではLinearAlgebraライブラリを用いた行列の操作・行列分解について取りまとめを行いました。
・Julia
入門
https://www.hello-statisticians.com/julia
・Julia 1.8 Documentation
https://docs.julialang.org/en/v1/
特殊な行列の作成
Juliaでサポートされる特殊な行列
Julia
では下記のように対称行列・対角行列のような特殊な行列の取り扱いが用意されており、行列の作成にあたって用いることが可能です。
型 | 概要 |
Symmetric | 対称行列 |
Hermitian | エルミート行列 |
UpperTriangular | 上三角行列 |
LowerTriangular | 下三角行列 |
Diagonal | 対角行列 |
実行例
以下では対称行列を取り扱うSymmetric
の実行例について確認を行いました。
using LinearAlgebra
A = [1 2 3; 4 5 6; 7 8 9]
println(A)
println("===")
Symmetric(A)
・実行結果
[1 2 3; 4 5 6; 7 8 9]
===
3×3 Symmetric{Int64, Matrix{Int64}}:
1 2 3
2 5 6
3 6 9
上記では対角成分より上側にある成分を元に対称行列が作成されたことが確認できます。同様にSymmetric(A, :L)
を実行することで下記のように対角成分から下側にある成分を元に対称行列を作成することもできます。
Symmetric(A, :L)
・実行結果
3×3 Symmetric{Int64, Matrix{Int64}}:
1 4 7
4 5 8
7 8 9
対角行列の作成にあたっては下記のようにDiagonal
を実行すれば良いです。
Diagonal(A)
・実行結果
3×3 Diagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅
⋅ 5 ⋅
⋅ ⋅ 9
行列分解
主要な行列分解の関数
主要な行列分解はそれぞれ下記を実行することで得ることができます。
関数 | 概要 |
cholesky | Cholesky分解 |
lu | LU分解 |
qr | QR分解 |
hessenberg | Hessenberg分解 |
eigen | スペクトル分解 |
svd | 特異値分解 |
行列分解の原理などについては下記などで取り扱いました。
実行例
QR分解は下記のようにqr
関数を実行することで行うことができます。
using LinearAlgebra
A = [1 2 3; 4 1 6; 7 8 1]
・実行結果
3×3 Matrix{Int64}:
1 2 3
4 1 6
7 8 1
res = qr(A)
res
・実行結果
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor:
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}:
-0.123091 0.323368 -0.938233
-0.492366 -0.840757 -0.225176
-0.86164 0.434237 0.262705
R factor:
3×3 Matrix{Float64}:
-8.12404 -7.63167 -4.18511
0.0 3.27987 -3.6402
0.0 0.0 -3.90305
上記のQR分解は下記のようにQ
とR
の行列の積を確認することで結果が妥当であるかどうかの確認を行うことができます。
res.Q * res.R
・実行結果
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 1.0 6.0
7.0 8.0 1.0
参考
・Julia 1.8 Documentation
https://docs.julialang.org/en/v1/