首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的sigmoid函数

python中的sigmoid函数
EN

Stack Overflow用户
提问于 2017-06-09 21:10:57
回答 1查看 9.1K关注 0票数 2

我试图理解为什么当输入为37时我的乙状结肠函数输出1.乙状结肠函数:

代码语言:javascript
复制
import math

def sigmoid(x):
    return 1 / (1 + math.e ** -x)

我数学不好,但我认为永远不应该有f(x)等于1的时刻,对吗?也许是因为e常数不够精确,但是我真正的问题是,当f(x)是0时,我想把一个0到1之间的数字映射到x,当f(x)是1时,映射函数是:

代码语言:javascript
复制
def p5map(n, start1, stop1, start2, stop2):
    return ((float(n)-start1)/(stop1-start1))*(stop2-start2)+start2

所以举个例子我想做

代码语言:javascript
复制
p5map(y, 0, 1, -37, 37)

其中y在乙状结肠曲线中为f(x),-37和37分别为f(x)为0和1。使用-37和37对我不起作用,所以我要问的是为什么是37,我如何解决这个问题,例如-1到1之间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 22:36:12

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

代码语言:javascript
复制
8.533047625744083e-17

当你把它加到一个,你可能想要

代码语言:javascript
复制
1.00000000000000008533047625744083

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

代码语言:javascript
复制
1.000000000000000

这就是简单的1。实际上,将1e-16添加到1只会给1带来好处。当您添加1e-15时,您确实得到了其他的东西,但这比您正在尝试的东西要大。

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

代码语言:javascript
复制
from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))

你会得到

代码语言:javascript
复制
Decimal('0.9999999999999999146695237430')

由此产生的乙状结肠函数1/(1+D(37).exp()) -37给出了

代码语言:javascript
复制
Decimal('8.533047625744065066149031992E-17')

这不是零。

另一种解决方案是使用另一个sigmoid函数,与您使用的函数不同,该函数比您的函数更接近1。一个慢慢接近1的方法是

代码语言:javascript
复制
0.5 * (1 + x / (1 + abs(x)))

这会影响37的产量

代码语言:javascript
复制
0.986842105263158

这与1相去甚远,-37的结果是

代码语言:javascript
复制
0.01315789473684209

选择你想要的解决方案。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44466751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档