大規模な疎行列 (1% 未満の値 > 0) での非負行列因数分解に Scikit-learn (v 0.15.2) を使用します。行列のゼロ以外の値でのみエラーを最小化して (つまり、ゼロであるエントリのエラーを計算しない)、スパース性を優先して因子を見つけたいと考えています。私がしようとしていることに何か問題があるかどうかはわかりません。scikit-learn パッケージの NMF と ProjectedGradientNMF は、以前はうまく機能していました。しかし、行列のサイズが大きくなると、因数分解が非常に遅くなるようです。
> 10 ^ 10 セルの行列について話しています。~10^7 セルのマトリックスの場合、実行時間は良好であることがわかりました。
使用したパラメーターは次のとおりですnmf_model = NMF(n_components = 100, init='nndsvd', random_state=0, tol = 0.01, sparseness='data')
。
わずかに異なるパラメーターを試してみると ( に変更init=random
)、次の警告が表示されます。警告の後、スクリプトの実行は停止します。
/lib/python2.7/site-packages/sklearn/decomposition/nmf.py:252: UserWarning: Iteration limit reached in nls subproblem.
warnings.warn("Iteration limit reached in nls subproblem.")
これを高速化し、上記の問題を解決する方法はありますか? numpy のスパース マトリックス (列と行のスパース) を使用してみましたが、驚くべきことに、より小さいマトリックス (~10^7 セル) で行ったテストでは遅くなります。
このような因数分解を複数回実行する必要があることを考えると (因子の理想的な数と k 分割交差検証を選択するために)、この問題を解決するためのより高速な方法が非常に望ましいです。
また、sklearn または Pyhon に基づいていないパッケージ/ツールの提案も受け付けています。パッケージ/ツールの選択に関する質問は推奨されないことは理解していますが、そのような特定のユースケースでは、現場の他の人がどのような手法を使用しているかを知っておくと非常に役立ちます.