logo

特異値分解 (SVD)

行列の特異値分解 (SVD) は、その行列を 3 つの行列に因数分解したものです。これには興味深い代数的特性があり、線形変換に関する重要な幾何学的および理論的洞察が得られます。データ サイエンスにも重要な応用例がいくつかあります。この記事では、SVD の背後にある数学的直観と​​その幾何学的意味を説明していきます。

SVD の背後にある数学:

mxn 行列 A の SVD は次の式で与えられます。 A = Uシグマ V^T



どこ:

  • で: MXM の正規直交固有ベクトルの行列 AA^{T}
  • T: a の転置 nxn の正規直交固有ベクトルを含む行列 あ^た
  • シグマ: AAᵀ または Aᵀ A の正の固有値の根に等しい r 要素を持つ対角行列 (いずれの行列も同じ正の固有値を持ちます)。

  • 行列 A = の SVD を求めます。 egin{bmatrix} 3&2 & 2  2& 3& -2 end{bmatrix}
  • SVD を計算するには、まず、AA^{T} の固有値を見つけて特異値を計算する必要があります。

A cdot A^{T} =egin{bmatrix} 3& 2 & 2  2& 3& -2 end{bmatrix} cdot egin{bmatrix} 3 & 2  2 & 3  2 & -2 end{bmatrix} = egin{bmatrix} 17 & 8 8 & 17 end{bmatrix}

  • 上記の行列の特性方程式は次のとおりです。

W - lambda I =0  A A^{T} - lambda I =0

lambda^{2} - 34 lambda + 225 =0

= (lambda-25)(lambda-9)

シュロカ・メータ

したがって、特異値は次のようになります。 sigma_1 = 5 , ; sigma_2 = 3

  • ここで、正しい特異ベクトル、つまり A の固有ベクトルの正規直交セットを見つけます。TA. A の固有値TA は 25、9、0 であり、A 以降TA は対称であり、固有ベクトルが直交することがわかっています。

のために ラムダ = 25、

A^{T}A - 25 cdot I = egin{bmatrix} -12 & 12& 2 12 & -12 & -2 2& -2 & -17 end{bmatrix}

これは次のように行を縮小できます。

egin{bmatrix} 1& -1& 0  0& 0& 1 0& 0& 0 end{bmatrix}

その方向の単位ベクトルは次のとおりです。

v_1 = egin{bmatrix} frac{1}{sqrt{2}} frac{1}{sqrt{2}} 0 end{bmatrix}

同様に、 lambda = 9 の場合、固有ベクトルは次のようになります。

v_2 =egin{bmatrix} frac{1}{sqrt{18}} frac{-1}{sqrt{18}} frac{4}{sqrt{18}} end{b行列}

3 番目の固有ベクトルについては、次のように v1 と v2 に垂直であるというプロパティを使用できます。

v_1^{T} v_3 =0  v_2^{T} v_3 =0

設定メニューを開く

上の方程式を解いて 3 番目の固有ベクトルを生成します。

v_3 = egin{bmatrix} a b c end{bmatrix} = egin{bmatrix} a -a  -a/2 end{bmatrix} = egin{bmatrix} frac{ 2}{3} frac{-2}{3} frac{-1}{3} end{bmatrix}

ここで、式 u_i = frac{1}{sigma} A v_i を使用して U を計算すると、U = が得られます。 egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{-1 }{sqrt{2}} end{bmatrix}。したがって、最終的な SVD 方程式は次のようになります。

A = egin{bmatrix} frac{1}{sqrt{2}} &frac{1}{sqrt{2}}  frac{1}{sqrt{2}}& frac{ -1}{sqrt{2}} end{bmatrix} egin{bmatrix} 5 & 0& 0  0 & 3& 0 end{bmatrix} egin{bmatrix} frac{1}{sqrt{2 }}& frac{1}{sqrt{2}} &0  frac{1}{sqrt{18}}& frac{-1}{sqrt{18}} & frac{4} {sqrt{18}} frac{2}{3}&frac{-2}{3} &frac{1}{3} end{bmatrix}

アプリケーション

  • 擬似逆関数の計算: 擬似逆行列またはムーア・ペンローズ逆行列は、可逆でない可能性がある逆行列 (低ランク行列など) を一般化したものです。行列が可逆である場合、その逆行列は擬似逆行列と等しくなりますが、可逆でない行列には擬似逆行列が存在します。それはAで示されます+
Suppose, we need to calculate the pseudo-inverse of a matrix M: Then, the SVD of M can be given as: Multiply both sides by M^{-1}.Multiply both side by V:Multiply by W^{-1}Since the W is the singular matrix, the inverse of W  is Multiply by>

上の方程式は擬似逆関数を与えます。

一連の同次線形方程式を解く (Mx =b): b=0 の場合、SVD を計算し、V の任意の列を取得します。T特異値に関連付けられている ( ) 0 に等しい。

If , Multiply by>

擬似逆関数から、次のことがわかります。 M^{-1} = V W^{-1} U^{T}

Windows 7 はいつ登場しましたか

したがって、

x = V W^{-1} U^{T} b

  • ランク、範囲、およびヌルスペース:
    • 行列 M のランクは、SVD から非ゼロの特異値の数によって計算できます。
    • 行列 M の範囲は、非ゼロ特異値に対応する U の左特異ベクトルです。
    • 行列 M のヌル空間は、ゼロ化された特異値に対応する V の右特異ベクトルです。

M = U W V^{T}

  • カーブフィッティングの問題: 特異値分解を使用すると、最小二乗誤差を最小限に抑えることができます。擬似逆関数を使用して近似します。
  • 上記以外にも、特異値分解や擬似逆変換はデジタル信号処理や画像処理にも利用できます。

実装:

このコードでは、Numpy と Scipy を使用して特異値分解を計算してみます。 SVD を計算し、擬似逆関数も実行します。最終的には、画像の圧縮に SVD を適用できます。

Python3

# Imports> from> skimage.color>import> rgb2gray> from> skimage>import> data> import> matplotlib.pyplot as plt> import> numpy as np> from> scipy.linalg>import> svd> '''> Singular Value Decomposition> '''> # define a matrix> X>=> np.array([[>3>,>3>,>2>], [>2>,>3>,>->2>]])> print>(X)> # perform SVD> U, singular, V_transpose>=> svd(X)> # print different components> print>(>'U: '>, U)> print>(>'Singular array'>, singular)> print>(>'V^{T}'>, V_transpose)> '''> Calculate Pseudo inverse> '''> # inverse of singular matrix is just the reciprocal of each element> singular_inv>=> 1.0> /> singular> # create m x n matrix of zeroes and put singular values in it> s_inv>=> np.zeros(X.shape)> s_inv[>0>][>0>]>=> singular_inv[>0>]> s_inv[>1>][>1>]>=> singular_inv[>1>]> # calculate pseudoinverse> M>=> np.dot(np.dot(V_transpose.T, s_inv.T), U.T)> print>(M)> '''> SVD on image compression> '''> cat>=> data.chelsea()> plt.imshow(cat)> # convert to grayscale> gray_cat>=> rgb2gray(cat)> # calculate the SVD and plot the image> U, S, V_T>=> svd(gray_cat, full_matrices>=>False>)> S>=> np.diag(S)> fig, ax>=> plt.subplots(>5>,>2>, figsize>=>(>8>,>20>))> curr_fig>=> 0> for> r>in> [>5>,>10>,>70>,>100>,>200>]:> >cat_approx>=> U[:, :r] @ S[>0>:r, :r] @ V_T[:r, :]> >ax[curr_fig][>0>].imshow(cat_approx, cmap>=>'gray'>)> >ax[curr_fig][>0>].set_title(>'k = '>+>str>(r))> >ax[curr_fig,>0>].axis(>'off'>)> >ax[curr_fig][>1>].set_title(>'Original Image'>)> >ax[curr_fig][>1>].imshow(gray_cat, cmap>=>'gray'>)> >ax[curr_fig,>1>].axis(>'off'>)> >curr_fig>+>=> 1> plt.show()>
>
>

出力:

[[ 3 3 2]  [ 2 3 -2]] --------------------------- U: [[-0.7815437 -0.6238505]  [-0.6238505 0.7815437]] --------------------------- Singular array [5.54801894 2.86696457] --------------------------- V^{T} [[-0.64749817 -0.7599438 -0.05684667]  [-0.10759258 0.16501062 -0.9804057 ]  [-0.75443354 0.62869461 0.18860838]] -------------------------- # Inverse  array([[ 0.11462451, 0.04347826],  [ 0.07114625, 0.13043478],  [ 0.22134387, -0.26086957]]) --------------------------->

オリジナルと SVD の k イメージの比較