我一直在研究 log-sum-exp 问题。我有一个以对数形式存储的数字列表,我想将其求和并以对数形式存储。
天真的算法是
def naive(listOfLogs):
return math.log10(sum(10**x for x in listOfLogs))
许多网站,包括: logsumexp 在 C 中的实现? 和 http://machineintelligence.tumblr.com/post/4998477107/ 推荐使用
def recommend(listOfLogs):
maxLog = max(listOfLogs)
return maxLog + math.log10(sum(10**(x-maxLog) for x in listOfLogs))
又名
def recommend(listOfLogs):
maxLog = max(listOfLogs)
return maxLog + naive((x-maxLog) for x in listOfLogs)
我不明白的是,如果推荐的算法更好,为什么我们要递归调用它?这会带来更多好处吗?
def recursive(listOfLogs):
maxLog = max(listOfLogs)
return maxLog + recursive((x-maxLog) for x in listOfLogs)
虽然我在问还有其他技巧可以使这个计算在数值上更稳定吗?