2008-11-11 3 views
1

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

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

Формула:

WR = (В/(В + М)) * R + (М/(V + М)) * С

Где :

* 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" (ариф метрическая средняя оценка по всему сайту) недействительна.

это так, REstate мой вопрос:

Использование MySQL, PHP, или оба, я стараюсь, чтобы получить от aritmetic среднего:

(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 
+0

Вопрос требует знак вопроса, где ваш? – 2008-11-11 16:46:41

ответ

4

Это простой пример того, как это сделать непосредственно в 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

Isn'nt точная вещь как сумма (голосование)/count (*) ??? 5 + 5 + 5 + 5 + 4 = 24. 24/5 голосов = 4.8 – vIceBerg 2008-11-11 16:47:11

0

Что дало понять, что взвешивание было бы более уместным? Что вы видите в арифметическом значении, которое вам не полезно? Мне любопытно, потому что кажется, что ответ, который вы ищете, может не всегда соответствовать вашим потребностям. (Кроме того, 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 на работе.

Обратите внимание, что вам, возможно, придется конвертировать суммы из ints в floats; не уверен точно, как это работает в MySQL.В SQL Server вы должны указать одну из сумм, чтобы понять, что вам не нужна интегральная средняя.

Смежные вопросы