0

私は以下を含むデータベースを持っています:

user_id | category_id | liked_id | disliked_id

(最初にデータベースを正しくセットアップするのを手伝ってくれたオーバーフローユーザーをスタックしてくれてありがとう!!)前回は例として食べ物を使用しましたが、今回は人を使用します。

ユーザーには2つの画像(男性と男性、または女性と女性)が与えられ、どちらが魅力的であるかを選択するだけです。ユーザーは、希望する限りこのプロセスを繰り返します。それぞれの選択はデータベースに入力され、好きな人と嫌いな人が表示されます(2人が似ていると思われる場合は、ボタンも使用できます)。

テーブルにエントリがいっぱいあるので、これらすべての「投票」を取得して、ユーザーが最も魅力的だと思う人のランク付けされたリストに変換するアルゴリズムを開発しようとしています(数百または数千に基づく)ランキングエントリ)。

私は何時間も画板にいて、これを行うための効果的な方法を考えることができないようです。

どんな助けでもいただければ幸いです。

PS:アイデアは、これをマルチユーザーのものにすることでもあります。他のユーザーはあなたの「いいね」テーブルを見ることができ、すべてのユーザーが一般的にどのように物事をランク付けするかを示すグローバル平均テーブルもあります。

4

1 に答える 1

0

それで、質問を c# グループに投稿しました。ただし、データベースに実装され、プログラムからより独立したソリューションを提供したいと思います。

おそらく最初にやりたいことは、画像が好きな回数と嫌いな回数を取得することです。この SQL ステートメントは、それを行う必要があります (グループ化セットをサポートするデータベースを使用している場合は、おそらく簡単に記述できます)。

SELECT t1.liked_id as id, t1.c_liked, t2.c_disliked
FROM 
    (SELECT liked_id, COUNT(*) as c_liked FROM table GROUP BY liked_id) t1
LEFT JOIN
    (SELECT disliked_id, COUNT(*) c_disliked FROM table GROUP BY disliked_id) t2
ON
    t1.liked_id = t2.disliked_id

あとは数字をどうするかです。最も外側の SELECT ステートメントには、非常に複雑な関数を入れることができます。可能な非常に単純な関数のアイデアを提供するには:

SELECT t1.liked_id as id, 
(t1.c_liked/(t1.c_liked + t2.c_disliked) -  t2.c_disliked/(t1.c_liked + t2.c_disliked)) as score

これは値 [-1, 1] (必要に応じて [0, 1] に正規化できますが、そうする必要はありません) を返し、次の例のように並べ替えることができます。

SELECT t1.liked_id as id, 
    (t1.c_liked/(t1.c_liked + t2.c_disliked) -  t2.c_disliked/(t1.c_liked + t2.c_disliked)) as score    
FROM 
    (SELECT liked_id, COUNT(*) as c_liked FROM table GROUP BY liked_id) t1
LEFT JOIN
    (SELECT disliked_id, COUNT(*) c_disliked FROM table GROUP BY disliked_id) t2
ON
    t1.liked_id = t2.disliked_id
ORDER BY score
于 2013-02-20T10:06:16.953 に答える