计算一长串随机双精度的几何平均数

时间:2013-04-23 08:18:53

标签: java math

所以,我今天在构建限制Boltzmann机器时遇到了一个问题,这应该是微不足道的,但似乎很麻烦。基本上我正在将2k值初始化为0到1之间的随机双精度。

我想要做的是计算此数据集的几何平均值。我遇到的问题是,由于数据集太长,所以将所有内容相乘将始终导致零,并且在每一步执行正确的根将只会导致1。

我可能会把这个列表列入其中,但我认为这真的很糟糕。关于如何以优雅的方式做到这一点的任何想法?

理论上,我想扩展我当前的RBM代码,使其接近15k +条目,并能够跨多个线程运行RBM。可悲的是,这排除了apache commons math(几何平均法不同步),渴望。

3 个答案:

答案 0 :(得分:11)

哇,使用大十进制类型太过分了!

只需取所有对数,找到算术平均值,然后取幂。

答案 1 :(得分:1)

Mehrdad的对数解决方案当然有效。但是,你可以更快地(也可能更准确地)做到这一点:

  1. 计算数字的指数之和,例如S
  2. 将所有指数猛击为零,以使每个数字介于1/21之间。
  3. 将数字分组为最多1000个。
    • 对于每个组,计算数字的乘积。这不会下流。
    • 将产品的指数添加到S并将指数猛击为零。
  4. 你现在有大约1/1000的数字。除非您只有一个数字,否则请重复步骤2和3。
  5. 拨打剩余号码T。几何平均值为T 1 / N 2 S / N ,其中N为输入的大小。

答案 2 :(得分:0)

看起来在经过足够数量的乘法后,双精度不再足够。如果你愿意的话,太多的前导零。

The wiki page on arbitrary precision arithmetic显示了解决问题的几种方法。在Java中,BigDecimal似乎是要走的路,尽管是以牺牲速度为代价。