2017-09-15 4 views
0

J'essaie d'implémenter une implémentation vectorisée de la distribution gaussienne sans utiliser de fonctions numpy. Pour être clair, je voudrais obtenir le même résultat que ci-dessous sans le forloop.Implémentation vectorisée de la distribution normale

import numpy as np 
import matplotlib.pyplot as plt 
import math 

x = np.linspace(-1, 1, 100) 
y = np.linspace(-1, 1, 100) 

for i in range(0, len(x)): 
    y[i] = normpdf(y[i], 0, .1) 

plt.plot(x, y) 
plt.show() 

def normpdf(x, mean, sd): 
    var = float(sd)**2 
    denom = (2*math.pi*var)**.5 
    num = math.exp(-(float(x)-float(mean))**2/(2*var)) 
    return num/denom 
+0

Pourriez-vous changer votre code afin que normpdf soit défini avant d'être appelé dans la boucle for? –

+0

Quelle est votre raison de vouloir faire cela "sans utiliser de fonctions numpy"? Vous utilisez déjà 'np.linspace', et vous avez dit que vous vouliez une solution vectorisée, ce qui signifie généralement exploiter les méthodes de tableau numpy. Étiez-vous au courant de ['scipy.stats.norm.pdf'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html)? –

+0

C'est comme ça que je l'ai défini dans mon Notebook, ça ne marchera toujours pas vectorisé. @ Ali_m il n'y a pas de raison fonctionnelle, ça fait partie d'un exercice de vectorisation d'un algo ML. –

Répondre

1

Contrairement math.exp, np.exp peut fonctionner (ponctuelle) directement sur les tableaux. Remplacer normpdf par:

def normpdf(x, mean, sd): 
    var = float(sd)**2 
    denom = (2*math.pi*var)**.5 
    num = np.exp(-(x - mean)**2/(2*var)) 
    return num/denom 

Vous pouvez directement appeler normpdf sur x sans la boucle.

Je ne comprends pas vraiment comment vous voulez bénéficier de la vectorisation numpy sans utiliser de fonctions numpy.

+0

Donne moi cette erreur: TypeError: seule la longueur-1 tableaux peuvent être convertis en scalaires Python –

+0

@CharlesLucienFried J'ai supprimé votre flottant inutile() et maintenant cela fonctionne. –

+0

Ah oui merci beaucoup! –