log-sum-exp問題を研究しています。対数として保存されている数値のリストがあり、これを合計して対数に保存したいと考えています。
素朴なアルゴリズムは
def naive(listOfLogs):
return math.log10(sum(10**x for x in listOfLogs))
以下を含む多くの Web サイト: 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)
この計算をより数値的に安定させるための他のトリックはありますか?