2017-06-09 2 views
1

Ich versuche, warum Funktion meiner Sigmoid zu verstehen, wenn der Eingang 37, es Ausgang 1. die Sigmoidfunktion:Sigmoidfunktion in Python

import math 

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

Ich bin nicht gut in Mathe, aber ich denke, es nie sein sollte ein Moment, wo das f (x) gleich 1 ist, richtig? vielleicht liegt es daran, dass die e-Konstante nicht genau genug ist, aber mein wirkliches Problem ist, dass ich eine Zahl zwischen 0 und 1 zuordnen möchte, was x ist, wenn f (x) 0 ist und was x ist, wenn f (x) 1. ist Funktion:

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

so für exemple I

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

wo die y F sein würde (x) in der Sigmoid-Kurve und -37 und 37 wäre, wo f (x) 0 tun möchte, ist und 1 jeweils. mit -37 und 37 würde nicht funktionieren für mich, also was ich fragen ist, warum ist es 37 und wie kann ich das beheben, so ist es zwischen -1 und 1 für Beispiel

+2

Es ist einfach: 'math.e ** -37' nähert sich an 0 und bewertet den ganzen Ausdruck zu' 1/1', also 1. –

+2

Aber verwende 'math.exp (x)' anstatt 'math.e ** x'. –

Antwort

5

Sie arbeiten mit regulären Gleitkommazahlen, die kann nur 15 oder 16 signifikante Ziffern enthalten. Wenn Sie math.e**-37 das Ergebnis zu bewerten ist

8.533047625744083e-17 

Wenn Sie das zu einem hinzufügen, können Sie

1.00000000000000008533047625744083 

aber der Computer in der Tat alle, aber die ersten 16 Ziffern entfernt zu bekommen und gibt

1.000000000000000 

das ist einfach 1. Tatsächlich ergibt das Hinzufügen von 1e-16 zu 1 nur 1. Sie erhalten etwas anderes als eins, wenn Sie 1e-15 hinzufügen, aber das ist größer als das, was Sie versuchen.

Es gibt mehrere Möglichkeiten, um zu bekommen, was Sie wollen. Eine Möglichkeit besteht darin, das Python-Dezimalmodul zu verwenden, das Ihren Zahlen und Berechnungen viel mehr signifikante Ziffern hinzufügt, und Sie können so viele hinzufügen, wie Sie möchten. Mit dezimal,

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

Sie

Decimal('0.9999999999999999146695237430') 

und die resultierende Sigmoidfunktion 1/(1+D(37).exp()) für -37 gibt

Decimal('8.533047625744065066149031992E-17') 

bekommen, die nicht Null ist.

Eine andere Lösung besteht darin, eine andere sigmoidale Funktion zu verwenden, die sich von der verwendeten sigmoidischen Funktion 1 langsamer nähert als die Ihre. Eines, das 1 nähert sich langsam ist

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

zu tun, die zu 37 Erträge

0.986842105263158 

die weit von 1 und das Ergebnis für -37 ist

0.01315789473684209 

Wählen Sie Ihre gewünschte Lösung.

+0

Sehr schöne Antwort und gut erklärt. – sachinjain024