非負値行列因子分解 (NMF) の解説とNumPyでの実装

目次

  1. 非負値行列因子分解 (NMF) とは
  2. NMFの応用例
  3. NumPyを使ったNMFの実装方法
  4. コード例: NumPyでのNMF実装
  5. まとめと参考文献

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

非負値行列因子分解(Non-negative Matrix Factorization, NMF)は、全ての要素が非負であるような行列を二つの非負行列に分解する手法です。この手法は、特に画像認識やテキストマイニングなど、データが自然に非負である場合に有用です。

具体的には、ある非負行列 V を二つの低階数な非負行列 W, H へと分解します。これを式で表すと以下のようになります。

V ≈ W * H

ここでは V の各要素が W および H の積から近似的に得られます。この性質を利用して、元データから新たな特徴やパターンを抽出することが可能です。

2. NMFの応用例

  • 画像認識: 各ピクセル点が明るさまたは色情報(RGB)を持ち、これら全てが自然に非負値です。したがって、NMF を使用して画像データから意味あるパターンや構造を抽出することが可能です。
  • テキストマイニング: テキストデータでは、「単語」x「ドキュメント」マトリックス(各ドキュメント中で各単語が何回出現したか示すもの)等作成されます。これらも全て自然に非負値です。したがって NMF を使用して主題モデリング等を進めることも可能です。

3. NumPyを使ったNMFの実装方法

NMF のアルゴリズムは多岐にわたりますが、ここでは基本的な勾配降下法を用いた実装方法を説明します。

まず、初期の W, H をランダムに設定した後、以下の更新規則を用いて W と H を更新します。

W_ij = W_ij * (VHT)ij / (WHHT)ij H_ij = H_ij * (WTV)ij / (WTWH)ij

これらの更新規則はコスト関数(ここではフロベニウスノルム || V - WH ||)が減少する方向にパラメータを更新します。このアップデートは交互に行われ、一定のエポック数またはコスト関数が一定以下になるまで続けられます。

4. コード例: NumPyでのNMF実装

以下にNumPyを使った基本的なNMFの実装例を示します。

import numpy as np

def nmf(V, n_components, max_iter=100):
    """
    非負値行列因子分解(NMF)を行う関数
    V: 分解する行列
    n_components: 基底ベクトルの数
    max_iter: 最大反復回数
    """
    
    # 行列サイズと基底ベクトルの数からWとHを初期化(ランダム)
    W = np.abs(np.random.uniform(low=0.0, high=1.0, size=(V.shape[0], n_components)))
    H = np.abs(np.random.uniform(low=0.0, high=1.0, size=(n_components, V.shape[1])))

    for _ in range(max_iter):
        # 更新式に従ってWとHを更新
        WH = np.dot(W,H)
        W *= np.dot(V,H.T) / np.dot(WH,H.T)
        WH = np.dot(W,H)
        H *= np.dot(W.T,V) / np.dot(W.T,WH)

    return W,H

# 使用例:
V = abs(np.random.randn(10,10))
n_components = 5

W,H = nmf(V,n_components)

print("Original matrix:")
print(V)
print("Reconstructed matrix:")
print(np.dot(W,H))

5. まとめと参考文献

以上が非負値行列因子分解(NMF)およびそのNumPyでの実装方法です。NMFは非負データから特徴やパターン抽出する際に有用な手法であり、さまざまな応用例が存在します。

しかし、この実装は最も基本的なものであり、実際には初期値の設定や収束条件等を工夫に設定することで、より効率的な結果を得ることが可能です。また、今回は簡易的な勾配降下法を使用しましたが、より高度な最適化アルゴリズムを用いることもあります。

NMFはその特性上、データのスパース性や非負性を活かすための手法であり、これらの特性が強く表れるデータ分析において有用です。しかし一方でNMFは解が一意でない(初期値によって異なる解が得られる)という問題も持っています。これは初期値選択の工夫や複数回の実行と結果比較等により対策可能です。

本記事では基本的な説明と実装方法を示しましたが、更に詳細や応用例を学びたい方は以下の参考文献もご覧ください。

  • Lee, D. D., & Seung, H. S. (1999). Learning the parts of objects by non-negative matrix factorization. Nature, 401(6755), 788-791.
  • Lee, D. D., & Seung, H. S. (2001). Algorithms for non-negative matrix factorization.

以上で非負値行列因子分解(NMF)およびそのNumPyでの実装方法についての説明を終わります。この記事が皆さんの学習に役立つことを願っています。