簡體   English   中英

python中的sigmoid函數

[英]sigmoid function in python

我試圖理解為什么我的S形函數在輸入為37時會輸出1. S形函數:

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在S型曲線中為f(x),-37和37將分別為f(x)為0和1。 使用-37和37對我不起作用,所以我要問的是為什么它是37,以及如何解決這個問題,所以它在-1和1之間

您正在使用常規浮點數,該浮點數只能包含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')

-37的結果sigmoid函數1/(1+D(37).exp())

Decimal('8.533047625744065066149031992E-17')

不為零

另一種解決方案是使用另一個Sigmoid函數,該函數與您使用的函數不同,它比您更慢地接近1。 慢慢接近1

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

這樣做達到37產量

0.986842105263158

遠離1 ,並且-37的結果是

0.01315789473684209

選擇所需的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM