2008-11-11 282 views
1

我有一个现有的网络应用程序,允许用户根据他们的难度“评分”项目。 (0到15)。目前,我只是简单地从每个用户的意见中取出平均值,并从MySQL中直接显示平均值。然而,我(和我的用户)越来越清楚,衡量这些数字会更合适。加权平均值

奇怪的是,几个小时的谷歌并没有太多的变化。我确实发现了两篇文章,展示了基于“贝叶斯过滤器”(我部分理解)的站点范围评分系统。 Here的一个例子:

的公式为:

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”(arith整个网站的平均评分)无效。

所以,我的问题的重申:

使用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

不是确切的东西作为总数(票)/计数(*)??? 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在工作。

注意,你可能需要将资金从整数到浮点数转换;不确定在MySQL中如何工作。在SQL Server中,你必须施加其中一个总和,这样才能理解你不想要一个整数的意思。