非負値行列因子分解(NMF)による次元削減

非負値行列因子分解(NMF)とは?


非負値行列因子分解(NMF)は、与えられた非負値の行列を、複数の非負値行列の積に分解する手法です。NMF は、主にデータの次元削減や特徴抽出に使用されます。画像のピクセル値、音声信号の振幅、テキストデータの単語の出現頻度など多くの場合において非負性が保たれる分野で広く応用されています。

NMFはscikit-learnに実装されています。

こちらを利用してNMFを適用した次元削減を行ってみたいと思います。

import numpy as np
from sklearn.decomposition import NMF

V = np.random.rand(10, 20)

ダミーのデータ行列を作成します

model = NMF(n_components=5, init='random', random_state=42)
W = model.fit_transform(V)
H = model.components_

作成したダミー行列にNMFを適用してみます。

V_approx = np.dot(W, H)

print(np.linalg.norm(V - V_approx))

元の行列と近似された行列の差を計算してみます。

2.051565324711747

可視化

元の行列と近似された行列の差を可視化してみます。

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(V, cmap='viridis', aspect='auto')
plt.title('Original Matrix (V)')
plt.colorbar()

plt.subplot(1, 2, 2)
plt.imshow(V_approx, cmap='viridis', aspect='auto')
plt.title('Approximated Matrix (WH)')
plt.colorbar()

plt.figure(figsize=(4, 4))
plt.imshow(V - V_approx, cmap='bwr', aspect='auto')
plt.title('Difference (V - WH)')
plt.colorbar()
plt.show()