Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

nnmf

非負値行列因子分解

説明

[W,H] = nnmf(A,k) は、n 行 m 列の行列 A を非負の因子 W (n 行 k 列) と H (k 行 m 列) に分解します。因子分解は正確ではなく、W*HA への低ランク近似になります。因子 WH は、AW*H の間の平方根平均二乗残差 D を最小化します。

D = norm(A - W*H,'fro')/sqrt(n*m)

因子分解は、WH に対するランダムな初期値で始まる反復アルゴリズムを使用します。平方根平均二乗残差 D は局所的最小値をもつ場合があるため、因子分解を繰り返すと、異なる WH が生じる可能性があります。アルゴリズムは k よりも低ランクの解に収束する場合があり、これは結果が最適解ではないことを示します。

[W,H] = nnmf(A,k,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して因子分解を変更します。たとえば、'Replicates' を 1 より大きい整数値に設定することで、因子分解の繰り返しを要求できます。

[W,H,D] = nnmf(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、平方根平均二乗残差 D も返します。

すべて折りたたむ

標本データを読み込みます。

load fisheriris

フィッシャーのアヤメのデータで 4 つの変数の測定値について非負のランク 2 の近似を計算します。

rng(1) % For reproducibility
[W,H] = nnmf(meas,2);
H
H = 2×4

    0.6945    0.2856    0.6220    0.2218
    0.8020    0.5683    0.1834    0.0149

meas の 1 番目と 3 番目の変数 (がく片の長さと花弁の長さ。係数はそれぞれ 0.6945 と 0.6220) は、W の 1 番目の列に比較的大きな重みを与えます。meas の 1 番目と 2 番目の変数 (がく片の長さと幅。係数はそれぞれ 0.8020 と 0.5683) は、W の 2 番目の列に比較的大きな重みを与えます。

W の列空間で meas のデータおよび変数の biplot を作成します。

biplot(H','Scores',W,'VarLabels',{'sl','sw','pl','pw'});
axis([0 1.1 0 1.1])
xlabel('Column 1')
ylabel('Column 2')

Figure contains an axes. The axes contains 163 objects of type line, text.

ランク 20 の乱数の配列 X から開始し、乗法アルゴリズムを使用して、いくつかの反復において、2 ~ 3 回の反復を試行します。

rng default % For reproducibility
X = rand(100,20)*rand(20,50);
opt = statset('MaxIter',5,'Display','final');
[W0,H0] = nnmf(X,5,'Replicates',10,...
                   'Options',opt,...
                   'Algorithm','mult');
    rep	   iteration	   rms resid	  |delta x|
      1	       5	    0.560887	   0.0245182
      2	       5	     0.66418	   0.0364471
      3	       5	    0.609125	   0.0358355
      4	       5	    0.608894	   0.0415491
      5	       5	    0.619291	   0.0455135
      6	       5	    0.621549	   0.0299965
      7	       5	    0.640549	   0.0438758
      8	       5	    0.673015	   0.0366856
      9	       5	    0.606835	   0.0318931
     10	       5	    0.633526	   0.0319591
Final root mean square residual = 0.560887

交互最小二乗を使用して、これらの最もよい結果からさらに反復を続けます。

opt = statset('Maxiter',1000,'Display','final');
[W,H] = nnmf(X,5,'W0',W0,'H0',H0,...
                 'Options',opt,...
                 'Algorithm','als');
    rep	   iteration	   rms resid	  |delta x|
      1	      24	    0.257336	  0.00271859
Final root mean square residual = 0.257336

入力引数

すべて折りたたむ

因子分解する行列。実数行列として指定します。

例: rand(20,30)

データ型: single | double

因子のランク。正の整数として指定します。生成される因子 WH は、それぞれ k 個の列と行をもちます。

例: 3

データ型: single | double

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: [W,H] = nnmf(A,k,'Algorithm','mult','Replicates',10) は、乗法更新アルゴリズムと 10 回の反復を選択し、結果を改善します。

因子分解アルゴリズム。'Algorithm''als' (交互最小二乗) または 'mult' (乗法更新アルゴリズム) で構成されるコンマ区切りのペアとして指定します。

通常、'als' アルゴリズムは安定しており、少ない反復で収束します。各反復には時間がかかります。そのため、既定の最大値は 50 であり、通常は内部テストで満足できる結果が得られます。

通常、'mult' アルゴリズムは反復が高速で、多くの反復が必要です。既定の最大値は 100 です。このアルゴリズムは開始値の影響を受けやすい傾向があるため、複数の反復を実行することから多くのメリットが得られる可能性があります。

例: 'Algorithm','mult'

データ型: char | string

W の初期値。'W0' と n 行 k 列の行列で構成されるコンマ区切りのペアとして指定します。n は A の行数で、knnmf の 2 番目の入力引数です。

データ型: single | double

H の初期値。'H0'k 行 m 列の行列で構成されるコンマ区切りのペアとして指定します。knnmf の 2 番目の入力引数で、m は A の列数です。

データ型: single | double

アルゴリズム オプション。'Options' と、関数 statset によって返される構造体で構成されるコンマ区切りのペアとして指定します。nnmf はオプション構造体の以下のフィールドを使用します。

フィールド説明
Display反復表示のレベル
  • 'off' (既定値) — 表示しません

  • 'final' — 最終結果を表示します

  • 'iter' — 中間結果を反復表示します

MaxIter最大反復回数正の整数。既定は、'als' アルゴリズムが 50 で、'mult' アルゴリズムが 100 です。最適化設定と異なり、反復が MaxIter の回数に達すると収束として扱われます。
TolFun残差のサイズが変化したときの終了許容誤差非負の値。既定の設定は 1e-4 です。
TolXW および H の要素に相対的な変化があったときの終了許容誤差非負の値。既定の設定は 1e-4 です。
UseParallel並列計算の指示論理値。既定の false は並列計算しないことを示し、true は並列計算することを示します。並列計算には Parallel Computing Toolbox™ のライセンスが必要です。
UseSubstreams並列計算時の再現性のタイプ
  • false (既定) — 再現性のある計算を行わない

  • 'mlfg6331_64'

  • 'mrg32k3a'

詳細については、並列統計計算での再現性を参照してください。

StreamsRandStream オブジェクトまたはそのようなオブジェクトの cell 配列
  • Streams を指定しないと、nnmf には既定のストリームが使用されます。

  • UseParalleltrue で、UseSubstreamsfalse の場合は、並列プールと同じサイズの RandStream オブジェクトの cell 配列を指定します。それ以外の場合は、単一の RandStream オブジェクトを指定します。

例: 'Options',statset('Display','iter','MaxIter',50)

データ型: struct

因子分解を繰り返す回数。'Replicates' と正の整数で構成されるコンマ区切りのペアとして指定します。このアルゴリズムは、各反復において WH に新しいランダムな開始値を選択します。ただし、'W0''H0' を指定するときの最初の反復時は除きます。1 より大きい値を指定する場合、Algorithm'mult' に設定することで、より良い結果を得ることができます。アルゴリズムの変更を参照してください。

例: 10

データ型: single | double

出力引数

すべて折りたたむ

A の非負の左因子。n 行 k 列の行列として返されます。n は A の行数で、knnmf の 2 番目の入力引数です。

WH は、H の行が単位長さをもつように正規化されます。W の列は、長さの減少で順序付けされます。

A の非負の右因子。k 行 m 列の行列として返されます。knnmf の 2 番目の入力引数で、m は A の列数です。

WH は、H の行が単位長さをもつように正規化されます。W の列は、長さの減少で順序付けされます。

平方根平均二乗残差。非負のスカラーとして返されます。

D = norm(A - W*H,'fro')/sqrt(n*m)

参照

[1] Berry, Michael W., Murray Browne, Amy N. Langville, V. Paul Pauca, and Robert J. Plemmons. “Algorithms and Applications for Approximate Nonnegative Matrix Factorization.” Computational Statistics & Data Analysis 52, no. 1 (September 2007): 155–73. https://doi.org/10.1016/j.csda.2006.11.006.

拡張機能

R2008a で導入