数字稳定的实施

时间:2014-05-14 21:38:26

标签: matlab exp numerical-stability

我需要在Matlab中计算向量的归一化指数。

简单写作

res = exp(V)/sum(exp(V))

V元素中的溢出大于log(realmax)= 709.7827。 (我不确定下溢情况。)

我应该如何实施它以避免数值不稳定?

更新:我收到了关于如何避免溢出的出色回复。但是,我仍然很高兴听到您对代码中下溢可能性的看法。

2 个答案:

答案 0 :(得分:6)

以下方法通过减去指数然后取指数而不是除以指数来避免溢出:

res = 1./sum(exp(bsxfun(@minus, V(:), V(:).')))

作为一般规则,可以通过尽可能长时间地在日志域中工作来避免溢出,并且仅在结束时使用指数。

答案 1 :(得分:2)

答案与您之前的问题非常相似。使用数学!

exp(V)=exp(V-max(V))*exp(max(V))
sum(exp(V))=sum(exp(V-max(V))*exp(max(V)))=exp(max(V)*sum(exp(V-max(V))))

将两者放在一起:

res=exp(V-max(V))*exp(max(V))/exp(max(V)*sum(exp(V-max(V)))=exp(V-max(V))/sum(exp(V-max(V)))

对输入范围具有鲁棒性的代码:

res=exp(V-max(V))/sum(exp(V-max(V)))
相关问题