目次
はじめに
本ブログでは、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は非常に強力なツールであります。