Средневзвешенное значение - PullRequest
1 голос
/ 11 ноября 2008

У меня есть существующее веб-приложение, которое позволяет пользователям "оценивать" элементы в зависимости от их сложности. (От 0 до 15). В настоящее время я просто беру среднее из мнений каждого пользователя и представляю среднее прямо из MySQL. Однако мне и моим пользователям становится ясно, что взвешивание чисел было бы более уместным.

Как ни странно, несколько часов работы Google мало. Я нашел две статьи, в которых были показаны системы рейтинга по всему сайту, основанные на «байесовских фильтрах» (которые я частично понимаю). Вот один пример :

Формула:

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

Ответы [ 2 ]

5 голосов
/ 11 ноября 2008

Это простой пример того, как сделать это в MySQL напрямую. Конечно, вам нужно будет добавить условие для подзапроса, чтобы получить только голоса за соответствующий элемент, а не все голоса.


mysql> create table votes( vote int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into votes values (5),(5),(4);
Query OK, 3 row affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from votes;
+------+
| vote |
+------+
|    5 |
|    5 |
|    4 |
+------+
3 rows in set (0.00 sec)

mysql> select vote,count(vote),vote*count(vote) from votes group by vote;
+------+-------------+------------------+
| vote | count(vote) | vote*count(vote) |
+------+-------------+------------------+
|    4 |           1 |                4 |
|    5 |           4 |               20 |
+------+-------------+------------------+
2 rows in set (0.00 sec)

mysql> select sum(vt)/sum(cnt) FROM (select 
count(vote)*count(vote) as cnt,vote*count(vote)*count(vote) 
as vt from votes group by vote) a;
+------------------+
| sum(vt)/sum(cnt) |
+------------------+
|           4.8000 |
+------------------+
1 row in set (0.00 sec)


0 голосов
/ 11 ноября 2008

Что дало понять, что взвешивание будет более уместным? Что вы видите в арифметическом средстве, которое вам не помогает? Мне любопытно, потому что кажется, что ответ, который вы ищете, не обязательно отвечает вашим потребностям наилучшим образом. (Кроме того, 16-балльная шкала, как правило, намного больше, чем нужно большинству людей; люди редко различают такое количество баллов и склонны группировать свои ответы вокруг выбранной группы ответов.)

Концепция, с которой вы связаны, подтягивает среднее значение к среднему значению для сайта; ваше среднее значение просто тянет себя к наиболее распространенному ответу. Как правило, если вы используете среднее значение и хотите взвешивать ответы, вы должны делать это, основываясь на ответах респондентов (придавая больший вес ответам более осведомленных людей, людей, которые чаще посещают сайт, или другим подобным вещам).

Вы могли бы также рассмотреть возможность использования расчетов, отличных от средних баллов, возможно, в процентном соотношении с верхним N-процентным значением (процент респондентов, давших наивысший рейтинг сложности N).

В противном случае формулой для вашего среднего значения будет сумма (ответ * количество * количество) / сумма (количество * количество) ...

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

Извините, если синтаксис не точен, у меня нет MySQL на работе.

Обратите внимание, что вам, возможно, придется конвертировать суммы из целых чисел в числа с плавающей запятой; не уверен, как именно это работает в MySQL. В SQL Server вам нужно привести одну из сумм, чтобы понять, что вам не нужно целочисленное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...