首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数值稳定实现

数值稳定实现
EN

Stack Overflow用户
提问于 2014-05-14 21:38:25
回答 2查看 1.2K关注 0票数 8

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

简单写字

代码语言:javascript
复制
res = exp(V)/sum(exp(V))

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

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

更新:关于如何避免溢出,我收到了很好的答复。然而,我仍然很高兴听到你的想法,可能在代码下流动。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 21:49:33

下面的方法避免了溢出,方法是减去指数,然后取指数,而不是将指数除以:

代码语言:javascript
复制
res = 1./sum(exp(bsxfun(@minus, V(:), V(:).')))

一般情况下,只要在日志域中尽可能长时间地工作,并且在结束时才取指数,就可以避免溢出。

票数 8
EN

Stack Overflow用户

发布于 2014-05-14 21:54:12

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

代码语言:javascript
复制
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))))

将两者结合在一起:

代码语言:javascript
复制
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)))

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

代码语言:javascript
复制
res=exp(V-max(V))/sum(exp(V-max(V)))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23665599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档