#線形代数
理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ!あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。
#環境
・JupyterNotebook
・言語:Python3, Julia1.4.0
#単位行列
E = \begin{pmatrix}1 & 0\\0 & 1\end{pmatrix},\begin{pmatrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{pmatrix}
のような左上から右下にかけて対角線上に1が並び、そのほかの要素は0になるという行列である。
n次正方行列に対して、同じ要素数の単位行列っをかけたとしても出力される値は同値となる。さらに積の順番は問わない。
AE = \begin{pmatrix}a & b\\c & d\end{pmatrix}\begin{pmatrix}1 & 0\\0 & 1\end{pmatrix}=\begin{pmatrix}a & b\\c & d\end{pmatrix}=\begin{pmatrix}1 & 0\\0 & 1\end{pmatrix}\begin{pmatrix}a & b\\c & d\end{pmatrix}=EA
###単位行列のPythonコード
import numpy as np
# print("2×2単位行列は")
print(np.eye(2))
# print("3×3単位行列は")
print(np.eye(3))
# print("4×4単位行列は")
print(np.eye(4))
#実装
2×2単位行列は
[[1. 0.]
[0. 1.]]
3×3単位行列は
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
4×4単位行列は
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
###単位行列のJuliaコード
using LinearAlgebra
Matrix{Int}(I, 2, 2)
Matrix{Int}(I, 3, 3)
Matrix{Int}(I, 4, 4)
2×2 Array{Int64,2}:
1 0
0 1
3×3 Array{Int64,2}:
1 0 0
0 1 0
0 0 1
4×4 Array{Int64,2}:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
#逆行列
逆行列は、
AA^{-1} = A^{-1}A = E
という関係を持つものである。例を示すと、
A =\begin{pmatrix}1 & 1 \\1 & 2\end{pmatrix},
B =\begin{pmatrix}2 & -1 \\-1 & 1\end{pmatrix}
という二つの行列があるときに対して、ABの積を求める。
AB =\begin{pmatrix}1 & 1 \\1 & 2\end{pmatrix}\begin{pmatrix}2 & -1 \\-1 & 1\end{pmatrix}=\begin{pmatrix}1 & 0\\0 & 1\end{pmatrix}
これより
AB = E = BA \Longrightarrow B = A^{-1}
#行列式
A = \begin{pmatrix}a & b\\c & d\end{pmatrix}
\Longleftrightarrow
\begin{vmatrix}A\end{vmatrix}= det A = ad-bc
さらに2×2行列の時には、
A^{-1} = \frac{1}{ad-bc}\begin
{pmatrix}d & -b\\-c & a\end{pmatrix}
と表すことができ、この時、
ad-bc = 0 \Longleftrightarrow A^{-1}は存在しない
\\
ad-bc \neq 0 \Longleftrightarrow A^{-1}が存在する。
と書くことができる。
###行列式を含めた逆行列のPythonコード
import numpy as np
a = [input().split() for i in range(2)]
#数字入力
#=>1 2
#=>3 4
a = np.array(a)
print(a)
#=>[['1' '2']
# ['3' '4']]
a = a.astype(np.float64)
print(np.linalg.det(a))
#=>-2.0000000000000004
if np.linalg.det(a) != 0:
print(np.linalg.inv(a))
else:
print("No exist")
#=>[[-2. 1. ]
# [ 1.5 -0.5]]
実際には、if文を用いなくてもnp.linalg.inv()関数
でそのまま計算しても、逆行列が存在しない場合にはエラーが起こる。ただ、行列式を今回は使いたいので、np.linalg.det()関数
を用いて書いた。
###行列式を含めた逆行列のJuliaコード
using LinearAlgebra
A = [1 2; 3 4]
if det(A) == 0
print("No exist")
else
inv(A)
end
#=>2×2 Array{Float64,2}:
# -2.0 1.0
# 1.5 -0.5
inv()関数
によって逆行列はすぐに求められる。
#最後に
次は、線形変換やるつもりなので、グラフ強くなりたい人は。ぜひ。