2008-11-11 231 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中,你必須施加其中一個總和,這樣才能理解你不想要一個整數的意思。