J'ai une situation statistique où je veux trouver la somme de certaines fonctions extrêmement pointues. Autrement dit, étant donné un ensemble de points d'entrée in
et les points de sortie out
, je veux trouver les numéros sum_in f(in,out)
, où f
est extrêmement fortement pointu.Trouver efficacement une somme de fonctions éparses
Pour concrétude, la situation pourrait être quelque chose comme ceci:
import numpy as np
sample_pts = 10 ** 7
data_pts = 10 ** 5
mu = np.random.rand(data_pts)
x = np.linspace(0, 1, sample_pts)
def f(mu, x):
return np.exp(-1e10 * ((mu - x) ** 2))
Ma solution actuelle est juste pour itérer sur les points d'échantillonnage, avec vectorisation sur les points de données:
results = np.zeros(sample_pts)
for i in range(sample_pts):
results[i] = np.sum(f(mu, x[i]))
Cependant, c'est incroyablement inefficace parce que la grande majorité des nombres calculés ici sont très petits - en fait, beaucoup sont zéro à la précision en virgule flottante! Il devrait y avoir assez de place ici pour obtenir une accélération d'un facteur de mille, au moins. Quel est le moyen le plus rapide pour calculer cette somme en numpy, en supposant qu'une petite erreur numérique (disons un sur un milliard) est acceptable?
Comment proposez-vous trouver cette somme sans regarder à chaque élément du tableau? Vous n'avez aucun moyen de savoir à l'avance si une valeur sera petite ou non pour une fonction arbitraire. –
@ErikGodard Le comportement de la fonction réelle est assez simple (il est facile de dire où est le pic), bien que ce soit légèrement plus compliqué que l'exemple ici. – knzhou
* "Cependant, ceci est incroyablement inefficace parce que la grande majorité des nombres calculés ici sont très petits - en fait, beaucoup sont zéro à la précision en virgule flottante! Il devrait y avoir assez de place ici pour obtenir une accélération d'un facteur de un millier, au moins. "* Pourquoi cela indiquerait-il que vous pouvez accélérer la performance? (Vous pouvez certainement, mais pas pour cette raison.) –