行列の対角化は、Pythonで簡単に実装することができます。
本記事では、Pythonを使用した行列の対角化関数の実装方法について、詳しくご説明します。
行列の対角化
行列の対角化(diagonalization)とは、線形変換により、正方行列を対角行列に変形することを言います。
ある行列\(A\)に対し、対角化行列\(P\)とその逆行列\(P^{-1}\)を用いると、固有値を対角成分に持つ行列(対角行列)\(D\)が下式のように得られます。
\(P^{-1}AP=D\)
diagonalization()
NumPyのnumpy.linalg.eig()を使用して、固有値を対角成分に持つ行列(対角行列)を出力する、diagonalization()関数を実装してみます。
#input
import numpy as np
def diagonalization(x):
eig = np.linalg.eig(x)
e = np.diag(eig[0])
p = eig[1]
return e, p
上記実装した関数を使用して、固有値を対角成分に持つ行列(対角行列)を出力してみます。
#input
np.random.seed(7)
np.set_printoptions(precision=3)
A = np.random.randint(0,10,(2,2))
print("行列A:\n{}\n".format(A))
D = diagonalization(A)
d = D[0]
p = D[1]
print("D:\n{}\n".format(d))
print("P:\n{}".format(p))
#output
行列A:
[[4 9]
[6 3]]
D:
[[10.865 0. ]
[ 0. -3.865]]
P:
[[ 0.795 -0.753]
[ 0.607 0.658]]
\(P\)の逆行列\(P^{-1}\)を使用して、上でご説明した算式が成り立つか確認してみます。
#input
p_inv = np.linalg.inv(p)
D_ = p_inv @ A @ p
print("D(確認):\n{}".format(D_))
#output
D(確認):
[[ 1.087e+01 -1.776e-15]
[-4.441e-16 -3.865e+00]]
誤差はありますが、\(D\)とほぼ等しい結果となりました。
トレースの確認
行列\(A\)のトレースと対角行列\(D\)のトレースは等しくなります。
NumPyを使用して、上記確認した例をご紹介します。
#input
import numpy as np
np.random.seed(7)
A = np.random.randint(0,10,(7,7))
print("行列A:\n{}\n".format(A))
D = diagonalization(A)
d = D[0]
A_tr = np.trace(A)
D_tr = np.trace(d)
print("行列Aのトレース:\n{}\n".format(A_tr))
print("行列Dのトレース:\n{}".format(D_tr))
#output
行列A:
[[4 9 6 3 3 7 7]
[9 7 8 9 8 7 6]
[4 0 7 0 7 6 3]
[5 8 8 7 5 0 0]
[2 8 9 6 4 9 7]
[3 3 8 3 0 1 0]
[0 6 7 7 9 3 0]]
行列Aのトレース:
30
行列Dのトレース:
(30.00000000000003+0j)
行列式の確認
行列\(A\)の行列式と対角行列\(D\)の行列式も等しくなります。
NumPyを使用した確認した例をご紹介します。
#input
import numpy as np
np.random.seed(7)
A = np.random.randint(0,10,(7,7))
print("行列A:\n{}\n".format(A))
det_A = np.linalg.det(A)
D = diagonalization(A)
d = D[0]
det_d = np.linalg.det(d)
print("行列Aの行列式:\n{}\n".format(det_A))
print("行列Dの行列式:\n{}".format(det_d))
#output
行列Aの行列式:
75729.99999999972
行列Dの行列式:
(75730.00000000041+0j)
まとめ
この記事では、Pythonを使用した行列の対角化関数の実装方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!