5

所以,我今天在构建受限玻尔兹曼机时遇到了一个问题,这个问题应该是微不足道的,但似乎非常困难。基本上我将 2k 值初始化为 0 到 1 之间的随机双精度值。

我想做的是计算这个数据集的几何平均值。我遇到的问题是,由于数据集很长,将所有内容相乘总是会导致零,并且在每一步都进行正确的根操作只会变成 1。

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

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

4

3 回答 3

11

哇,使用大的十进制类型太矫枉过正了!

只需取所有内容的对数,找到算术平均值,然后取幂即可。

于 2013-04-23T08:33:15.857 回答
1

Mehrdad 的对数解决方案确实有效。不过,您可以做得更快(并且可能更准确):

  1. 计算数字的指数之和,例如S
  2. 将所有指数全部归零,使每个数字都在1/2和之间1
  3. 将数字分组为最多 1000 个的字符串。
    • 对于每个组,计算数字的乘积。这不会下溢。
    • 将乘积S的指数加到并将指数猛击为零。
  4. 你现在有大约 1/1000 的数字。重复步骤 2 和 3,除非您只有一个号码。
  5. 拨打剩下的一个号码T。几何平均值是T1/N 2 S/N,其中N是输入的大小。
于 2013-04-23T09:18:22.227 回答
0

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

关于任意精度算术的 wiki 页面显示了一些处理该问题的方法。在 Java 中,BigDecimal 似乎是要走的路,尽管以牺牲速度为代价。

于 2013-04-23T08:30:26.870 回答