非常小的价值的意思

时间:2011-09-08 22:11:59

标签: matlab precision

我正在尝试计算一些非常小的值的平均值的日志。对于当前数据集,极值点是

log_a=-1.6430e+03;
log_b=-3.8278e+03;

因此,实际上我想计算(a+b) / 2log((a+b)/2),因为我知道(a+b)/2太小而无法存储为双倍。

我考虑过尝试按常量填充所有内容,以便存储log_a而不是存储log_a+c,但似乎ab是远的相隔足够的,以便填充log_b足以使exp(log_b+c)可计算,我最终会使exp(log_a+c)太大。

我是否错过了一些显而易见的计算方法?据我所知,MATLAB不会让我使用任何东西,只能使用双精度,所以我很难理解如何进行这种简单的计算。

编辑:澄清:我可以计算这些特定值的确切答案。对于算法的其他运行,值将是不同的并且可能更接近。到目前为止,已有一些关于近似的好建议;如果一个精确的解决方案不实用,是否有更一般的数值/数值的其他近似值?

4 个答案:

答案 0 :(得分:4)

嗯,exp(log_b)exp(log_a)小得多,你可以完全忽略该术语,并且仍然可以得到关于双精度的正确答案:

exp(log_a) = 2.845550077506*10^-714
exp(log_b) = 4.05118588390*10^-1663

如果您实际上是在尝试计算(exp(log_a) + exp(log_b)) / 2,那么答案将会下降到零。因此,除非你在最后尝试采用另一个对数,否则这并不重要。

如果你正在尝试计算:

log((exp(log_a) + exp(log_b)) / 2)

最好的办法是检查log_alog_b之间的区别。如果差异很大,那么只需将最终值等于较大的项 - log(2),因为较小的项将足够小以完全消失。

编辑:

所以你的最终算法看起来像这样:

  1. 检查幅度。如果abs(log_a - log_b) > 800。返回max(log_a,log(b)) - log(2)
  2. 检查幅度(此时它们将紧密相连)。如果它大于或小于1,则从log_alog_b添加/减去常量。
  3. 执行计算。
  4. 如果在步骤2中缩放了值。将结果缩放回来。
  5. 编辑2:

    这是一个更好的解决方案:

    if (log_a > log_b)
        return log_a + log(1 + exp(log_b - log_a)) - log(2)
    else
        return log_b + log(1 + exp(log_a - log_b)) - log(2)
    

    如果log_alog_b不是太大或为负数,这将有效。

答案 1 :(得分:4)

Mystical有正确的想法,但是对于更通用的解决方案,它给出了日志域中已有数字的向量log_v的算术平均值的日志:

max_log = max(log_v);
logsum = max_log + log(sum(exp(log_v-max_log)));
logmean = logsum - log(length(log_v));

这是统计机器学习中的常见问题,因此如果您在Google上搜索logsum.m,您会发现研究人员为此目的编写的几个不同版本的MATLAB函数。例如,here's a Github link到使用与sum相同的调用约定的版本。

答案 2 :(得分:0)

好吧,如果你不喜欢我之前关于完全改变平台并且正在寻找近似的建议,为什么不使用几何平均值(exp((log_a + log_b)/ 2)呢?

答案 3 :(得分:-1)

使用http://wolframalpha.com。例如,正如Mysticial所讨论的,你的计算 log(exp(-1.6430e + 03)+ exp(-3.8278e + 03)/ 2)约等于log_a。更确切地说,它等于......

1642.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999992881541751931671548742438622889628658008886 54829363675488466381404578225092913407982036991983506370017587380105049077722517705727311433458060227246074261903850589008701929721367650576354241270720062760800558681236724831345952032973775644175750495894596292205385323394564549904750849335403418234531787942293155499938538026848481952030717783105220543888597195156662520697417952130625416040662694927878196360733032741542418365527213770518383992577797346467266676866552563022498785887306273550235307330535082355570343750317349638125974233837177558240980392298326807001406291035229026016040567173260205109683449441154277953394697235601979288239733693137185710713089424316870093563207034737497769711306780243623361236030692934897720786516684985651633787662244416960982457075265287065358586526093347161275192566468776617613339812566918101457823704547101340270795298909954224594 ...