6

大規模な疎行列 (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 に基づいていないパッケージ/ツールの提案も受け付けています。パッケージ/ツールの選択に関する質問は推奨されないことは理解していますが、そのような特定のユースケースでは、現場の他の人がどのような手法を使用しているかを知っておくと非常に役立ちます.

4

3 に答える 3

2

おそらく、最初の問題が何であるかについていくつかの言葉があれば、より良い答えを出すことができるかもしれません.

非常に大きな行列での行列因数分解は、問題の性質上、常に遅くなります。

提案: < 20 に減らすn_componentsと、いくらか速度が上がります。ただし、行列のサイズを制限することによってのみ、実際に速度を向上させることができます。あなたが説明したような行列を使用すると、用語頻度行列を因数分解しようとしていると考えることができます。その場合は、scikit-learn のベクトル化関数を使用して、行列のサイズを制限することができます。それらのほとんどにはmax_featuresパラメータがあります。例:

vectorizer = TfidfVectorizer(
    max_features=10000,
    ngram_range=(1,2))
tfidf = vectorizer.fit_transform(data)

これにより、問題解決が大幅にスピードアップします。

私が完全に間違っていて、これが用語の頻度の問題ではない場合でも、因数分解しようとしている初期行列を制限する方法を検討します。

于 2015-07-23T13:14:23.183 に答える
2

NMF に関する最近の手法について説明している次の記事を参照してください。 http://www.cc.gatech.edu/~hpark/papers/nmf_blockpivot.pdf

アイデアは、因数分解のゼロ以外のエントリでのみ動作することであり、特に関連する行列が非常にまばらな場合に計算時間を短縮します。

また、同じ記事の著者の 1 人が、記事で言及されているものを含め、github で NMF 実装を作成しました。リンクは次のとおりです。https://github.com/kimjingu/nonnegfac-python

それが役立つことを願っています。

于 2015-12-14T13:33:34.803 に答える