線形代数
理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ!あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。
環境
・JupyterNotebook
・言語:Python3, Julia1.4.0
固有値と固有ベクトル
固有値と固有ベクトルは人工知能でデータの要約する主成分分析法で用いられる。
固有値、固有ベクトル
正方行列Aを考える。
この行列Aにたいして、
A\vec{x}=λ\vec{x}
を満たすとき、
λを行列Aの固有値\\
\vec{x}を行列Aの固有ベクトル\\
という。
固有方程式
上のような式に対して、ベクトルに影響を及ぼすことのない単位行列Eをかける。
A\vec{x}=λE\vec{x}
右辺を移項して整理する
(A-λE)\vec{x} = \vec{0}
これは要素がすべて0のベクトルを表す。これに対して、逆行列を考えても零
ベクトルである。
この式を固有方程式***という。
固有方程式による固有値、固有ベクトルの求解
(A-λE)\vec{x} = \vec{0}
に沿って、
A=\begin{pmatrix}3 & 1\\2 & 4\end{pmatrix}
として具体例で行う。
そうすると、
det(A-λE)\vec{x} = 0\\
⇔
det(\begin{pmatrix}3 & 1\\2 & 4\end{pmatrix}-λ\begin{pmatrix}1 & 0\\0 & 1\end{pmatrix})\vec{x} = 0\\
⇔
det\begin{pmatrix}3-λ & 1\\2 & 4-λ\end{pmatrix} = 0\\
⇔(λ-2)(λ-5)= 0\\
これによって、固有値は2または5になる。
固有値によって固有ベクトルも変わってくるので。2,5のときそれぞれで考える。
\vec{x} = \begin{pmatrix}p\\q\end{pmatrix}
とおくとき、λ=2で計算すると、
det(A-λE)\vec{x} = 0\\
\begin{align}
det(A-λE)\vec{x}&=
det(A-2E)\begin{pmatrix}p\\q\end{pmatrix} \\
&=\begin{pmatrix}1 & 1\\2 & 2\end{pmatrix}\begin{pmatrix}p\\q\end{pmatrix}\\
&=\begin{pmatrix}p+q\\2p+2q\end{pmatrix} \\
&= \vec{0}
\end{align}
これより、p+q = 0であるといえるので、任意の実数tを置いて、xベクトルは
\vec{x}=\begin{pmatrix}t\\-t\end{pmatrix}
と固有ベクトルを求められる。
λ=5のときは、
\vec{x}=\begin{pmatrix}t\\2t\end{pmatrix}
となる。
###プログラム
#####固有値、固有ベクトルを求めるプログラム
#####python
import numpy as np
A = np.array([[3, 1],[2, 4]])
ev = np.linalg.eig(A)
print(ev[0])
print(ev[1])
[2. 5.]
[[-0.70710678 -0.4472136 ]
[ 0.70710678 -0.89442719]]
ここでlinag.eig関数
を使っている。固有値が英語で、eigenvalueというからだ。
原理的なプログラムを組もう。今回は固有値までを求める。
python(原理的)
import numpy as np
import sympy
#A = [[a, b],
# [c, d]]
a = int(input())
b = int(input())
c = int(input())
d = int(input())
#=>3
#=>1
#=>2
#=>4
x = sympy.Symbol('x')
eigenequa = x**2 - (a + d)*x + (a * d) - (b * c)```
print(eigenequa)
# factorization = sympy.factor(eigenequa)
# print(factorization)
solve = sympy.solve(eigenequa)
print(solve)
#=>x**2 - 7*x + 10
#=>[2, 5]
juliaはものすごい簡単なので、載せときます。
julia
using LinearAlgebra
F = eigen([3 1; 2 4;])
#=>Eigen{Float64,Float64,Array{Float64,2},Array{Float64,1}}
#=>values:
#=>2-element Array{Float64,1}:
#=> 2.0
#=> 5.0
#=>vectors:
#=>2×2 Array{Float64,2}:
#=> -0.707107 -0.447214
#=> 0.707107 -0.894427
たった2行だけ!すごい...
今日はここまで