我一直在研究log-sum-exp问题。我有一个以对数形式存储的数字列表,我想将它们相加并以对数形式存储。
朴素算法如下:
def naive(listOfLogs):
return math.log10(sum(10**x for x in listOfLogs))
许多网站,包括: C语言中的logsumexp实现? 和 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)
我的问题是:在这个计算中是否有其他技巧可以使其更加数值稳定?