2016-10-26 14 views
6

Sparkには、Spark MLlibとSpark MLの2つの機械学習ライブラリがあります。それらは実装されているものといくらか重複していますが、私が理解するように(Sparkエコシステム全体に新しい人物として)、Spark MLは行く方法であり、MLlibは主に下位互換性のために使われています。Spark MLlibとSpark MLのPCA

私の質問は非常に具体的で、PCAに関連しています。 MLlib実装で列数の制限があるように思わ

spark.mllibはスキニートールおよび行指向の形式で格納されているマトリックス及び任意のベクトルのPCAをサポートします。あなたはJavaコードの例を見れば

また、もあり、この

列の数は、例えば、小型でなければならず、一方1000未満

あなたがMLのドキュメントを見ると、何の制限もありません。

私の質問は - この制限はSpark MLにも存在するのですか?もしそうなら、なぜ制限があり、列の数が多い場合でもこの実装を使用できる回避策がありますか?

+0

興味深い質問です。私は、他の多くの不一致をmllibのドキュメントで見てきました。 – Rob

答えて

1

PCAは、データを表すことのできる独立したランダム変数のセットを見つけ出し、保持する分散の量に対して降順でソートします。

これらの変数は、データ点を特定の直交部分空間に投影することによって見つけることができます。あなたの(平均中心の)データ行列がXである場合、この部分空間はX^TXの固有ベクトルから構成されます。

Xが大きい場合には、寸法N X Dで言う、あなたは、すべての結果を加算する、自身が行列の各行の外積を計算することによりX^TXを計算することができます。これはもちろん、dが小さい場合でも、単純なマップ削減手順に従うことになります。どれくらい大きくてもnです。これは、各行の外積がそれ自体でdxdの行列であり、各作業者がメインメモリで操作する必要があるからです。そのため、多くの列を処理するときに問題に遭遇することがあります。

列数が多い場合(行数がそれほど多くない場合)は、実際にPCAを計算できます。あなたの(平均中心の)転置データ行列のSVDを計算し、それに結果として得られる固有ベクトルと固有値の対角行列の逆数とを乗算するだけです。あなたの直交部分空間があります。

ボトムライン:spark.mlの実装が毎回最初のアプローチに従う場合、制限は同じにする必要があります。入力データセットのサイズをチェックして2番目のアプローチを行うかどうかを判断すると、行数が少ない場合に多数の列を扱うことに問題は発生しません。

これに関係なく、作業者のメモリ容量によって制限が課されるため、一部のユーザーには適用されない制限を提示するのではなく、ユーザーが天井にぶつかることがあります。それが新しい文書の制限について言及しないことにした理由かもしれません。

更新:ソースコードは、入力の次元性に関係なく、毎回最初のアプローチをとっていることを示しています。実際の制限は65535で、10,000で警告を出します。

+0

あなたの答えをありがとう、私の遅い応答にごめんなさい。結局のところ、彼らはどちらのアプローチが実装されたのか、両方のアプローチか、最初のアプローチのみが(限界が存在するのか)知っているでしょうか?なぜ私は間違っていないとすれば、実行者のメモリに収まるはずの64MB((8 * 10^3)^ 2,8倍のデータ)のようなものです。 – Marko

+1

コードを見て啓発です。 MLLibでは、行の外積、すなわち第1のアプローチに対してBLAS演算を用いてX^T Xを計算する。私は第二のアプローチを採用するためにチェックを行っているという気づきは見ません。ただし、行列の上半分(対称)に必要な割り当てを計算できるようにするには、まず列数が65536未満であることを確認します。第2に、列の数が10,000未満であること。それ以外の場合は、必要なメモリに関する警告を出すだけです。 – broncoAbierto

+1

なぜ彼らはドキュメントで推奨された制限を1000に設定したのかというと、あまり厳格でなくても誰も問題を予期しないような多かれ少なかれ妥当な数字を選んだだけかもしれません。現時点では、どのような作業者でもこのような大きさの行列を取ることができますが、マップタスクが大きすぎるのを避けることをお勧めします。 – broncoAbierto

関連する問題