Dérivée d'un sigmoid en python
Discutez d'informatique ici !
-
glouphop
- Messages: 4
- Enregistré le: 31 Mar 2018, 11:48
-
par glouphop » 31 Mar 2018, 11:57
Je souhaite afficher la dérivée d'une sigmoïde avec python.
Je reçoit les code d’erreur
TypeError: only length-1 arrays can be converted to Python scalars
pour ds = (math.exp(-x))/((1+math.exp(-x))**2)
et
TypeError: unsupported operand type(s) for -: 'int' and 'list'
pour
ds = sigmoid(x) * (1 - sigmoid(x))
- Code: Tout sélectionner
from matplotlib import pyplot as plt
import numpy as np
import math
def sigmoid(x):
a = []
for item in x:
a.append(1/(1+math.exp(-item)))
return a
x = np.arange(-10., 10., 0.2)
sig = sigmoid(x)
plt.plot(x,sig)
#ds = (math.exp(-x))/((1+math.exp(-x))**2)
ds = sigmoid(x) * (1 - sigmoid(x))
plt.plot(x,ds)
plt.show()
-
pascal16
- Membre Légendaire
- Messages: 6663
- Enregistré le: 01 Mar 2017, 14:58
- Localisation: Angoulème : Ville de la BD et du FFA. gare TGV
-
par pascal16 » 31 Mar 2018, 12:20
1 - sigmoid(x)
1 est un scalaire
sigmoid(x) est un vecteur
2 façons de faire
-> transformer 1 en un vecteur rempli de 1 (si la surcharge de + existe)
-> écrire la fonction ds qui passe une à une les coordonnées de ton vecteur sig
-
fatal_error
- Modérateur
- Messages: 6610
- Enregistré le: 22 Nov 2007, 14:00
-
par fatal_error » 31 Mar 2018, 18:27
et aussi, au lieu de ta def de sigmoid(x)
sigmoid(x):
retyrb 1/(1+math.exp(-x))
#(idem un scalaire)
puis trivialament
sig = map(sigmoid, x)
ou bien
def ds(x):
return s(x)*(1-s(x))
yDer=map(ds,x)
la vie est une fête
-
glouphop
- Messages: 4
- Enregistré le: 31 Mar 2018, 11:48
-
par glouphop » 31 Mar 2018, 22:56
La sigmoïde s'affiche correctement, c'est la dérivée que je ne parvient pas à écrire correctement.
-
glouphop
- Messages: 4
- Enregistré le: 31 Mar 2018, 11:48
-
par glouphop » 01 Avr 2018, 17:01
J'ai résolut le problème avec numpy à la place de math.
- Code: Tout sélectionner
import numpy as np
import sympy as sp
x = sp.Symbol('x')
from scipy.misc import derivative
def f(x):
return 1/(1+np.exp(-x))
def d(x):
return derivative(f,x)
import matplotlib as mpl
import matplotlib.pyplot as plt
y=np.linspace(-3,3)
plt.plot(y,f(y))
plt.plot(y,d(y))
-
pascal16
- Membre Légendaire
- Messages: 6663
- Enregistré le: 01 Mar 2017, 14:58
- Localisation: Angoulème : Ville de la BD et du FFA. gare TGV
-
par pascal16 » 01 Avr 2018, 21:45
Version avec ton code modifié, ie avec des fonctions vectorielles :
- Code: Tout sélectionner
from matplotlib import pyplot as plt
import numpy as np
import math
def sigmoid(x):
a = []
for item in x:
a.append(1/(1+math.exp(-item)))
return a
def ds(x):
a = []
for item in x:
b=1/(1+math.exp(-item))
a.append(b(1-b))
return a
x = np.arange(-10., 10., 0.2)
sig = sigmoid(x)
plt.plot(x,sig)
dsig=ds(x)
plt.plot(x,dsig)
plt.show()
-
glouphop
- Messages: 4
- Enregistré le: 31 Mar 2018, 11:48
-
par glouphop » 02 Avr 2018, 07:21
Merci Pascal16 ça marche avec une petite correction. Avec ton code j’obtiens pour la ligne 15 [a.append(b(1-b))] le message d'erreur TypeError: 'float' object is not callable, le problème venant de l’omission de * entre b et (1-b).
-
pascal16
- Membre Légendaire
- Messages: 6663
- Enregistré le: 01 Mar 2017, 14:58
- Localisation: Angoulème : Ville de la BD et du FFA. gare TGV
-
par pascal16 » 02 Avr 2018, 15:27
oui, je n'étais pas sur mon pc avec pyzo et python dessus, j'ai réécris le code de mémoire, sans tester.
Ce n 'est peut-être pas le plus beau code au monde, mais si plus tard tu programmes, tu te feras ta propre idée du 'beau' code.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités