私は実際のユーザーデータを使って映画推薦システムを実装しています。協調フィルタリング方式を採用する予定でした。ただし、この種の方法には通常、ユーザーに評価された映画を保存する巨大なマトリックスが含まれます。私は1万本以上の映画と10万人のユーザーを持っているので。このような巨大なスパース行列を作成することは不可能です。こんなに大量のデータを使って、どうやって協調フィルタリングを実装しているのだろうか。ありがとう!
2 に答える
分散コンピューティングのフレームワークをお勧めしますが、それでも1台のマシンで簡単に処理できる規模だと思います。
Apache Mahoutには、1台のマシンで拡張できるように設計されたTaste協調フィルタリングライブラリが含まれています。のモデル-何、1000万のデータポイント?-正常なヒープサイズでメモリに収まる必要があります。GenericItemBasedRecommender
とのようなものを見てくださいFileDataModel
。
(MahoutにもHadoopに基づく分散実装がありますが、これはまだ必要ないと思います。)
私はその作者ですが、その後、大規模な推奨者をMyrrixとして商品化するようになりました。また、無料のオープンソースであるスタンドアロンのシングルマシンバージョンも含まれています。また、1台のマシンでこの量のデータを簡単に処理できます。たとえば、これはこの例で使用されているものよりも小さいデータセットです。Myrrixには分散実装もあります。
GraphLabのように、上記以外にも高速分散実装があります。MyMediaLiteのように、他の非分散フレームワークもおそらく十分に高速です。
これらのいずれかを使用することをお勧めします。または、実際に「どのように」発生するのか疑問に思っている場合は、ソースコードをチェックして、データ表現を確認してください。
データの保存にマトリックス形式を使用しませんでした。代わりに、C ++を使用して、必要な変数と配列を含むUser、Rating、Itemなどの構造体を作成します。これにより、アルゴリズムが複雑になる可能性がありますが、メモリを効率的に節約できます。