Ağırlıklı Ortalama

2 Cevap php

Kullanıcıların "rate" öğeleri kendi zorluk dayalı sağlayan mevcut bir web uygulaması var. (0 ile 15). Şu anda, ben sadece her kullanıcının görüş ortalamasını alarak ve MySQL ortalama düz sunuyorum. Ancak, sayıları ağırlıklandırılarak daha uygun olacağını bana (ve benim kullanıcılar) açık oluyor.

İşin tuhafı, Google-ing bir kaç saat çok geldi değil. (Ben kısmen anlıyorum) "Bayes filtreleri" kapalı tabanlı site genelindeki derecelendirme sistemlerini gösterdi iki makaleler buldun. Here 'tek bir örnek:

Formül:

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

Nerede:

* 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

Ancak ürün başına toplam oy sayısına dayanmaktadır ... ağırlık yokuş yukarıya burada fikir gibi, sitemde zorluk seviyesi "C" alarak, öğeden öğeye ölçüde değişebilir, çünkü (aritmetik tamamında ortalama değeri site) geçerli değil.

bu yüzden, benim soru bir REstate:

MySQL, PHP, ya da her ikisi kullanılarak, ben aritmetik ortalamasından elde etmeye çalışmak ediyorum:

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

... Bir ağırlıklı ortalamaya:

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 Cevap

Bu doğrudan MySQL bunu nasıl yapılacağı hakkında basit bir örnek. Sen elbette yerine, tüm oyların ilgili madde için sadece oy almak için alt sorgu bir koşul eklemek gerekir.


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)


Ne açık ağırlıklandırma daha uygun olacağını yaptı? Sizin için faydalı olmayan bir aritmetik ortalama ne görüyoruz? Mutlaka sizin ihtiyaçlarınıza en uygun olmayabilir arıyorlar cevap gibi görünüyor çünkü ben merak ediyorum. (Ayrıca, 16-noktalı ölçek genellikle çoğu insanın ihtiyacı olandan çok daha büyüktür; insanlar nadiren bu kadar çok nokta arasındaki ayrım ve cevapları seçilmiş bir grup etrafında kendi yanıtlarını küme eğilimindedir.)

Eğer site için ortalama doğru ortalama çeker bağlantılı kavram; senin demek sadece en yaygın tepkiye doğru kendini çeker. Eğer bir ortalama kullanmak ve yanıtları ağırlık istiyorsanız Genellikle, bunu katılımcıların hakkında bir şey (daha bilgili insanlar, daha fazla siteyi sık sık insanlar, ya da bunun gibi başka şeyler gelen tepkiler üzerine daha fazla ağırlık koyarak) dayalı yapardı.

Ayrıca belki bir üst-N-box yüzdesi (üst N zorluk derecelendirme veren katılımcıların yüzdesi) puan ortalamaları dışındaki hesaplamalar kullanmayı düşünebilirsiniz.

Aksi takdirde, ortalama için formül toplamı (tepkisi * sayımı * sayımı) / sum (sayısı * sayımı) olduğunu ...

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

Sözdizimi kesin değilse özür dilemek istiyorum, işte MySQL yok.

Eğer ints gelen şamandıralara meblağlar dönüştürmek zorunda olduğunu unutmayın; değil MySQL nasıl çalıştığını tam olarak emin olun. SQL Server, bu sizin ayrılmaz demek istemiyorum anlar böylece toplamları biri döküm var.