python中的sigmoid函数

2024-10-01 07:47:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解为什么我的乙状结肠功能当输入是37,它输出1。乙状结肠功能:

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在乙状结肠曲线中为f(x),而-37和37分别为f(x)为0和1。使用-37和37对我不起作用,所以我要问的是为什么它是37,我如何修复它,例如它在-1和1之间


Tags: import功能returndef常数数字数学math
1条回答
网友
1楼 · 发布于 2024-10-01 07:47:50

您使用的是常规浮点数,它只能包含15或16个有效数字。当您计算math.e**-37时,结果是

8.533047625744083e-17

当你把它添加到一个时,你可能想得到

1.00000000000000008533047625744083

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

1.000000000000000

这就是1。实际上,将1e-16添加到1只会得到1。当你添加1e-15时,你确实得到了一个以外的东西,但这比你正在尝试的要大。

有几种方法可以得到你想要的东西。一种方法是使用Python的decimal模块,它向数字和计算中添加更多的有效数字,您可以添加任意数量的数字。使用十进制

from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))

你得到

Decimal('0.9999999999999999146695237430')

得到的sigmoid函数1/(1+D(37).exp())给出了-37

Decimal('8.533047625744065066149031992E-17')

这不是零。

另一个解决方案是使用另一个乙状结肠功能,不同于你使用的那个,它比你使用的慢得多。慢慢接近1的是

0.5 * (1 + x / (1 + abs(x)))

这样做是为了37产生

0.986842105263158

1很远,结果是-37

0.01315789473684209

选择你想要的解决方案。

相关问题 更多 >