【Python入門】グラム・シュミットの直交化法|直行化関数を実装する

グラム・シュミットの直交化法|直行化関数を実装する_アイキャッチ プログラミング

※ 当サイトはアフィリエイト広告を利用しています。

levtech-ad
スポンサーリンク

グラム・シュミットの直交化法は、Pythonで関数として簡単に実装することができます。

本記事では、Pythonを使用したグラム・シュミットの直交化法の実装方法について、詳しくご説明します。

こんな人に読んでほしい
  • Python初心者の人
  • Pythonを使用したグラム・シュミットの直交化法の実装方法について学びたい人
levtech-ad

グラム・シュミットの直交化法

グラム・シュミットの直交化法(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(テックアカデミー)がおすすめです。

私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。

現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。

無料体験ができますので、まずは試してみてください!

\まずは無料体験!/
スポンサーリンク
タイトルとURLをコピーしました