必要なのは、似たようなユーザーを自動的にグループ化するクラスタリング アルゴリズムです。直面している最初の問題は、ほとんどのクラスタリング アルゴリズムが、クラスタリングする項目がユークリッド空間の点として表現されることを期待していることです。あなたの場合、ポイントの座標がありません。代わりに、それらのペア間の「類似度」関数の値を計算できます。
ここでの 1 つの良い可能性は、スペクトル クラスタリングを使用することです。これには、類似度行列が必要です。欠点は、ポイントのペアごとに互換性関数を計算する必要があることです。つまり、アルゴリズムは O(n^2) です。
O(n^2) よりも高速なアルゴリズムが絶対に必要な場合は、非類似度スペースと呼ばれるアプローチを試すことができます。アイデアはとてもシンプルです。互換性関数を逆数にして (逆数をとることにより)、非類似度または距離の尺度に変換します。次に、すべてのアイテム (あなたの場合はユーザー) を一連のプロトタイプ アイテムと比較し、結果の距離を空間内の座標として扱います。たとえば、100 個のプロトタイプがある場合、各ユーザーは 100 要素のベクトル、つまり 100 次元空間内の点で表されます。次に、 K-meansなどの標準的なクラスタリング アルゴリズムを使用できます。
ここでの問題は、プロトタイプをどのように選択するか、および必要な数です。さまざまなヒューリスティックが試みられましたが、ここに論文がありますこれは、プロトタイプをランダムに選択するだけで十分であると主張しています。これは、ランダムに選択された 100 個または 200 個のプロトタイプを使用した実験で、良好な結果が得られたことを示しています。あなたの場合、1000 人のユーザーがいて、そのうちの 200 人をプロトタイプとして選択した場合、互換性関数を 200,000 回評価する必要があります。これは、すべてのペアを比較するよりも 2.5 倍の改善です。ただし、実際の利点は、1,000,000 ユーザーの場合、200 のプロトタイプで十分であり、2500 倍の改善である 5 億回ではなく、2 億回の比較を行う必要があることです。得られるのは O(n) アルゴリズムです。潜在的に大きな定数係数にもかかわらず、O(n^2) よりも優れています。