Python &引用;热的;算法总是返回0
我正在尝试复制以对我的帖子进行排序。以下是我的功能:Python &引用;热的;算法总是返回0,python,django,algorithm,sorting,Python,Django,Algorithm,Sorting,我正在尝试复制以对我的帖子进行排序。以下是我的功能: def hot(self): s = self.upvotes baseScore = log(max(s, 1)) now = datetime.now() timeDiff = (now - self.post.date).days if (timeDiff > 1): x = timeDiff - 1 baseScore = baseScore * exp(
def hot(self):
s = self.upvotes
baseScore = log(max(s, 1))
now = datetime.now()
timeDiff = (now - self.post.date).days
if (timeDiff > 1):
x = timeDiff - 1
baseScore = baseScore * exp(-8 * x * x)
print('Final:', baseScore) #always prints 0
return baseScore
基本上,exp(-8*x*x)
总是将数字设为0。所以我很好奇我应该如何使这个算法工作
有什么想法吗?问题就在那一行
baseScore = baseScore * exp(-8 * x * x)
由于x
仅以天为单位获取值,因此它将始终是一个整数。现在如果x==0
,那么你会得到exp(-8*x*x)==1
,但是只要x==1
,它就会非常接近0
。一句话:你的功能不是连续的
你想要的是逐渐降低帖子的热度。这可以通过让x
取0
和1
之间的值来实现。一种方法是以分钟为单位计算时间增量,这样就可以留出小数天
timeDiff = (now - self.post.date).minutes / 1440
然后帖子会热几个小时。简言之:你创造了一场极端的冰暴,帖子在48小时后就会冻死 你的算法没有什么“错误”,但是你让分数“冷却”得太快了 假设一篇文章已经发布两天了(然后触发
if
子句)。在这种情况下,x=1
,在这种情况下,exp(..)
将导致:
>>> exp(-8)
0.00033546262790251185
对<代码>0.00033…,或0.03%
。这意味着如果你的帖子获得了10000张选票,那么基本分数是9.21
,在这个乘法之后,只有:
>>> log(10000) * exp(-8)
0.003089724985059729
是的,冷却方案应该确保最终所有东西都冷却下来,但不是通过将柱子放入冰暴中
例如,您可以删除8*
因子。这意味着第二天,我们将分数乘以~0.37或36.79%。您可以尝试一下因子或冷却方案的其他部分,从而让帖子很好地冷却下来
另一个方面是时间被描述得很清楚:你计算天数。但这意味着,只要第二天还没有完全结束,值就是1。但从第二天结束的那一刻起,帖子的“温度”就大幅下降。您可以使用秒数除以86'400:
timeDiff = (now - self.post.date).total_seconds() / 86400 # continuum
嗯exp(-very\u big\u number)
总是(非常接近)0
。正如@WillemVanOnsem所说。。。你的帖子不是很热门…这一天可能有点太过激进:最好的情况是1(0天),然后你跳到3.10-4。也许用小时来更进步?在cas中,帖子已经发布两天了,这意味着你已经将其减少了0.03%。因此,如果您的baseScore
为10k(由于您使用log
,因此同样无法访问),则只剩下3个。三天内,百分比低于浮动所能表示的百分比,因此0
。我想你“冷却”帖子的速度太快了。为了让你的算法正常工作,你需要改变你的指数函数,这样在给定的时间间隔内,衰减不会太大。你的相关问题很好地解释了如何做到这一点。调整exp()
的参数,以便获得所需的粒度,因为它们使用的是timeDiff=(now-track.upload)。toWeeks
而不是days