我需要在Matlab中计算向量的归一化指数。
简单写作
res = exp(V)/sum(exp(V))
V元素中的溢出大于log(realmax)= 709.7827。 (我不确定下溢情况。)
我应该如何实施它以避免数值不稳定?
更新:我收到了关于如何避免溢出的出色回复。但是,我仍然很高兴听到您对代码中下溢可能性的看法。
答案 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)))