我想排序使用5星系统的客户评级一堆产品。 我设置此功能的网站并没有很多的收视率,并不断增加新产品,它通常有几个产品数量较少的收视率。
我尝试使用的平均星级评分,但是当有评级的少数算法失败。
例如具有3个5星评级将出现较有100个的5星级和2级2星级评定产品更好的产品。
如果不是第二个产品显示更高,因为它是因为收视率的较大数量的统计上更值得信赖?
我想排序使用5星系统的客户评级一堆产品。 我设置此功能的网站并没有很多的收视率,并不断增加新产品,它通常有几个产品数量较少的收视率。
我尝试使用的平均星级评分,但是当有评级的少数算法失败。
例如具有3个5星评级将出现较有100个的5星级和2级2星级评定产品更好的产品。
如果不是第二个产品显示更高,因为它是因为收视率的较大数量的统计上更值得信赖?
此前2015年,互联网电影数据库(IMDB)上市用来排名的公式250强的电影名单。 报价:
计算评分最高250个标题的公式给出了真实的贝叶斯估计 :
weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
哪里:
- R =平均为电影(平均值)
- V =票数的电影
- 中m为顶部250(25000目前)中列出所需的最低票
- C =在整个报告中的平均选票(目前7.0)
对于250强,从普通选民的投票只考虑。
这不是很难理解。 的公式为:
rating = (v / (v + m)) * R +
(m / (v + m)) * C;
这可以在数学上简化为:
rating = (R * v + C * m) / (v + m);
的变量是:
[1, 5]
等上。) [2, 3, 5, 5]
。C为3.75,这些数的平均值。) 所有的配方也是:计算平均之前添加米假想票,各为C的值,。 在一开始,当没有足够的数据(即票的数量是小于m显着更小),这将导致与平均数据被填充在空白。 然而,随着票的积累,最终虚选票将被以假乱真淹没。
在这个系统中,票不会导致评级大起大落。 相反,他们只是干扰它在某些方向的位。
当有零票,只存在虚票,和所有的人都℃。因此,每一个项目开始评级℃。
也可以看看:
请参见本页面基于星级评定系统的一个很好的分析,以及这一次的upvote- / downvote-基础的系统的一个很好的分析。
对于上下投票想估计,鉴于你有收视率的概率,“真正的”得分(如果你有无限的收视率)比一些数量较大的(比如说,对于一些其他项目类似号码你”重新排序反对)。
请参阅答案的第二篇文章,但得出的结论是,你要使用的威尔逊的信心。 文章给出的方程和样品Ruby代码(方便地翻译成另一种语言)。
埃文·米勒表示贝叶斯方法来排名的5星评级:
哪里
nk
是数量k
-star评分, sk
是的“身价”(以点为单位) k
明星, N
是票的总数 K
是分的最大数量(例如,K = 5,在一个5星级评级系统) z_alpha/2
是1 - alpha/2
的正态分布的位数。 如果你想95%的置信度(基于贝叶斯后验分布),实际的排序标准是至少一样大的计算排序标准,选择z_alpha/2
= 1.65。 在Python中,排序标准可以与计算
def starsort(ns):
"""
http://www.evanmiller.org/ranking-items-with-star-ratings.html
"""
N = sum(ns)
K = len(ns)
s = list(range(K,0,-1))
s2 = [sk**2 for sk in s]
z = 1.65
def f(s, ns):
N = sum(ns)
K = len(ns)
return sum(sk*(nk+1) for sk, nk in zip(s,ns)) / (N+K)
fsns = f(s, ns)
return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1))
例如,如果一个项目有60五颗星,80四星级,75三星级,20两星和25一星,那么它的总体星级评价将是约3.4:
x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694
你可以排序的5星级评级与列表
sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True)
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)]
这表明更多的收视率可以在整体的明星价值的影响。
你会发现,这个公式往往给总评比由网站如亚马逊,eBay和沃尔玛特别是当有几票(比如,小于300)报告的总体评价低一点。 这反映了带有更少的票数较高的非确定。 由于票的数量增加(入千)所有这些总体评价公式应倾向于(加权)平均评级。
由于公式只依赖于对项目本身的5星评级的频率分布,很容易从多个来源的评论相结合 (或更新的新票光的总体评价)通过简单地将频率分布在一起。
不像IMDB公式,这个公式并不依赖于所有项目的平均分,也没有投票截止值的人工最小数量。
此外,这个公式利用全频率分布的 - 不只是恒星的平均数量和投票数。 它是有道理的,它应该因为十5分和10个1星的项目应具有比更多的不确定性(因此不评为高度为)具有二十三星级评级的项目进行处理:
In [78]: starsort((10,0,0,0,10))
Out[78]: 2.386028063783418
In [79]: starsort((0,0,20,0,0))
Out[79]: 2.795342687927806
IMDB的公式没有考虑到这一点。
您可以通过排序中位数 ,而不是算术平均值。 在这种情况下这两个例子具有5的中值,因此两者将具有相同重量的排序算法。
你可以使用一个模式,达到同样的效果,但中间可能是一个更好的主意。
如果你想额外的重量分配到100 5星评级的产品,你可能会想要去与某种加权方式,以相同的位数,但更多的总得票数分配更多的权重评级。
嗯,这取决于你想多么复杂,使之,你可以有收视率基础上的人有多少收视率做出另外进行加权,以及这些评级是。 如果对方只做了一个等级,它可能是一个抬价的评级,并可能算少。 或者,如果该人已评为A类的很多事情,但B类少,具有平均等级为1.3,满分5星,这听起来像A类可通过该用户的低平均得分被人为打压下来,应进行调整。
但足以使其复杂的。 让我们简单。
假设我们只有两个值,ReviewCount和AverageRating工作,对于一个特定的项目,它将使意义,我看ReviewCount本质上是作为“可靠性”的价值。 但是,我们不只是希望把分数下来低ReviewCount项目:一个一星评级是可能作为一个单一的5星评级是不可靠的。 所以我们想要做的可能是对中央的平均:3。
所以,基本上,我想的方程类似X * AverageRating + Y * 3 =评级,我们想学。 为了使这个数值出来的权利,我们需要X + Y等于1,我们还需要X来增加价值为ReviewCount增加......为0的审核数量,则x应为0(给我们的“方程式3” ),并具有无限审查计数X应为1(这使得方程= AverageRating)。
那么什么是X和Y的方程? 对于X方程要因变量渐近地接近1作为独立变量接近无穷大。 一个良好的方程组是这样的:Y = 1 /(因子^ RatingCount)和(利用的事实,X必须是等于1-Y)X = 1 - (1 /(因子^ RatingCount)
然后,我们可以通过调整“因子”,以适应我们正在寻找的范围。
我用这个简单的C#程序试试以下几种因素:
// We can adjust this factor to adjust our curve.
double factor = 1.5;
// Here's some sample data
double RatingAverage1 = 5;
double RatingCount1 = 1;
double RatingAverage2 = 4.5;
double RatingCount2 = 5;
double RatingAverage3 = 3.5;
double RatingCount3 = 50000; // 50000 is not infinite, but it's probably plenty to closely simulate it.
// Do the calculations
double modfactor = Math.Pow(factor, RatingCount1);
double modRating1 = (3 / modfactor)
+ (RatingAverage1 * (1 - 1 / modfactor));
double modfactor2 = Math.Pow(factor, RatingCount2);
double modRating2 = (3 / modfactor2)
+ (RatingAverage2 * (1 - 1 / modfactor2));
double modfactor3 = Math.Pow(factor, RatingCount3);
double modRating3 = (3 / modfactor3)
+ (RatingAverage3 * (1 - 1 / modfactor3));
Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
RatingAverage1, RatingCount1, modRating1));
Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
RatingAverage2, RatingCount2, modRating2));
Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
RatingAverage3, RatingCount3, modRating3));
// Hold up for the user to read the data.
Console.ReadLine();
所以你不用费心在抄袭它,它给出了这样的输出:
RatingAverage: 5, RatingCount: 1, Adjusted Rating: 3.67
RatingAverage: 4.5, RatingCount: 5, Adjusted Rating: 4.30
RatingAverage: 3.5, RatingCount: 50000, Adjusted Rating: 3.50
类似的东西? 如需要得到一种加权你想要的,你可以明显调整“因子”值。
如果你只是需要一个快速和廉价的解决方案,而无需使用大量的运算工作大多这里有一个选项(假定为1-5评定量表)
SELECT Products.id, Products.title, avg(Ratings.score), etc
FROM
Products INNER JOIN Ratings ON Products.id=Ratings.product_id
GROUP BY
Products.id, Products.title
ORDER BY (SUM(Ratings.score)+25.0)/(COUNT(Ratings.id)+20.0) DESC, COUNT(Ratings.id) DESC
通过增加在25和总收视率+ 20除以你基本上添加10场最差的得分和10分最好的成绩,以总收视率,然后相应地排序。
这是否有已知问题。 例如,它不公平地奖励低分产品具有很少的评分(如该曲线图表明,产品具有的1的平均得分和只有一个等级得分1.2而产品的1分1K +的评分的平均得分得分接近1.05)。 你也可以认为这不公平惩罚高品质的产品与几个等级。
此图显示了所有5个等级以上1-1000收视率会发生什么: http://www.wolframalpha.com/input/?i=Plot3D%5B%2825%2Bxy%29/%2820%2Bx%29%2C%7Bx %2C1%2C1000%7D%2C%7BY%2C0 2C6%%7D%5D
你可以看到向上浸在最底层的收视率,但总体而言,它是一个公平的排名,我想。 您还可以看看它是这样的:
http://www.wolframalpha.com/input/?i=Plot3D%5B6-%28%2825%2Bxy%29/%2820%2Bx%29%29%2C%7Bx%2C1%2C1000%7D%2C%7By %2C0%2C6%7D 5D%
如果你在这个图上跌落大多数地方的大理石,它会自动向产品既具有较高的分数和较高的收视率滚动。
显然,评级低数把这个问题在统计障碍。 从来没有少...
改善的聚合评价的质量的一个关键要素是“评分评估者”,即保留每个特定的“评估者”已提供的收视率(相对于其他人)的标签。 这使得在聚合过程称重他们的选票。
另一种解决方案,更多的是应付出来的,是与标的项目投票的计数(或其范围的指示)供给最终用户。
一种选择是像微软的trueskill评分系统系统,其中分数由下式给出mean - 3*stddev
,其中常数可以调整。
看一会儿后,我选择了贝叶斯系统。 如果有人使用Ruby,这里是一个宝石:
https://github.com/wbotelhos/rating
我强烈建议由托比·西格伦(奥莱利)ISBN 978-0-596-52932-1其中讨论了如何从群体行为中提取有意义的数据本书编程集体智慧。 这些例子是Python,但它很容易转换。