我在网站上有一些页面,我必须根据“受欢迎程度”/“活动”创建订单
我必须使用的参数是:
对于受欢迎的公式,有什么标准吗? (如果不是意见也很好)
(最初我想到了观点+ 10 *评论+ 10 *喜欢)
答案 0 :(得分:2)
您可以执行类似YouTube所做的事情 - 只需按每个类别的最大计数排序。例如 - 观看最多,评论最多,最喜欢。在每个类别中,可以首先使用不同的页面,但排名可能是相关的。如果你只需要一个排名,那么你必须提出某种类型的公式,最好通过分析你已经拥有的一堆数据并决定应该计算什么是好/坏,并且向后工作以适应经验来推导出来。适合您决定的等式。
您甚至可以尝试使用机器学习方法来“学习”将示例公式中的每个数字组合起来的良好权重。手动完成也可能不会太难。
答案 1 :(得分:2)
这没有标准公式(怎么会有?)
你看起来像一个相当正常的解决方案,并且可能会运作良好。当然,您应该使用10's来找到适合您需求的值。
根据您的要求,您可能还需要添加时间因素(即每周-X点数),以便旧页面变得不那么受欢迎。或者,您可以将“网页浏览量”更改为“上个月的网页浏览量”。同样,这取决于您的需求,可能不相关。
答案 2 :(得分:2)
我用,
(C*comments + L*likeit)*100/views
您必须使用C和L,具体取决于您对每个属性的估值。 我使用C = 1和L = 1.
这将为您提供生成积极操作的视图的百分比,使项目具有 更高百分比的最“流行”。 我喜欢这个,因为它可以使新项目最初非常受欢迎,首先出现并获得更多视图,从而变得不那么受欢迎(或更多)直到稳定。
反正 我希望它有所帮助。 PS:如果没有“* 100”,它的效果会相同,但我喜欢百分比。
答案 3 :(得分:2)
实际上,有一种可以接受的最佳计算方法:
http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
您可能需要将“赞”和“评论”合并为一个分数,为每个分配自己的加权因子,然后将其作为“正投票”值插入公式。
来自上面的链接:
得分=威尔逊得分置信区间的下限 伯努利参数
我们需要平衡积极评级的比例 少数观察的不确定性。幸运的是 这方面的数学是由Edwin B. Wilson于1927年制定的。我们想要什么 要问的是:鉴于我的评分,有95%的可能性 积极评级的“真实”部分至少是什么?威尔逊给出了 回答。仅考虑正面和负面评级(即不是a 五星级),正面评级比例的下限 是(谁)给的:
(使用减号表示加号/减号来计算下限。) 此处
p̂
是观察到的积极评分,zα/2
是 标准正态分布的(1-α/2)
分位数,n
是 总评分数。在Ruby中实现的相同公式:
require 'statistics2'
def ci_lower_bound(pos, n, confidence)
if n == 0
return 0
end
z = Statistics2.pnormaldist(1-(1-confidence)/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
pos
是正面评分的数量,n
是总数 评级和置信度是指统计置信度: 选择0.95,使你的下限正确率为95% 有97.5%的几率等等。这个函数的z得分永远不会 更改,所以如果你没有方便的统计包或如果 性能是一个问题,您始终可以对z
的值进行硬编码。 (使用1.96表示置信度为0.95。)
与SQL查询相同的公式:
SELECT widget_id, ((positive + 1.9208) / (positive + negative) -
1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) /
(positive + negative)) / (1 + 3.8416 / (positive + negative))
AS ci_lower_bound FROM widgets WHERE positive + negative > 0
ORDER BY ci_lower_bound DESC;
答案 4 :(得分:0)
如果内容邀请讨论,我会更喜欢评论。如果只是陈述事实,那么评论和类似计数的平等比例似乎没问题(尽管10有点太多,我认为......)
访问是否考虑了用户花费的时间?您也可以使用它,因为2秒视图意味着不到3分钟。
答案 5 :(得分:0)
Anentropic's answer的Java代码:
public static double getRank(double thumbsUp, double thumbsDown) {
double totalVotes = thumbsUp + thumbsDown;
if (totalVotes > 0) {
return ((thumbsUp + 1.9208) / totalVotes -
1.96 * Math.sqrt((thumbsUp * thumbsDown) / totalVotes + 0.9604) /
totalVotes) / (1 + (3.8416 / totalVotes));
} else {
return 0;
}
}