Up

Python特異値分解

 

行列A特異値分解を行ってみる(岡本安晴、2019pp.61-72岡本安晴、2009pp.41-49)。正方対称行列であれば固有分解もできるので固有分解も行ってみる。

 

 

特異値分解

 

次の行列

の特異値分解を行うスクリプトをリスト1のように用意した。

 

 

リスト1

 

import numpy as np

 

a = np.array([[1, 0], [0, -2]])

print('a =\n', a)

U, S, Vh = np.linalg.svd(a)

print('U =\n', U)

print('S =\n', S)

print('Vh =\n', Vh)

ck_a = U @ np.diag(S) @ Vh

print('ck_a =\n', ck_a)

 

 

リスト1を実行すると、以下の出力を得る。

 

a =

 [[ 1  0]

 [ 0 -2]]

U =

 [[0. 1.]

 [1. 0.]]

S =

 [2. 1.]

Vh =

 [[-0. -1.]

 [ 1.  0.]]

ck_a =

 [[ 1.  0.]

 [ 0. -2.]]

 

すなわち、

特異値

左特異ベクトル

左特異ベクトルはに列単位でまとめられている。Pythonprintprint('U =\n', U)では、Uは行単位でまとめられて出力されている。

 

右特異ベクトル

右特異ベクトルはに行単位でまとめられている。Pythonprintprint('Vh =\n', Vh)でも、は行単位でまとめられて出力されている。

参照

https://numpy.org/doc/stable/reference/generated/numpy.linalg.svd.html

 

よって、特異値分解は次式

で与えられる。

 

上の行列Aは対称行列であるので、固有分解もできる。次に、固有分解を示す。

 

 

固有分解

 

次の行列

の固有分解を行うスクリプトをリスト2のように用意した。

 

 

リスト2

 

import numpy as np

 

a = np.array([[1, 0], [0, -2]])

print('a =\n', a)

vals, vecs = np.linalg.eigh(a)

print('vals =\n', vals)

print('vecs =\n', vecs)

ck_a = vecs @ np.diag(vals) @ vecs.T

print('ck_a =\n', ck_a)

 

 

リスト2のスクリプトを実行すると、以下の出力を得る。

 

a =

 [[ 1  0]

 [ 0 -2]]

vals =

 [-2.  1.]

vecs =

 [[0. 1.]

 [1. 0.]]

ck_a =

 [[ 1.  0.]

 [ 0. -2.]]

 

 

すなわち、固有分解は次式

で与えられる。

 

 

Home