スポンサーリンク
グラム・シュミットの直交化法は、Pythonで関数として簡単に実装することができます。
本記事では、Pythonを使用したグラム・シュミットの直交化法の実装方法について、詳しくご説明します。
グラム・シュミットの直交化法
グラム・シュミットの直交化法(Gram–Schmidt orthonormalization)とは、ベクトル空間に存在する線形独立なベクトルに対し、正規直行系を生成するアルゴリズムの一種です。
直行化関数の実装
SciPyのscipy.linalgを使用して、グラム・シュミットの直交化法を実装してみます。
#input
import numpy as np
from scipy import linalg
def schmidt(arr):
arr = np.array(arr, dtype=np.float64)
k = arr.shape[1]
u = arr[:,[0]]
q = u / linalg.norm(u)
for j in range(1, k):
u = arr[:,[j]]
for i in range(j):
u -= np.dot(q[:,i], arr[:,j]) * q[:,[i]]
qi = u / linalg.norm(u)
q = np.append(q, qi, axis=1)
return q
実装した関数を使用して、任意の行列を直行化してみます。
#input
np.random.seed(9)
A = np.random.randint(-9,10,(3,3))
print("行列A:\n{}\n".format(A))
S = schmidt(A)
print("完全正規直行系S:\n{}".format(S))
#output
行列A:
[[-8 -1 8]
[-8 -9 5]
[ 1 1 3]]
完全正規直行系S:
[[-0.70436073 0.7096723 0.0155305 ]
[-0.70436073 -0.701468 0.10871348]
[ 0.08804509 0.06563443 0.9939518 ]]
出力されたものが完全正規直行系となっているか確認してみます。
各列のベクトルの内積が0になっていれば、直行していると言えます。
#input
print("1列目と2列目の内積:{}".format(S[:, 0] @ S[:, 1]))
print("2列目と3列目の内積:{}".format(S[:, 1] @ S[:, 2]))
print("3列目と1列目の内積:{}".format(S[:, 2] @ S[:, 0]))
#output
1列目と2列目の内積:1.3010426069826053e-17
2列目と3列目の内積:-1.3877787807814457e-17
3列目と1列目の内積:1.6653345369377348e-16
各列の内積はほぼ0でしたので、各ベクトルが直行していることが確認できました。
まとめ
この記事では、Pythonを使用した、グラム・シュミットの直交化法の実装方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
リンク
統計学基礎を学びたい方向け
リンク
Pythonの統計解析を学びたい方向け
リンク
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!
\まずは無料体験!/
スポンサーリンク