NumPyで学ぶ特異値分解 (SVD)

目次

  1. はじめに
  2. 特異値分解 (SVD)とは?
  3. NumPyを使った特異値分解の基礎
  4. 特異値分解の応用例: 画像圧縮
  5. まとめ

はじめに

本ブログでは、NumPyを使用して特異値分解(Singular Value Decomposition, SVD)の概念とその応用について学んでいきます。

特異値分解 (SVD)とは?

特異値分解(Singular Value Decomposition, SVD)は、行列を3つの行列の積に因数分解する手法です...

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])
U, s, VT = np.linalg.svd(A)

print("U:
", U)
print("s:
", s)
print("VT:
", VT)

このコードでは、NumPyのlinalg.svd関数を使って行列A特異値分解しています。

NumPyを使った特異値分解の基礎

NumPyライブラリは、高速な数値計算線形代数演算が可能な機能を提供します。

import numpy as np

A = np.array([[1, 2], [3, 4], [5, 6]])
U, s, VT = np.linalg.svd(A)

# 特異値行列Σから対角成分以外を0で埋める
Sigma = np.zeros_like(A)
Sigma[:min(A.shape), :min(A.shape)] = np.diag(s)

reconstructed_A = U @ Sigma @ VT

このコードでは、与えられた行列Aから特異値行列Σおよび左右特異ベクトルUとVT(転置したV) を計算します。

申し訳ありませんが、先ほどのメッセージは途中で切れてしまいました。以下に続きを記述します。


特異値分解の応用例: 画像圧縮

さまざまな目的で利用されます。特異値分解は、画像圧縮における重要な手法の一つです。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

# 画像をグレースケールで読み込み、NumPy配列に変換
img = Image.open('your_image.jpg').convert('L')
img_array = np.array(img)

# SVDを実行
U, s, VT = np.linalg.svd(img_array)

# 最初のk個の特異値だけを保持(ここではk=50)
k = 50
reconstructed_img_array = U[:, :k] @ np.diag(s[:k]) @ VT[:k, :]

# 元の画像と再構成した画像を表示
plt.figure(figsize=(10,5))
plt.subplot(1, 2, 1)
plt.imshow(img_array, cmap='gray')
plt.title('Original image')
plt.subplot(1, 2, 2)
plt.imshow(reconstructed_img_array, cmap='gray')
plt.title(f'Reconstructed image (k={k})')

このコードでは、PythonのPILライブラリを使ってJPEG画像ファイルを読み込みます。

まとめ

今回はNumPyで特異値分解(SVD)を学び、その応用例として画像圧縮も試してみました。SVDは非常に強力なツールであります。