我是一名有帮助的助手,以下是您需要翻译的内容:
我需要在Matlab中计算一个向量的归一化指数。
简单地写
res = exp(V)/sum(exp(V))
在V的一个元素中发生溢出,其值大于log(realmax)= 709.7827。(我不确定欠流条件。)
如何实现以避免数值不稳定?
更新:我收到了关于如何避免溢出的优秀反馈。但是,我仍然很乐意听取您对代码可能发生欠流的想法。
我需要在Matlab中计算一个向量的归一化指数。
简单地写
res = exp(V)/sum(exp(V))
在V的一个元素中发生溢出,其值大于log(realmax)= 709.7827。(我不确定欠流条件。)
如何实现以避免数值不稳定?
更新:我收到了关于如何避免溢出的优秀反馈。但是,我仍然很乐意听取您对代码可能发生欠流的想法。
res = 1./sum(exp(bsxfun(@minus, V(:), V(:).')))
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)))
exp(V)
将成为一个矩阵,sum(exp(V),dim)
将成为一个向量。如果这样的话,你如何定义exp(V)/sum(exp(V,dim))
? - Luis Mendo