如何在Python中计算大整数的exp(x)?
我正在为我的人工神经网络使用一个 sigmoid 函数。我传给这个函数的值在 10,000 到 300,000 之间。我需要一个高精度的结果,因为这个结果将作为我人工神经网络中节点之间连接的权重。我试着在 numpy 中找过,但没有找到合适的方法。有没有办法计算 e^(-x)
呢?
3 个回答
2
标准库中的 decimal
模块可以让你以所需的精度计算 exp(-300000)
。
>>> import decimal
>>> decimal.getcontext().prec = 300
>>> decimal.Decimal(-300000).exp()
Decimal('4.52302537736869338168154543856941208987901785730658877589102779454404342316583413710153707357620016787644963947448152347606024065141665176979995260298156742722510150887341893137830615617098803353373668680329179329422367091094657806579661636984526349130940466600671093389647604708034230900336526970689E-130289')
我同意 @lejlot 的回答:如果你需要这样做,那说明你的神经网络可能有问题。
4
@Paul已经给你解答了计算方面的问题。
不过,从神经网络的角度来看,你的问题说明你做错了什么。在使用神经网络时,没有合理的情况需要计算这么大的数字。你似乎忘记了至少以下几点:
- 输入数据的缩放/标准化/规范化
- 小权重的初始化范围
- 正则化项,它可以在网络规模增大时保持权重较小
这些都是基本且至关重要的部分,涉及到神经网络的工作。我建议你看看Haykin的《神经网络与学习机器》这本书。
4
普通的Python数学模块和numpy模块在计算exp(300000)的时候会出现溢出问题,也就是说它们无法处理这么大的数字。
你需要的是一个可以处理任意精度浮点数的库。
安装这个库的前提是:pip install mpmath
from mpmath import *
mp.dps=300
print exp(300000)
2.21090954962043147554031964344003334958746533182776533253160702399084245726328190320934903726540800347936047182773804396858994958295396516475277561815722954583856797032504775443385287094864178178111231967140927970972263439977028621274619241097429676587262948251263990280758512853239132411057394977398e+130288
你还可以查看这个链接了解更多信息:http://code.google.com/p/mpmath/