我们希望创建一种评分算法,该评分算法可以在更短的时间内获得更高的积分,在更长的时间内获得更少的积分需要注意的是,没有真正的范围,因此时间范围可以从100毫秒到10分钟或更长,范围从0到50。
感谢您的帮助。
答案 0 :(得分:3)
您可以使用以下公式简单地将其设为线性映射:
points = 50 * 100/time_in_ms
这会给你:
time_in_ms=100ms
=> 50
分...
time_in_ms=10min
=> 0.0083
分...
time_in_ms=+∞
=> 0
分如果时间和点的范围发生变化,您可以轻松调整上述等式。
答案 1 :(得分:2)
您可以在应用线性映射之前以某种方式转换延迟,以便更快地提供更快和更慢的点。一种选择是采用到目前为止的时间对数。另一个选项是函数f(x) = Ax/(A + x)
,它在x = 0时从0快速增加,但随着x增加时向下减速,但从未完全达到它。 (这会增加,你想减少,但你可以用线性函数来解决 - 一个明显的例子是点= A - Ax/(A + x))
。
例如,如果您设置A=10
,那么
f(0) = 10 - 10*0/(10 + 0) = 10,
f(1) = 10 - 10/11 = 9 1/11,
f(2) = 10 - 20/12 = 8 1/3,
f(100) = 10 - 1000/110 = 10/11
等等。
答案 2 :(得分:0)
我认为你有两个选择:
如果您真的希望能够为任何时间长度分配点数,请选择一个除以点数的公式,例如:
points = [max_number_of_points]/[time]
在这里,time
应该是您最小的测量单位,以便它永远不会小于零。如果您不希望点数量以该速度减少,请将time
除以或乘以某个常数,直到点数分布看起来如您所愿。
确定,确实存在一个极限,即时间太长以至于任何时间都超过了零点。例如,我怀疑你关心的是时间是1亿年时的点差,而不是1000亿年。因此,以这种方式人为地选择最大时间,将所有较大的时间分配为零点,然后在有限范围内继续使用您的评分算法。
答案 3 :(得分:0)
如果记录集太大,那么这样的事情必须延迟一些。
假设您在一个流中不断获得每个用户的时间,您可以在一段时间内跟踪max
值,并且还有另一个系统可以动态地对点进行评分。
在以毫秒计算的现有记录时间段的决定重复间隔之后触发点的计算(可能存储在链表中或可能是动态增长的二维数组。
点计算的逻辑:
我们清楚地将其视为所用时间的反向线性关系。所以你知道时间值等于上面计算的平均值的所有记录在1到50的范围内得到25个。
因此,对于给定的记录假定100毫秒,其中最大值是500毫秒,答案是
50 * (500 - 100 ) / 500