LoginSignup
4
1

More than 3 years have passed since last update.

固有値と固有ベクトル : 線形代数をPythonで<7>

Last updated at Posted at 2020-05-27

線形代数

理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれを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
7pythoneigenvaluevector
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(原理的)
7pythoneigenvaluevector2
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
7juliaigenvaluevector
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行だけ!すごい...

今日はここまで

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1