2017-06-09 7 views
1

Je suis en train de comprendre pourquoi ma fonction sigmoïde lorsque l'entrée est 37, il sortie 1. la fonction sigmoïde:fonction sigmoïde en python

import math 

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

Je ne suis pas bon en mathématiques, mais je pense qu'il ne devrait jamais être un moment où le f (x) est égal à 1 droit? peut-être parce que la constante e n'est pas assez précise mais mon vrai problème est que je veux mapper un nombre entre 0 et 1 à ce qui est x quand f (x) est 0 et que x est quand f (x) est 1. ma carte fonction:

def p5map(n, start1, stop1, start2, stop2): 
    return ((float(n)-start1)/(stop1-start1))*(stop2-start2)+start2 

donc pour exemple je veux faire

p5map(y, 0, 1, -37, 37) 

où y serait f (x) dans la courbe sigmoïde et -37 et 37 serait le cas où f (x) est égal à 0 et 1 respectivement. en utilisant -37 et 37 ne fonctionnerait pas pour moi alors ce que je demande est pourquoi est-il 37 et comment puis-je résoudre ce problème entre -1 et 1 par exemple

+2

C'est simple: 'math.e ** -37' se rapproche de 0, en évaluant l'expression entière à' 1/1' qui est 1. –

+2

Mais utilisez 'math.exp (x)' plutôt que 'math.e ** x'. –

Répondre

5

Vous travaillez avec des nombres à virgule flottante, qui ne peut contenir que 15 ou 16 chiffres significatifs. Lorsque vous évaluez math.e**-37 le résultat est

8.533047625744083e-17 

Lorsque vous ajoutez cela à un, vous pouvez obtenir

1.00000000000000008533047625744083 

mais l'ordinateur en vigueur supprime tout sauf les 16 premiers chiffres et donne

1.000000000000000 

qui est simplement 1. En fait, ajouter 1e-16 à 1 donne simplement 1. Vous obtenez quelque chose d'autre qu'un lorsque vous ajoutez 1e-15 mais c'est plus grand que ce que vous essayez.

Il existe plusieurs façons d'obtenir ce que vous voulez. Une façon est d'utiliser le module décimal de Python, qui ajoute beaucoup plus de chiffres significatifs à vos nombres et calculs, et vous pouvez en ajouter autant que vous le souhaitez. En utilisant décimal,

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

vous obtenez

Decimal('0.9999999999999999146695237430') 

et la fonction sigmoïde résultant 1/(1+D(37).exp()) pour -37 donne

Decimal('8.533047625744065066149031992E-17') 

qui est non nul.

Une autre solution consiste à utiliser une autre fonction sigmoïde, différente de celle que vous utilisez, qui se rapproche de 1 plus lentement que la vôtre. Celui qui se rapproche 1 est lentement

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

Faire que pour 37 rendements

0.986842105263158 

qui est loin d'1, et le résultat pour -37 est

0.01315789473684209 

Choisissez votre solution désirée.

+0

Très belle réponse et bien expliquée. – sachinjain024