python中的sigmoid函数

Tis*_*box 1 python math sigmoid

我试图理解为什么我的sigmoid函数当输入是37时,它输出1. sigmoid函数:

import math

def sigmoid(x):
    return 1 / (1 + math.e ** -x)
Run Code Online (Sandbox Code Playgroud)

我不擅长数学,但我认为永远不应该有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
Run Code Online (Sandbox Code Playgroud)

所以例如我想做的

p5map(y, 0, 1, -37, 37)
Run Code Online (Sandbox Code Playgroud)

其中y在S形曲线中为f(x),-37和37分别为f(x)为0和1.使用-37和37对我不起作用所以我要问的是为什么它是37以及如何解决这个问题所以它介于-1和1之间

Ror*_*ton 5

您正在使用常规浮点数,它只能包含15或16位有效数字.当你评估math.e**-37结果时

8.533047625744083e-17
Run Code Online (Sandbox Code Playgroud)

当您将其添加到一个时,您可能想要获得

1.00000000000000008533047625744083
Run Code Online (Sandbox Code Playgroud)

但计算机实际上删除了除前16位以外的所有数字并给出

1.000000000000000
Run Code Online (Sandbox Code Playgroud)

这很简单1.事实上,加入1e-161只是给1.当你添加时,你会得到一个不同于你的东西1e-15但是比你正在尝试的东西更大.

有几种方法可以获得你想要的东西.一种方法是使用Python的十进制模块,它可以为您的数字和计算添加更多有效数字,并且您可以添加任意数量的数字和计算.使用小数,

from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))
Run Code Online (Sandbox Code Playgroud)

你得到

Decimal('0.9999999999999999146695237430')
Run Code Online (Sandbox Code Playgroud)

所得S形函数1/(1+D(37).exp())用于-37

Decimal('8.533047625744065066149031992E-17')
Run Code Online (Sandbox Code Playgroud)

这不是零.

另一个解决方案是使用另一个sigmoid函数,与您使用的函数不同,它比您的速度慢1倍.接近1缓慢的是

0.5 * (1 + x / (1 + abs(x)))
Run Code Online (Sandbox Code Playgroud)

这样做可以37收益

0.986842105263158
Run Code Online (Sandbox Code Playgroud)

这是远远的1,结果-37

0.01315789473684209
Run Code Online (Sandbox Code Playgroud)

选择所需的解决方案.