按流行度排序歌曲列表

Mat*_*gan 9 algorithm voting popularity ranking rating-system

对于今年的学生会,我在"歌曲"委员会,我们选择歌曲.不幸的是,舞蹈中的孩子总是讨厌一些愚蠢的歌曲选择.我想我今年可能会有所不同.上周四,我创建了一个简单的PHP应用程序,以便孩子们可以将歌曲提交到数据库中,提供歌曲名称,艺术家和流派(来自下拉列表).我还实现了类似于Reddit的投票功能.单击一个upvote按钮,您已经对该歌曲进行了投票,增加了upvote计数.与downvotes相同.

Anywho,在数据库中,我有三个信息,我认为我可以使用它来评价这些歌曲,upvotes,downvotes和时间戳.有一段时间,排名是通过简单地将具有较高"投票"计数的歌曲放在顶部而创建的.也就是说,更多的投票,更少的downvotes(upvotes - downvotes)将位于列表的顶部.这种情况有一段时间了,但截至周日列表中大约有75首歌曲,首先提交的歌曲只是在列表的顶部.

周日,我将等级算法更改为(upvotes - downvotes)/(CurrentTimestamp - CreationTimestamp),也就是说,在较短的时间内投票计数越高,列表中的歌曲就越高.这工作得更好,但仍然不是我喜欢它.

现在发生的事情是,一首歌创建并投票到1的投票数,它最终会在某个地方的列表顶部.有负面投票计数的歌曲不经常被看到,因为孩子通常不会滚动到底部.

我想我可以对数据进行排序,以便较低的歌曲显示在顶部,因此人们不得不看到较低的歌曲.老实说,我以前从未使用过"流行度"算法,所以,你有什么想法?

网站http://www.songs.taphappysoftware.com - 我不知道我是否应该把这个放在这里,可能会在舞会上引起一些不受欢迎的歌曲:0

Dav*_*one 6

这是一个非常好的问题.这里有一些类似的问题.

这篇文章可能是一个很好的起点.显然,upvotes减去downvotes是一个不好的方法.更好的方法是使用复杂的数学为每个分配一个分数并按其排序.

以下是Ruby中的评分函数:

require 'statistics2'

def ci_lower_bound(pos, n, power)
    if n == 0
        return 0
    end
    z = Statistics2.pnormaldist(1-power/2)
    phat = 1.0*pos/n
    (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n)
end
Run Code Online (Sandbox Code Playgroud)

pos是正评级的数量,n是评级的总数,并且power是指统计功效:选择0.10,使你的下限正确率为95%,0.05%则为97.5%.

作为可用性的东西,我会按分数对数据进行排序,但我不会向用户显示分数.我只会显示upvotes和downvotes的数量.