1

ユーザーが難易度に基づいてアイテムを「評価」できる既存の Web アプリがあります。(0 ~ 15)。現在、私は単に各ユーザーの意見の平均を取り、MySQL から直接平均を提示しています。しかし、私 (および私のユーザー) には、数値を重み付けする方が適切であることが明らかになりつつあります。

奇妙なことに、Google を数時間使用してもあまり効果がありませんでした。「ベイジアン フィルター」に基づくサイト全体の評価システムを示す 2 つの記事を見つけました (これは部分的に理解しています)。 一例を次に示します

式は次のとおりです。

WR=(V/(V+M)) * R + (M/(V+M)) * C

どこ:

* WR=Weighted Rating (The new rating)
* R=Average Rating (arithmetic mean) so far
* V=Number of ratings given
* M=Minimum number of ratings needed
* C=Arithmetic mean rating across the whole site

ここで、アイテムごとの総投票数に基づいて重み付けを増やすというアイデアが気に入っています...ただし、私のサイトの難易度はアイテムごとに大幅に異なる可能性があるため、「C」(全体の算術平均評価)を取りますサイト) は無効です。

だから、私の質問の言い換え:

MySQL、PHP、またはその両方を使用して、算術平均から取得しようとしています。

(5 + 5 + 4)/3 = 4.67 (rounded)

...加重平均に:

rating  / weight
5 / 2 (since it was given 2 times)
5 / 2
4 / 1

(sum[(rate * weight)])/(sum of weights)
(5 * 2) + (5 * 2) + (4 * 1) / (2 + 2 + 1)
(24)/(5)
= 4.8
4

2 に答える 2

5

これは、MySQL で直接行う方法の簡単な例です。もちろん、すべての投票ではなく、関連するアイテムの投票のみを取得するには、サブクエリに条件を追加する必要があります。

mysql> テーブルの投票を作成します (投票 int);
クエリ OK、影響を受ける行は 0 (0.01 秒)

mysql> 投票値 (5)、(5)、(4) に挿入します。
クエリ OK、影響を受ける 3 行 (0.00 秒)
レコード: 3 重複: 0 警告: 0

mysql> 投票から * を選択します。
+--------+
| | 投票 |
+--------+
| | 5 |
| | 5 |
| | 4 |
+--------+
3 行セット (0.00 秒)

mysql> 投票グループから投票、カウント (投票)、投票 * カウント (投票) を選択します。
+-----+-------------+------------------+
| | 投票 | カウント (投票) | 投票*カウント(投票) |
+-----+-------------+------------------+
| | 4 | 1 | 4 |
| | 5 | 4 | 20 |
+-----+-------------+------------------+
2 行セット (0.00 秒)

mysql> select sum(vt)/sum(cnt) FROM (select
count(vote)*count(vote) as cnt,vote*count(vote)*count(vote)
投票によるグループからの vt として) a;
+------------------+
| | 合計 (vt)/合計 (cnt) |
+------------------+
| | 4.8000 |
+------------------+
セットで 1 行 (0.00 秒)


于 2008-11-11T16:41:11.060 に答える
0

重み付けがより適切であることを明確にした理由は何ですか。算術平均で何を見ているので、役に立たないのですか?あなたが探している答えが必ずしもあなたのニーズを最もよく満たすとは限らないように思われるので、私は興味があります。(また、16ポイントのスケールは通常、ほとんどの人が必要とするものよりもはるかに大きくなります。人々がそれほど多くのポイントを区別することはめったになく、選択した回答グループの周りに回答をまとめる傾向があります。)

リンクしたコンセプトは、平均をサイトの平均に引き寄せます。あなたの平均は単に最も一般的な反応に向かって自分自身を引っ張るだけです。通常、平均を使用して回答に重みを付けたい場合は、回答者に関する何かに基づいて行います(知識の豊富な人、サイトに頻繁にアクセスする人などからの回答に重点を置きます)。

また、平均スコア以外の計算、おそらく上位Nボックスのパーセンテージ(上位Nの難易度を与える回答者のパーセンテージ)の使用を検討することもできます。

それ以外の場合、平均の式はsum(response * count * count)/ sum(count * count)..。

select sum(response*ct*ct)/sum(ct*ct) from
( select response, count(response) as ct from your_table group by response) data

構文が正確でない場合はお詫びします。MySQLを使用していません。

合計をintからfloatに変換する必要がある場合があることに注意してください。それがMySQLでどのように機能するか正確にはわかりません。SQL Serverでは、合計の1つをキャストする必要があるため、整数平均が必要ないことがわかります。

于 2008-11-11T17:07:57.400 に答える