【发布时间】:2013-02-22 22:05:18
【问题描述】:
我一直在研究 log-sum-exp 问题。我有一个以对数形式存储的数字列表,我想对它们求和并以对数形式存储。
朴素算法是
def naive(listOfLogs):
return math.log10(sum(10**x for x in listOfLogs))
许多网站,包括: logsumexp implementation in 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)
我问的是有没有其他技巧可以使这个计算在数值上更稳定?
【问题讨论】:
-
我刚刚发现了 scipy.misc.logsumexp:docs.scipy.org/doc/scipy/reference/generated/…