2

私は現在、同様のアイテムをグループ化するアプリケーションを開発しています。アイテム(ビデオなど)はユーザーが作成でき、属性は後で変更または拡張できます(新しいタグなど)。ほとんどの協調フィルタリングメカニズムのようにユーザーの好みに依存するのではなく、アイテムの属性(類似した長さ、類似した色、類似したタグのセットなど)に基づいてアイテムの類似性を比較したいと思います。計算は、2つの主な目的で必要です。x特定のアイテムに類似したアイテムを提案することと、類似したアイテムのグループにクラスタリングすることです。

これまでの私のアプリケーションは非同期設計に従っており、このクラスタリングコンポーネントを可能な限り分離したいと考えています。新しいアイテムの作成または既存のアイテムの新しい属性の追加は、コンポーネントが消費できるイベントを公開することによってアドバタイズされます。

計算はベストエフォートで「スナップショット」で提供できます。つまり、結果の品質は最終的には向上しますが、特定の時点で可能な限り最高の結果が得られます。

そのため、私は現在、類似したアイテムとクラスターの両方を計算するための適切なアルゴリズムを探しています。重要な制約はスケーラビリティです。最初はアプリケーションが数千のアイテムを処理する必要がありますが、後で数百万のアイテムも処理できる可能性があります。もちろん、計算は追加のノードで実行されますが、アルゴリズム自体はスケーリングする必要があります。また、アルゴリズムがデータの部分的な変更に対してある種のインクリメンタルモードをサポートしていると便利です。

各アイテムを相互に比較し、数値の類似性を保存するという私の最初の考えは、少し粗雑に聞こえます。n*(n-1)/2また、すべての類似性を保存するためのエントリが必要であり、変更または新しいアイテムがあると、最終的にn類似性の計算が行われます。

前もって感謝します!

更新tl;dr

私が欲しいものを明確にするために、これが私のターゲットシナリオです:

  • ユーザーがエントリを生成する(ドキュメントを考えてください)
  • ユーザー編集エントリのメタデータ(タグを考えてください)

そして、これが私のシステムが提供するものです:

  • 推奨事項としての特定のアイテムに類似したエントリのリスト
  • 同様のエントリのクラスター

両方の計算は、以下に基づく必要があります。

  • エントリのメタデータ/属性(つまり、同様のタグの使用)
  • したがって、適切なメトリックを使用した2つのエントリの距離
  • ユーザーの投票、設定、またはアクションに基づくものではありません(協調フィルタリングとは異なります)。ユーザーはエントリを作成して属性を変更できますが、計算ではアイテムとその属性のみが考慮され、関連付けられているユーザーは考慮されません(アイテムのみが存在し、ユーザーが存在しないシステムのように)。

理想的には、アルゴリズムは以下をサポートする必要があります。

  • エントリの属性の永続的な変更
  • 変更時に類似のエントリ/クラスターを段階的に計算する
  • 規模
  • 可能であれば、単純な距離テーブルよりも優れたもの(O(n²)スペースの複雑さのため)
4

7 に答える 7

4

Instead of writing from scratch take a look at mahout.apache.org. It has the clustering algorithms you are looking for as well as the recommendation algorithms. It works alongside Hadoop, so you can scale it out easily.

What this will allow you to do is determine similar documents in a cluster based on your keywords and/or description of the video.

https://cwiki.apache.org/MAHOUT/k-means-clustering.html

has a quick tutorial about clustering of documents using a Reuters dataset. It is quite similar to what you are trying to achieve. Mahout includes recommendation algorithms such as slope one, user based, item based and is incredibly easy to extend. It also has some pretty useful clustering algorithms which support dimension reduction features. This is useful for you in case your matrix is sparse (that is, a lot of tags that have very few usage stats).

Also take a look at Lucene to use its tfidf features to cluster tags and documents. Also check Solr. Both are Apache projects.

于 2011-01-07T12:08:46.163 に答える
3

レコメンデーションアルゴリズムは、目的に対応するための標準的なアルゴリズムをリストしているため、非常に役立ちます。

更新しました:

あなたが見ているのは協調品質フィルタリングであり、協調フィルタリングだけでなく、紙へのリンクを添付していると思います。これがお役に立てば幸いです。

于 2010-12-28T16:14:41.673 に答える
3

K-meansクラスタリングはあなたが望むものかもしれません。

注意:

クラスターの数kは入力パラメーターです。kを不適切に選択すると、結果が悪くなる可能性があります...一部のデータセットでは非常にうまく機能しますが、他のデータセットでは無残に失敗します。

したがって、クラスターの数、タグの数、およびメトリックを考慮する必要があります。

StackOverflowの質問/タグ付き/k-meansも参照してください。

于 2011-01-05T11:45:07.137 に答える
2

http://taste.sourceforge.net/old.html

Tasteは、Java用の柔軟で高速な協調フィルタリングエンジンです。エンジンは、アイテムに対するユーザーの好み(「テイスト」)を取得し、他のアイテムの推定された好みを返します。たとえば、本やCDを販売しているサイトでは、Tasteを使用して、過去の購入データから、顧客がどのCDを聴きたいかを簡単に把握できます。

Tasteは、選択したアルゴリズムからカスタマイズされたレコメンダーシステムを構築できる豊富なコンポーネントセットを提供します。Tasteは、エンタープライズ対応になるように設計されています。パフォーマンス、スケーラビリティ、および柔軟性を考慮して設計されています。J2EEベースのアプリケーション用の標準EJBインターフェースをサポートしていますが、TasteはJava専用ではありません。WebサービスとHTTPを介してアプリケーションに推奨ロジックを公開する外部サーバーとして実行できます。

http://savannah.nongnu.org/projects/cofi/

現在、協調フィルタリングを使用したいプログラマーは、文献を読み、独自のアルゴリズムを実装する必要があります。多くの場合、プログラマーはおそらく独自のアルゴリズムを設計し、一般的に最適ではないアルゴリズムを作成します。研究からアプリケーションまで幅広いコンテキストで使用できる、すでにテストされ、文書化されたアルゴリズムの基盤を構築したいと考えています。指針となる原則は、デザインを薄くすることです。Cofiはすべての人にとってすべてのものになりたくありません。したがって、焦点は非常に数行のコードを提供することと、必要な接着剤を提供するためにプログラマーに依存することにあります。

ここにもう少し

于 2011-01-08T06:39:32.430 に答える
1

Before starting to implement, adapt or use existing library, make sure you know the domain; reading something like "Collective Intelligence in Action" is a good start.

于 2011-01-07T19:41:35.783 に答える
1

You want an item-based collaborative filtering rather than user-based. There are a number of algorithms for this floating around on Google. Item-based solutions always scale better than user-based solutions. Item based collaborative filtering in PHP has some easy-to-follow example code and fits what you're looking for:

于 2011-01-07T21:05:38.227 に答える
0

You have to decide what the similarity metric is based on the specifics of your product and your good sense. Is length of video important? If so it deserves high weight.

于 2011-03-14T04:45:40.537 に答える