我试图理解为什么当输入为37时我的sigmoid函数,它输出1. sigmoid函数:
import math
def sigmoid(x):
return 1 / (1 + math.e ** -x)
我在数学方面不擅长,但我认为永远不应该有一个f(x)等于1的时刻?也许是因为e常数不够精确但是我真正的问题是我想将0和1之间的数字映射到f(x)为0时的x是什么,当f(x)是1时x是什么。我的地图功能:
def p5map(n, start1, stop1, start2, stop2):
return ((float(n)-start1)/(stop1-start1))*(stop2-start2)+start2
所以例如我想做
p5map(y, 0, 1, -37, 37)
其中y在sigmoid曲线中为f(x),-37和37将分别为f(x)为0和1。使用-37和37对我来说不起作用,所以我要问的是为什么它是37以及如何解决这个问题所以它介于-1和1之间为例如
答案 0 :(得分:5)
您正在使用常规浮点数,它只能包含15或16位有效数字。评估math.e**-37
时,结果为
8.533047625744083e-17
当您将其添加到一个时,您可能想要
1.00000000000000008533047625744083
但是计算机实际上会删除除前16位以外的所有数字并给出
1.000000000000000
只是1
。实际上,将1e-16
添加到1
只会提供1
。当你添加1e-15
时,你会得到一个不同于你的东西,但这比你正在尝试的要大。
有几种方法可以获得你想要的东西。一种方法是使用Python的十进制模块,它可以为您的数字和计算添加更多有效数字,并且您可以添加任意数量的数字和计算。使用小数,
from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))
你得到了
Decimal('0.9999999999999999146695237430')
,1/(1+D(37).exp())
得到的sigmoid函数-37
给出了
Decimal('8.533047625744065066149031992E-17')
不是零。
另一个解决方案是使用另一个sigmoid函数,与您使用的函数不同,比您的函数慢1。慢慢接近1
的是
0.5 * (1 + x / (1 + abs(x)))
这样做37
会产生
0.986842105263158
远离1
,-37
的结果是
0.01315789473684209
选择所需的解决方案。