ユニタリ行列
実空間 $\mathbb{R}^n$ の 直交行列 $Q$ は、複素空間 $\mathbb{C}^n$ において ユニタリ行列 $U$ として拡張定義されます。ユニタリ行列は
\[U^{\dagger}U=UU^{\dagger}=I\tag{1}\]
を満たす正方行列です。$U$ が実行列であれば $U^{\dagger}=U^T$ なので、(1) は直交行列 $Q$ の定義を包含します。たとえば、前回記事で扱ったエルミート行列
\[H=\begin{bmatrix}2&1-i\\1+i&3\end{bmatrix}\tag{2}\]
を対角化する行列
\[\left[\begin{matrix}- \cfrac{\sqrt{6}}{3} & \cfrac{\sqrt{3}}{3}\\
\cfrac{\sqrt{6} \left(1 + i\right)}{6} & \cfrac{\sqrt{3} \left(1 + i\right)}{3}\end{matrix}\right]\tag{3}\]
はノルム $1$ の列ベクトル同士が直交するので ユニタリ行列 です。
列ベクトル同士が直交する任意の行列は、正規化して各々のベクトルの ノルム を $1$ に揃えることで、ユニタリ行列にすることができます。たとえば、
\[A=\begin{bmatrix}-2&1\\1+i&1+i\end{bmatrix}\tag{4}\]
は列ベクトル同士が直交する行列です。これを正規化してユニタリ行列にしてみましょう。
# python_unitary
# In[1]
import numpy as np
from scipy import linalg
np.set_printoptions(precision=3)
# 共役転置関数
def hermitian(arr):
return np.conjugate(arr.T)
# 正規化関数
def normalize(arr, axis=0):
norm = linalg.norm(arr, axis=axis)
return arr / norm
A = np.array([[-2, 1],
[1+1j, 1+1j]])
# Aを正規化してユニタリ行列にする
U = normalize(A)
# ユニタリ行列が満たすべき性質を確認
X1 = hermitian(U) @ U
X2 = U @ hermitian(U)
print("U:\n{}\n".format(U))
print("(U^†)U:\n{}\n".format(X1))
print("U(U^†):\n{}".format(X2))
'''
U:
[[-0.816+0.j 0.577+0.j ]
[ 0.408+0.408j 0.577+0.577j]]
(U^†)U:
[[1.+0.j 0.+0.j]
[0.+0.j 1.+0.j]]
U(U^†):
[[ 1.000e+00+0.000e+00j -2.946e-18+2.946e-18j]
[-2.946e-18-2.946e-18j 1.000e+00+0.000e+00j]]
'''
$U^{\dagger}U=UU^{\dagger}=I$ を満たすので、ユニタリ行列 $U$ の随伴行列 $U^{\dagger}$ は $U$ の逆行列です。
\[U^{\dagger}=U^{-1}\tag{5}\]
(4) を正規化して作ったユニタリ行列の随伴行列と逆行列を計算して、両者が一致することを確認してみましょう。
# In[2]
U_H = hermitian(U)
U_inv = linalg.inv(U)
print("Uの随伴行列:\n{}\n".format(U_H))
print("Uの逆行列:\n{}".format(U_inv))
'''
Uの随伴行列:
[[-0.816-0.j 0.408-0.408j]
[ 0.577-0.j 0.577-0.577j]]
Uの逆行列:
[[-0.816+0.j 0.408-0.408j]
[ 0.577+0.j 0.577-0.577j]]
'''
ユニタリ変換
任意のベクトル $\boldsymbol{x}$ にユニタリ行列 $U$ をかけたとき、$U\boldsymbol{x}$ のノルムは
\[(U\boldsymbol{x}, U\boldsymbol{x})=(U\boldsymbol{x})^{\dagger}U\boldsymbol{x}=\boldsymbol{x}^{\dagger}U^{\dagger}U\boldsymbol{x}=\boldsymbol{x}^{\dagger}\boldsymbol{x}=(\boldsymbol{x},\boldsymbol{x})\tag{6}\]
となって、ユニタリ行列による線型変換 (ユニタリ変換) がベクトルのノルムを保持する等長変換であることがわかります (実数空間の直交行列 $Q$ と同じです)。すなわち、
\[\parallel U\boldsymbol{x} \parallel=\parallel \boldsymbol{x} \parallel\tag{7}\]
が成り立ちます。一例として、複素ベクトル
\[\boldsymbol{z}=\begin{bmatrix}3+5i\\2-i\end{bmatrix}\tag{8}\]
について、自身のノルムと $Uz$ のノルムが一致することを確認してみます。
# In[3]
# 複素ベクトルを定義
z = np.array([3 + 5j, 2-1j])
# zのノルムを計算
z_norm = linalg.norm(z)
# zにユニタリ行列Uを作用させる
Uz = U @ z
# Uzのノルムを計算
Uz_norm = linalg.norm(Uz)
print(z_norm)
print(Uz_norm)
# 6.244997998398398
# 6.244997998398399
ユニタリ行列 $U$ の固有値が $\lambda$、すなわち $U\boldsymbol{x}=\lambda\boldsymbol{x}$ であるとき、$\parallel\lambda\boldsymbol{x}\parallel=\boldsymbol{x}$ より、$\parallel\lambda\parallel=1$ となります。
# In[4]
# ユニタリ行列Uの固有値
eigvals = linalg.eig(U)[0]
# 固有値の絶対値
norm = np.abs(eigvals)
print("Uの固有値:\n{}\n".format(eigvals))
print("固有値の絶対値:\n{}".format(norm))
# Uの固有値:
# [-0.997-0.075j 0.758+0.652j]
# 固有値の絶対値:
# [1. 1.]
[参考文献]・ Wikipedia ・『ストラング:線形代数イントロダクション』
最初は1/4くらいで挫折しましたが、「高校数学でわかる線形代数」(竹内淳著 ブルーバックス) を読んでから再挑戦し、ようやく最後までたどり着きました。ストラング:線形代数イントロダクションの中古本も見つけたので注文しました。Ax=b, 0, λx の奥深い世界をのぞけたらいいと思います。
これからはPythonを復習しながら「機械学習」のほうで勉強させていただきますので、よろしくお願いいたします。
最後までお読みいただき、ありがとうございます。散見される誤植のせいで、読みにくいところもあったかと思いますが、その都度ご指摘していただいて本当に感謝しています。
『ストラング:線形代数イントロダクション』は名著で、私も記事を書くために参照しています。ただ、扱う内容がとても幅広く、演習問題の数も膨大なので、読み切るのはなかなか大変です(私も全部は目を通していません)。焦らずゆっくりと読み進めると良いと思います。このサイトで扱っていない内容としては、実行列の複素数固有値、正定値行列、特異値分解 (SVD) などがあります。いずれもとても興味深い内容なので、ぜひ挑戦してください。
「機械学習」の勉強もぜひ楽しんでください。なるべくライブラリに頼らず、数学をたくさん用いて機械学習を根本から理解できるような構成になっています。これまで学んだ線形代数の知識も生きてくると思います。よろしくお願いします。
最近は他の仕事などで忙しく、このサイトの記事をなかなか更新できていませんが、久しぶりに線形代数の新しい記事の執筆にとりかかりました。これまで取りこぼしていた内容をいくつか付け加えたり、さらに進んだ内容も扱ってみたいと思いますので、時々お立ち寄りください。次回は「ケーリー・ハミルトンの定理」を予定しています。
ChatGPTに「ユニタリ行列」について質問しました
[Q] ユニタリ行列とは何ですか? どのような時に使われますか?
[A] ユニタリ行列は、線型代数学において重要な特性を持つ行列の一種です。ユニタリ行列は正方行列であり、複素数の要素を持ちます。以下の条件を満たす行列をユニタリ行列と呼びます。
1. 転置行列と元の行列の積が単位行列と等しい: U†U = UU† = I(†は転置を表す)
2. 行列の各列ベクトルのノルム(大きさ)が1である: ||Ux|| = ||x||(xは列ベクトル)
ユニタリ行列は、幾何学的な変換や量子力学などの物理学的な応用で頻繁に使用されます。主な用途は以下の通りです。
1. ユニタリ変換: ユニタリ行列は、ベクトルや行列を回転や拡大縮小、反転などの変換に使用します。幾何学的な図形や信号処理、画像処理などで広く利用されます。
2. 量子力学: ユニタリ行列は、量子系の状態の進化を表すために使用されます。量子ゲートや量子回路の操作はユニタリ行列として表現され、量子アルゴリズムの実装に欠かせない要素です。
3. エンコーディングとデコーディング: ユニタリ行列は情報理論や通信工学の分野で符号化や復号化に使用されます。特に、ユニタリ行列を用いた量子エンコーディングは、情報の伝送や保護において重要な役割を果たします。
4. 行列の対角化: ユニタリ行列は、他の行列を対角化するための変換行列として使用されます。対角化により、行列の特性や性質を解析しやすくなります。
ユニタリ行列の特性により、重要な性質が保持されるため、多くの応用分野で利用されています。