Koleksi "buku" memiliki bidang berikut:

  • nama (nama buku)
  • skor (antara 0 hingga 5)
  • suara (jumlah suara)

Sebuah buku populer jika memiliki score yang baik dan banyak votes.

Saya ingin meminta semua buku untuk mengembalikan buku populer terlebih dahulu, awalnya saya melakukan sesuatu seperti:

db.collection('book').find().sort({ score: -1, votes: -1 })

Yang mengembalikan buku-buku ini:

name | score | votes
--------------------
foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299

Seperti yang Anda lihat, hasil pertama yang dikembalikan (buku bernama "foo") memiliki score yang sangat bagus, tetapi sangat sedikit votes. Saya ingin mengecualikannya, atau setidaknya menganggapnya kurang penting.

Bagaimana saya bisa memperbarui kueri sebelumnya untuk mempertimbangkan bidang score dan votes?


Jawaban:

Saya akhirnya menggunakan: https://www.quora.com/How-does-IMDbs-rating-system-work#:~:text=The%20formula %20untuk%20menghitung%20,untuk%20%20film%20%3D%20(suara)

0
julesbou 19 November 2020, 18:54

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan fungsi pembobotan untuk ini. Sesuatu seperti estimator Bayesian yang disederhanakan: https://en.wikipedia.org/wiki/Bayes_estimator#Practical_example_of_Bayes_estimators

W = (R*v) / (v + m)

Di mana W = peringkat tertimbang R peringkat rata-rata (nilai skor) v suara m bobot yang diberikan pada perkiraan sebelumnya (dalam hal ini, suara minimum skor perlu dilihat sebagai 'valid' - saya menggunakan 100 dalam kasus ini tetapi Anda dapat menggunakan apa saja:

foo  | 4.9   | 3
bar  | 4.6   | 203223
baz  | 4.3   | 323299

Jadi foo akan memiliki peringkat berbobot (4.9 * 3)/(3+100) = 14.7/300 = .049 bar akan menjadi (4.6 * 203223) / (203223 + 100) = 4.5977 (hampir 4.6) baz akan menjadi (4.3 * 323299) / (323299 + 100) = 4.2987 (hampir 4,3, tetapi lebih dekat ke 4,3 daripada bar adalah 4,6 karena memiliki lebih banyak suara)

Dan berikut adalah beberapa nilai lainnya:

one    | 4.7   | 90  | 2.226
two    | 4.6   | 100 | 2.3
three  | 4.5   | 110 | 2.357

Jadi Anda dapat melihat bagaimana skor yang lebih tinggi dengan suara yang lebih sedikit diberi bobot lebih sedikit, tetapi begitu Anda jauh melewati jumlah suara minimum, skornya pada dasarnya sama dengan rata-rata.

(Saya menyederhanakan perhitungan yang ada di halaman wiki)

1
Sheeri 19 November 2020, 16:57