在rails应用程序中排名算法

时间:2011-12-30 15:14:59

标签: ruby-on-rails-3

我们的ralis应用程序中有一个模型,其对象根据积极的用户操作分配了分数。为简单起见,我们称之为产品。如果用户喜欢产品或购买产品或查看产品,则分数会以各种权重递增(类似可能比视图更有价值,30秒范围内的两个视图可能超过三个视图分布一小时等。)

我们希望使用这些分数来帮助对产品进行排序和排名,比如热门产品列表,但出于各种原因 - 使用直接排名将不太有利于旧产品,因为他们将有更多时间获得更高的分数。

我的问题是,如何规范新旧产品之间的分数。我想过将产品得分除以一个单位的时间,比如它已经存在的天数,但我担心会过多地削减旧产品。有关将新旧产品之间的分数进行相当规范化的最佳方法的想法吗?

我也在考虑另一个问题中我发现的贝叶斯评级系统的例子:

rating = ((avg_num_votes * avg_rating) + (product_num_votes * product_rating)) / (avg_num_votes + product_num_votes)

通过查看具有多个avg的所有产品(或在我们的情况下为正vote)的分数来计算action个数字。这可能不是最好的方法,因为我们的系统没有负面评级,也没有时间考虑。

1 个答案:

答案 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