私は現在、同様のアイテムをグループ化するアプリケーションを開発しています。アイテム(ビデオなど)はユーザーが作成でき、属性は後で変更または拡張できます(新しいタグなど)。ほとんどの協調フィルタリングメカニズムのようにユーザーの好みに依存するのではなく、アイテムの属性(類似した長さ、類似した色、類似したタグのセットなど)に基づいてアイテムの類似性を比較したいと思います。計算は、2つの主な目的で必要です。x
特定のアイテムに類似したアイテムを提案することと、類似したアイテムのグループにクラスタリングすることです。
これまでの私のアプリケーションは非同期設計に従っており、このクラスタリングコンポーネントを可能な限り分離したいと考えています。新しいアイテムの作成または既存のアイテムの新しい属性の追加は、コンポーネントが消費できるイベントを公開することによってアドバタイズされます。
計算はベストエフォートで「スナップショット」で提供できます。つまり、結果の品質は最終的には向上しますが、特定の時点で可能な限り最高の結果が得られます。
そのため、私は現在、類似したアイテムとクラスターの両方を計算するための適切なアルゴリズムを探しています。重要な制約はスケーラビリティです。最初はアプリケーションが数千のアイテムを処理する必要がありますが、後で数百万のアイテムも処理できる可能性があります。もちろん、計算は追加のノードで実行されますが、アルゴリズム自体はスケーリングする必要があります。また、アルゴリズムがデータの部分的な変更に対してある種のインクリメンタルモードをサポートしていると便利です。
各アイテムを相互に比較し、数値の類似性を保存するという私の最初の考えは、少し粗雑に聞こえます。n*(n-1)/2
また、すべての類似性を保存するためのエントリが必要であり、変更または新しいアイテムがあると、最終的にn
類似性の計算が行われます。
前もって感謝します!
更新tl;dr
私が欲しいものを明確にするために、これが私のターゲットシナリオです:
- ユーザーがエントリを生成する(ドキュメントを考えてください)
- ユーザー編集エントリのメタデータ(タグを考えてください)
そして、これが私のシステムが提供するものです:
- 推奨事項としての特定のアイテムに類似したエントリのリスト
- 同様のエントリのクラスター
両方の計算は、以下に基づく必要があります。
- エントリのメタデータ/属性(つまり、同様のタグの使用)
- したがって、適切なメトリックを使用した2つのエントリの距離
- ユーザーの投票、設定、またはアクションに基づくものではありません(協調フィルタリングとは異なります)。ユーザーはエントリを作成して属性を変更できますが、計算ではアイテムとその属性のみが考慮され、関連付けられているユーザーは考慮されません(アイテムのみが存在し、ユーザーが存在しないシステムのように)。
理想的には、アルゴリズムは以下をサポートする必要があります。
- エントリの属性の永続的な変更
- 変更時に類似のエントリ/クラスターを段階的に計算する
- 規模
- 可能であれば、単純な距離テーブルよりも優れたもの(O(n²)スペースの複雑さのため)