我一直在研究log-sum-exp問題。我有一個以對數形式存儲的數字列表,我想以對數求和和存儲。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:http://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.logsumexp.html – 2014-01-14 18:08:14