所以,我今天在构建限制Boltzmann机器时遇到了一个问题,这应该是微不足道的,但似乎很麻烦。基本上我正在将2k值初始化为0到1之间的随机双精度。
我想要做的是计算此数据集的几何平均值。我遇到的问题是,由于数据集太长,所以将所有内容相乘将始终导致零,并且在每一步执行正确的根将只会导致1。
我可能会把这个列表列入其中,但我认为这真的很糟糕。关于如何以优雅的方式做到这一点的任何想法?
理论上,我想扩展我当前的RBM代码,使其接近15k +条目,并能够跨多个线程运行RBM。可悲的是,这排除了apache commons math(几何平均法不同步),渴望。
答案 0 :(得分:11)
只需取所有对数,找到算术平均值,然后取幂。
答案 1 :(得分:1)
Mehrdad的对数解决方案当然有效。但是,你可以更快地(也可能更准确地)做到这一点:
S
。1/2
和1
之间。S
并将指数猛击为零。T
。几何平均值为T
1 / N
2 S
/ N
,其中N
为输入的大小。答案 2 :(得分:0)
看起来在经过足够数量的乘法后,双精度不再足够。如果你愿意的话,太多的前导零。
The wiki page on arbitrary precision arithmetic显示了解决问题的几种方法。在Java中,BigDecimal似乎是要走的路,尽管是以牺牲速度为代价。