39

私は最近、レコメンデーションエンジンに興味があり、この分野で自分自身を向上させたいと思っています。私は現在、「集合知プログラミング」を読んでいます。これは、オライリーからのこの主題に関する最高の本だと思います。しかし、エンジンを実装する方法はわかりません。「わからない」とは、「どうやって始めたらいいのかわからない」という意味です。Last.fmのようなプロジェクトを考えています。

  1. どこで(データベース側またはバックエンド側で実装する必要があります)レコメンデーションエンジンの作成を開始しますか?
  2. どのレベルのデータベース知識が必要になりますか?
  3. ヘルプやリソースに使用できるオープンソースのものはありますか?
  4. 私がしなければならない最初のステップは何ですか?
4

5 に答える 5

27

推奨事項の表示は、次の 2 つの主要なセクションに分けることができます。

  1. 特徴抽出
  2. おすすめ

特徴抽出は、推奨されるオブジェクトに非常に固有です。たとえば、音楽の場合、オブジェクトのいくつかの特徴は、曲の周波数応答、パワー、ジャンルなどです。ユーザーの特徴は、年齢、場所などです。次に、各ユーザーのベクトルを作成し、関心のあるさまざまな機能に対応するベクトルのさまざまな要素を持つ歌。

実際の推奨事項を実行するには、よく考えられた特徴ベクトルのみが必要です。適切な機能を選択しないと、レコメンデーション エンジンが失敗することに注意してください。これは、私の年齢に基づいて私の性別を教えてくださいと頼んでいるようなものです. もちろん、私の年齢から多少の情報が得られるかもしれませんが、より良い質問を想像できると思います。とにかく、各ユーザーと曲の特徴ベクトルを取得したら、レコメンデーション エンジンをトレーニングする必要があります。これを行う最善の方法は、大勢のユーザーに人口統計テストを受けてもらい、彼らが好きな特定の曲を教えてもらうことだと思います. この時点で、必要な情報はすべて揃っています。あなたの仕事は、あなたが持っている情報で決定の境界線を引くことです。簡単な例を考えてみましょう。ユーザーが AC/DC の「Back in Black」を好むかどうかを予測したい 年齢と性別に基づいています。100 個のデータ ポイントを示すグラフを想像してください。x 軸は年齢、y 軸は性別 (1 は男性、2 は女性) です。黒いマークはユーザーがその曲を気に入っていることを示し、赤いマークはその曲を気に入っていないことを示します。私の推測では、このグラフには、12 歳から 37 歳の男性のユーザーに対応する多くの黒いマークがあり、残りのマークは赤である可能性があります。そのため、決定境界を手動で選択する場合、この領域の周りに黒いマークの大部分を保持する長方形になります。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれたら、グラフにプロットして、そのボックスに収まるかどうかを尋ねるだけでよいからです。Y 軸は性別 (1 は男性、2 は女性) です。黒いマークはユーザーがその曲を気に入っていることを示し、赤いマークはその曲を気に入っていないことを示します。私の推測では、このグラフには、12 歳から 37 歳の男性のユーザーに対応する多くの黒いマークがあり、残りのマークは赤である可能性があります。そのため、決定境界を手動で選択する場合、この領域の周りに黒いマークの大部分を保持する長方形になります。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれたら、グラフにプロットして、そのボックスに収まるかどうかを尋ねるだけでよいからです。Y 軸は性別 (1 は男性、2 は女性) です。黒いマークはユーザーがその曲を気に入っていることを示し、赤いマークはその曲を気に入っていないことを示します。私の推測では、このグラフには、12 歳から 37 歳の男性のユーザーに対応する多くの黒いマークがあり、残りのマークは赤である可能性があります。そのため、決定境界を手動で選択する場合、この領域の周りに黒いマークの大部分を保持する長方形になります。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれたら、グラフにプロットして、そのボックスに収まるかどうかを尋ねるだけでよいからです。私の推測では、このグラフには、12 歳から 37 歳の男性のユーザーに対応する多くの黒いマークがあり、残りのマークは赤である可能性があります。そのため、決定境界を手動で選択する場合、この領域の周りに黒いマークの大部分を保持する長方形になります。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれたら、グラフにプロットして、そのボックスに収まるかどうかを尋ねるだけでよいからです。私の推測では、このグラフには、12 歳から 37 歳の男性のユーザーに対応する多くの黒いマークがあり、残りのマークは赤である可能性があります。そのため、決定境界を手動で選択する場合、この領域の周りに黒いマークの大部分を保持する長方形になります。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれたら、グラフにプロットして、そのボックスに収まるかどうかを尋ねるだけでよいからです。

したがって、ここで難しいのは決定境界を見つけることです。良いニュースは、その方法を知る必要がないことです。いくつかの一般的なツールの使用方法を知っている必要があります。ニューラル ネットワーク、サポート ベクター マシン、線形分類器などの使用を調べることができます。ここでも、有名な名前にだまされてはいけません。ほとんどの人は、これらのものが実際に何をしているのかをあなたに伝えることができません. 彼らは物事をプラグインして結果を得る方法を知っているだけです.

少し遅れていることは承知していますが、これがこのスレッドに出くわした人の助けになることを願っています.

于 2010-09-17T21:05:52.363 に答える
24

私は自分でビデオポータル用に1つ作成しました。私が持っていた主なアイデアは、すべてに関するデータを収集することでした。

  • 誰がビデオをアップロードしましたか?
  • 誰がビデオにコメントしましたか?
  • どのタグが作成されましたか?
  • 誰がビデオを訪れましたか?(匿名の訪問者も追跡します)
  • 誰がビデオを好きでしたか?
  • 誰がビデオを評価しましたか?
  • ビデオはどのチャンネルに割り当てられましたか?
  • タイトル、説明、タグ、チャネル、コメントのテキストストリームは、各データソースに重点を置くフルテキストインデクサーによって収集されます。

次に、上記の各ポイントの(id、weight)タプルのリストを返す関数を作成しました。限られた量の動画(たとえば、最後の50)のみを考慮するものもあれば、評価、タグ数(より頻繁にタグ付けされる=表現力が低い)などによって重みを変更するものもあります。次のリストを返す関数があります。

  • 全文検索による類似の動画
  • 同じユーザーがアップロードした動画
  • これらのコメントからのユーザーがコメントした他のビデオ
  • これらのお気に入りのユーザーがお気に入りに追加した他の動画
  • これらの評価の評価者が評価した他の動画(加重)
  • 同じチャンネルの他の動画
  • 同じタグを持つ他の動画(タグの「表現力」で重み付け)
  • このビデオを再生した人が再生した他のビデオ(XY最新の再生)
  • コメント全文による同様のビデオ
  • タイトル全文による類似のビデオ
  • 説明全文による類似のビデオ
  • タグ全文による類似の動画

これらはすべて、ビデオIDで重みを合計し、重みで並べ替えるだけで1つのリストにまとめられます。これは現在、約1000本のビデオでかなりうまく機能します。ただし、これを高速化するには、バックグラウンド処理または極端なキャッシュを実行する必要があります。

私はこれをすぐに一般的なレコメンデーションエンジンまたは類似性計算機に減らして、rails/activerecordプラグインとしてリリースできることを望んでいます。現在、それはまだ私のプロジェクトのよく統合された部分です。

ちょっとしたヒントを与えるために、ルビーコードでは次のようになります。

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

他の人がそのようなアルゴリズムをどのように解決するかに興味があります。

于 2009-09-10T21:52:03.460 に答える
3

これは本当にあなたが尋ねている非常に大きな質問なので、詳細な回答を提供できたとしても、時間がないのではないかと思います....しかし、提案があります.Greg Lindenのブログと彼の論文を見てください.アイテムベースの協調フィルタリングについて。Greg は、商品ベースのアプローチを使用して、Amazon でレコメンデーション エンジンのアイデアを実装しました。

ブログ: http://glinden.blogspot.com/ 論文: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 (申し訳ありませんが、読むにはログインする必要があります完全に、あなたは CS の学生なので、これは可能なはずです)。

編集Infer.Net を見ることもできます。映画データの推奨システムを構築する例が含まれています。

于 2009-10-19T12:38:45.077 に答える
3

Hadoop で実装するための協調フィルタリング ベースのレコメンデーション エンジンに関する 2 部構成のブログがあります。

http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/

http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/

オープン ソース プロジェクトの github リポジトリは次のとおりです https://github.com/pranab/sifarish

お気に召しましたらご自由にお使いください。

于 2011-01-20T21:36:06.127 に答える
2

オープンソース(AGPLv3ライセンス)のレコメンデーションエンジンの例が、Filmaster.comによって最近公開されました。これはC++で記述されており、Netflixチャレンジの一部として作成されたホワイトペーパーのベストプラクティスを使用しています。それに関する記事はhttp://polishlinux.org/gnu/open-source-film-recommendation-engine/ にあり、コードはここにあります:http: //bitbucket.org/filmaster/filmaster-test/src /tip/count_recommendations.cpp

于 2010-05-28T07:56:29.727 に答える