我正在尝试计算一些非常小的值的平均值的日志。对于当前数据集,极值点是
log_a=-1.6430e+03;
log_b=-3.8278e+03;
因此,实际上我想计算(a+b) / 2
或log((a+b)/2)
,因为我知道(a+b)/2
太小而无法存储为双倍。
我考虑过尝试按常量填充所有内容,以便存储log_a
而不是存储log_a+c
,但似乎a
和b
是远的相隔足够的,以便填充log_b
足以使exp(log_b+c)
可计算,我最终会使exp(log_a+c)
太大。
我是否错过了一些显而易见的计算方法?据我所知,MATLAB不会让我使用任何东西,只能使用双精度,所以我很难理解如何进行这种简单的计算。
编辑:澄清:我可以计算这些特定值的确切答案。对于算法的其他运行,值将是不同的并且可能更接近。到目前为止,已有一些关于近似的好建议;如果一个精确的解决方案不实用,是否有更一般的数值/数值的其他近似值?
答案 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_a
和log_b
之间的区别。如果差异很大,那么只需将最终值等于较大的项 - log(2),因为较小的项将足够小以完全消失。
编辑:
所以你的最终算法看起来像这样:
abs(log_a - log_b) > 800
。返回max(log_a,log(b)) - log(2)
。log_a
和log_b
添加/减去常量。编辑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_a
和log_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 ...