在Python中如何计算真正大的整数的exp(x)?

在Python中如何计算真正大的整数的exp(x)?,python,math,numpy,artificial-intelligence,Python,Math,Numpy,Artificial Intelligence,我用了一个S形函数作为我的人工神经网络。我传递给函数的值范围为10000到300000。我需要一个高精度的答案,因为这将作为我的人工神经网络中节点之间连接的权重。我试过在numpy找,但没有运气。有没有办法计算exp(300000)上的常规python数学和numpy模块将溢出的e^(-x) 您需要的是一个任意精度浮点库 预请求:pip安装mpmath from mpmath import * mp.dps=300 print exp(300000) 2.21090954962043147554

我用了一个S形函数作为我的人工神经网络。我传递给函数的值范围为10000到300000。我需要一个高精度的答案,因为这将作为我的人工神经网络中节点之间连接的权重。我试过在numpy找,但没有运气。有没有办法计算exp(300000)上的常规python数学和numpy模块将溢出的
e^(-x)

您需要的是一个任意精度浮点库

预请求:
pip安装mpmath

from mpmath import *
mp.dps=300
print exp(300000)
2.21090954962043147554031964344003334958746533182776533253160702399084245726328190320934903726540800347936047182773804396858994958295396516475277561815722954583856797032504775443385287094864178178111231967140927970972263439977028621274619241097429676587262948251263990280758512853239132411057394977398e+130288

另请参见

@Paul已经为您提供了计算问题的答案

然而,从神经网络的角度来看,你的问题表明你做错了什么。神经网络没有合理的用途,你必须计算这样的数字。您似乎忘记了至少一项:

  • 输入数据缩放/标准化/标准化
  • 小权界初始化
  • 当网络规模增大时,使权值保持较小的正则化项

所有这些元素都是使用神经网络的基本和关键部分。我建议大家看看Haykin的神经网络和学习机。

decimal
来自stdlib的模块允许以所需的精度计算exp(-300000):

>>> import decimal
>>> decimal.getcontext().prec = 300
>>> decimal.Decimal(-300000).exp()
Decimal('4.52302537736869338168154543856941208987901785730658877589102779454404342316583413710153707357620016787644963947448152347606024065141665176979995260298156742722510150887341893137830615617098803353373668680329179329422367091094657806579661636984526349130940466600671093389647604708034230900336526970689E-130289')

我同意:如果你需要它,那么你的神经网络就出了问题。

看看
GMPY
库或者pythonBy Euler number中的
long
数字类型,你是指
e~=2.71828
还是指?哦,很抱歉搞混了,我的意思是e~2.71如果输入的范围给你带来问题,那么缩放输入是否更有意义?我在谷歌上搜索了一下,看看是否可以这样做。仅仅因为它可以做到,并不意味着它应该…谢谢你!但是当我在做sigmoid函数时,
exp(-300000)+1
,它只输出
1
。你需要超过130000个数字<代码>mp.dps设置精度。看起来它会做到的。。。但是你可能想测试一下。。。而那些150k位的对象将需要内存。我正在做的是
mp.dps=130000
,然后,
print exp(-300000)+1
它仍然输出
1
mp.dps=300
更改为
mp.dps=150000
,并且您将获得更多的数字,因此1+exp(-300000)输出1。一堆零,然后是exp(-300000)中的数字。如果我使用
mp,我也会得到1。dps=130000
,这还不够。感谢您的输入!我已经将初始权重从(-0.5,0.5)调整,输入层有2304+1个偏差节点,因为我正在训练面部表情识别器。输入层中节点的每个值的范围为0到255。也就是说,隐藏层中的1个节点仍然可以有一个非常大的数目。首先,输入值也应该缩放到例如[0,1](或者更好的[-1,1]),这样隐藏节点中的最大节点数就变成了0.5*2304=1152,并且这个界限仅对于最大初始值和完全白色的图像是可以实现的。hayking中也有一些经验法则,说明了初始化界限应该是什么。另外,如果您使用的是sigmoid,您可以尝试计算tanh(它是相同的函数,但“直接”可计算),我找不到我的错误。“我认为我做的一切都是正确的。@拉尔森:如果你认为这个值不是一个错误,那么你应该找出如何在使用它的上下文中以合理(小)的精度计算它的近似值(
e**-x
是0表示大的
x
1+e**-x
1
,您需要在程序中找到表达式,其中
e**-x!=0
起作用)