【问题标题】:How to write an algorithm that takes into account 3 weighted actions, with time decay?如何编写一个考虑到 3 个加权动作并具有时间衰减的算法?
【发布时间】:2018-05-03 16:58:59
【问题描述】:

我有兴趣创建一种算法,该算法根据重要性加权的 3 个操作提供用户排名。示例:

  • 动作 A (50%)
  • 动作 B (30%)
  • 动作 C (20%)

然后我想要一个时间衰减,该提供商在操作时的最大值,并在一段时间内衰减到 0,例如(日/周/月/年)。

关于从哪里开始,如何实现这样的算法有什么建议吗?

基于 Jim 的 cmets 的更新:

  • A、B、C 的值是具有相等值的点的总和...用户执行操作的次数
  • 时间分量应该线性衰减。没有加速。

【问题讨论】:

  • 从更明确地定义需求开始。动作 A、B 和 C 的期望值是多少?用户执行这些操作是否只是一个真/假标志?或者是否有一些点数乘以用户执行操作的次数?有了时间分量,你是希望它线性衰减,还是先慢慢衰减然后加速?
  • @JimMischel 对丢失的信息感到抱歉。我刚刚用额外的信息更新了这个问题。谢谢
  • 至少在您的问题中添加一些示例数据。 {是否有时间戳,每条记录上是否存在 ABC 事件/计数?}

标签: algorithm ranking ranking-functions


【解决方案1】:

关于从哪里开始的任何建议

显而易见的解决方案是跟踪每个事件以及该事件的时间戳。然后剩下的只是数学。但是,这可能需要更多的存储空间和更多的计算时间。

所以我的建议是使用分箱。如果总时间衰减期为一天,则使用 12 个两小时的分档。例如,在午夜,第一个 bin(表示 00:00am 到 02:00am 时间段)被清除。然后,在凌晨 2:00 之前发生的任何事件都会更新该 bin 中的 ABC 计数器。垃圾箱在凌晨 2:00 之前是满重的,之后重量会减轻,直到午夜再次被清理。

如果时间段是一周,则使用 7 个每日垃圾箱或 14 个半天垃圾箱。在一个月的时间里,使用 15 个两天的垃圾箱,或 10 个三天的垃圾箱。一年内,每月使用 12 个垃圾箱。

【讨论】:

  • 谢谢,垃圾桶的好主意。虽然性能在一段时间内不会成为问题......你建议如何处理时间衰减方面?
  • @AnApprentice 有十二个箱子,每个箱子的重量从 12/12 到 1/12。当前 bin 的重量为 12/12,最旧的 bin 的重量为 1/12。例如,如果当前时间是 08:32,那么 08:00-10:00 的 bin 的权重是 12/12,06:00-08:00 的 bin 的权重是 11/12,等等。
【解决方案2】:

尝试提供高级设计。

用户分数发生变化的原因只有两个:

  1. 用户执行了一些操作;或者,
  2. 一个单位的时间过去了。

时间的相互作用导致线性衰减


算法

您正在尝试根据用户对操作 A、B 和 C 的贡献生成的分数对用户进行排名。让我们首先概述当分数变化的两个原因之一发生时软件将执行的操作。


  1. 当用户执行操作时:假设用户不会提交任何进一步的操作并将其放入用户对象内的队列中,则生成用户剩余时间的分数。队列的最前面会告诉用户当前的分数。

  2. 当一个单位时间过去时:只需将前面从其得分队列中取出。


数据结构

在我看来,传统的数据结构 - 数组、树、哈希图 - 甚至通常的增强数据结构 - 链接哈希图、红黑树 - 都不足以计算这种评分模型的排名。您需要提升一个级别才能获得正确的数据结构,以便从此评分系统生成排名。

我可以想象一种多重双重链接的 Hashmap。看起来有点像这样:

所以在上图中,我们有一个包含所有用户对象的公共存储。然后我们在用户存储中有多个单/双链接索引。这样,当用户的分数发生变化时,与用户对象关联的所有索引都是可更新的。


最后,可以允许排名不一定从 1 开始。sorted-concurrent-hashmap 可以更新并且可以保持负排名。由于地图是排序的,最负的排名将是第一个排名,并且可以通过排序地图的遍历获得进一步的排名。当最小等级接近下溢限制时,可以将等级归一化以从某个较高的正数开始。


这是一个相当大的问题。我想到了更多的想法和优化。这是一项艰巨的任务,无法在此处提及所有这些。如果您有具体问题,我可以尝试回答。


时间的相互作用导致线性衰减。所以我假设计算从用户当前分数到下一个(假设)100 分数的时间衰减分数很简单。需要计算多少未来分数将取决于您认为是一个时间单位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多