1

私は MapReduce に比較的慣れていないので、次の問題が頭をよぎりました: MapReduce で完全な (つまり疎ではない) 距離行列をどのように計算できますか?

N 個のインスタンスを持つ 2D データセットがあり、そのようなポイント間のすべての可能な距離を評価し、それらをマトリックスに格納する必要があります。

私がこれまでに行ったことは、

  • Map にそのチャンクを取得させ、そのようなポイント間の距離を評価させます。結果のマトリックスは、いくつかの距離といくつかのゼロを含む NxN マトリックスになります。
  • Reduce はそのような行列を連結 (合計) し、空白を埋めます (つまり、チャンク内距離、まだゼロの要素)。

これはあまり効率的ではないと思います (特にメモリの観点から)。

誰でも私を啓発できますか?

更新:上記のコードで少し最適化を行いました。今

  • Map はそのチャンクを受け取り、NxN マトリックスを事前に割り当てずに、そのようなポイント間の距離を評価しますが、Nx3 マトリックスを事前に割り当てます (ポイント A の 1 番目の列、2 番目の列はポイント B、3 番目の列は dist(A,B) です)。
  • Reducer は、完全にゼロで満たされた NxN 行列を事前に割り当てます。Map によって計算された距離 (チャンク間) を埋めてから、空隙 (つまり、チャンク内の距離、まだゼロの要素) を埋めます。

マッパーは NxN マトリックス全体を構築する必要がないため、より良いソリューションであることは間違いありませんが、それでも、より適切に実行できると思います。

4

1 に答える 1

0

それが私が行った方法です: Map タスクは、特定のインスタンスjと他のすべてのインスタンスの間の距離を単純に評価します。Reducer は、そのような距離をベクトルに連結し、ディスクに書き込みます。そのようなレコードは実際にjは行列の th 行です。これはすべてのインスタンスに対して行われ、ディスクに書き込まれたすべてのレコードが連結されます。

于 2016-02-09T20:53:04.383 に答える