我们的ralis应用程序中有一个模型,其对象根据积极的用户操作分配了分数。为简单起见,我们称之为产品。如果用户喜欢产品或购买产品或查看产品,则分数会以各种权重递增(类似可能比视图更有价值,30秒范围内的两个视图可能超过三个视图分布一小时等。)
我们希望使用这些分数来帮助对产品进行排序和排名,比如热门产品列表,但出于各种原因 - 使用直接排名将不太有利于旧产品,因为他们将有更多时间获得更高的分数。
我的问题是,如何规范新旧产品之间的分数。我想过将产品得分除以一个单位的时间,比如它已经存在的天数,但我担心会过多地削减旧产品。有关将新旧产品之间的分数进行相当规范化的最佳方法的想法吗?
我也在考虑另一个问题中我发现的贝叶斯评级系统的例子:
rating = ((avg_num_votes * avg_rating) + (product_num_votes * product_rating)) / (avg_num_votes + product_num_votes)
通过查看具有多个avg
的所有产品(或在我们的情况下为正vote
)的分数来计算action
个数字。这可能不是最好的方法,因为我们的系统没有负面评级,也没有时间考虑。
答案 0 :(得分:3)
您的问题让我想起Exponential Discounting Cash Flow in finance的概念。
概念如下:两年100美元,一年价值不到100美元,现在价值不到100美元,......
我认为我们可以在这里做一个很好的比较:昨天的产品价值超过前一天的产品但不到今天的产品。
公式很简单:
Vn = V0 * (1-t)^n
V0 初始值(正数投票的实际数量), t 折扣率(您必须修复它,如10%)和 n 时间过去了(例如n天)。因此,产品每天将损失10%的价值(但不是初始值的10%)。
您还可以看到距您尝试更近的Hyperbolic discounting。公式可以像我想的那样:
Vn = V0 * (1/(1+k*n))
另一种方法,更简单但最粗略:线性贴现。您可以简单地给出分数的初始值,例如1000和每天,您将所有分数减1(或其他常数)。
Vn = V0 - k*n