💬

線形モデルの逆解析 ー SVDを用いた低ランク近似

1 min read

逆問題では観測誤差により逆過程で求めた解が大きくばらつく誤差鋭敏性が起きます。
誤差鋭敏性を抑える手法として特異値分解(Singular Value Decomposition; SVD)を用いた低ランク近似手法の説明と実装方法を紹介します。

特異値と誤差鋭敏性の関係

SVDは行列分解の一手法です。正方行列に限らず任意の形の行列を分解できます。 行列MMの入力空間の正規直交基底を表す右特異行列VMの出力空間の正規直交基底を表す左特異行列Uと入力成分がそれぞれ何倍されて出力されるかを表す特異値行列\Sigmaに分解されます。

SVDは行列Mが右特異ベクトルで表せる固有ベクトルに対してどれだけ回転と伸長させるかを表現しています。
逆解析は出力空間上の観測値ベクトルの逆像を求めることですが、観測誤差は実数空間上に任意のベクトルをとるため逆像は入力空間からはみ出してしまいます。
特異値が小さな特異ベクトルでは出力空間上の観測誤差に特異値の逆数が掛け合わされるため、解が大きくばらついてしまいます。
これが誤差鋭敏性です。
観測誤差を0にすれば誤差鋭敏性は起きませんが現実的に不可能です。
誤差鋭敏性は小さな特異値を削除する低ランク近似、あるいは大きくするチホノフ正則化により抑えられます。
ちなみに順過程で逆解析すると特異値の逆数が掛け合わされないため誤差鋭敏性は生じません。
計算量が大きくても構わないのであればグリッドサーチで逆解析するのが正確です。

SVDを用いた低ランク近似

偏回帰係数Aの小さな特異値成分を打ち切り、大きな特異値成分のみで行列を表現します。ただし行列Aのランクが小さい場合は特異ベクトルの持つ情報量が大きいので削除後の行列A_rAと乖離する恐れがあるので注意が必要です。

A = U\Sigma V^T
A = \sum_{k}^{} \mu_k u_k v_k^T
A_r = \sum_{k}^{r} \mu_k u_k v_k^T
A_r^† = \sum_{k}^{r} \frac{1}{\mu_k} v_k u_k^T

AをSVDして0.01以下の特異値ベクトルを除去します。

u, s, vh = np.linalg.svd(A)
# 0.01以上のランクを求めます。
r = np.linalg.matrix_rank(np.diag(s), tol=0.01)
ur = u[:, r]
sr = s[:r]
vhr = vh[:r, :]
# 低ランク近似をした行列
Ar = np.matmul(ur, np.multiply(sr[..., np.newaxis], vhr))
# 低ランク近似をした一般逆行列
Ard = np.matmul(vhr.T, np.multiply(1/sr[..., np.newaxis], ur_T))

観測値yの原因Xは以下で求められます。

X = A_r^† y

まとめ

SVDを用いた低ランク近似手法を紹介しました。低ランク近似は小さな特異値成分をバッサリ切れるのがメリットです。一方で基準が明確でないため切り過ぎてしまう、あるいは足りないことがあります。なので低ランク近似で特異値が小さすぎる成分を粗く切っておき、次に紹介するチホノフ正則化で微調整をするとうまくいきます。