[英]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.