Pour formuler la question, en informatique, nous voulons souvent calculer le produit de plusieurs probabilités:
P(A,B,C) = P(A) * P(B) * P(C)
L'approche la plus simple consiste simplement à multiplier ces nombres, et c'est ce que j'allais faire. Cependant, mon patron a dit qu'il valait mieux ajouter le journal des probabilités:
log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))
Cela donne la probabilité logarithmique, mais nous pouvons obtenir la probabilité par la suite si nécessaire:
P(A,B,C) = e^log(P(A,B,C))
L'ajout de journaux est considéré comme meilleur pour deux raisons:
- Il empêche le "sous-dépassement" par lequel le produit des probabilités est si petit qu'il est arrondi à zéro. Cela peut souvent être un risque car les probabilités sont souvent très faibles.
- C'est plus rapide car de nombreuses architectures informatiques peuvent effectuer l'addition plus rapidement que la multiplication.
Ma question porte sur le deuxième point. C'est ainsi que je l'ai vu décrit, mais il ne prend pas en compte le coût supplémentaire d'obtention du journal! Nous devrions comparer le "coût du journal + le coût de l'addition" au "coût de la multiplication". Est-il encore plus petit après en avoir tenu compte?
De plus, la page Wikipédia ( probabilité de journalisation) prête à confusion à cet égard, déclarant que "la conversion sous forme de journal est coûteuse, mais n'est engagée qu'une seule fois". Je ne comprends pas cela, car je pense que vous auriez besoin de prendre le journal de chaque terme indépendamment avant d'ajouter. Qu'est-ce que je rate?
Enfin, la justification selon laquelle "les ordinateurs effectuent l'addition plus rapidement que la multiplication" est assez vague. Est-ce spécifique au jeu d'instructions x86, ou s'agit-il d'un trait plus fondamental des architectures de processeur?
Réponses:
Si vous voulez juste calculer une fois, alors vous avez raison. Vous devrez calculer logarithmes et additions, alors que la méthode naïve nécessite multiplications.n n - 1 n - 1P( A1) … P( An) n n - 1 n - 1
Cependant, il est très courant que vous souhaitiez répondre aux requêtes du formulaire:
Dans ce cas, vous pouvez prétraiter vos données pour calculer tous les une seule fois et répondre à chaque requête en faisantajouts.| Je |JournalP( Aje) | je|
C'est une question plus large. En général, il est (probablement?) Plus difficile de calculer la multiplication que l'addition. Le calcul de est linéaire dans la taille de et (en utilisant l'algorithme trivial), alors que nous ne savons pas actuellement comment calculer avec la même complexité temporelle (vérifiez les meilleurs algorithmes ici ).a b a × ba + b une b a × b
Bien sûr, il n'y a pas de réponse définitive: par exemple, si vous ne traitez qu'avec des entiers et que vous multipliez par des puissances de , vous devriez plutôt comparer shift avec add operations.2
Néanmoins, c'est une déclaration raisonnable sur toutes les architectures informatiques courantes: la multiplication sur des nombres à virgule flottante sera plus lente que l'addition.
la source
Soit dit en passant, cette idée est similaire à la multiplication modulaire de Montgomery, où les multiplications sont effectuées sous la forme de Montgomery qui est assez rapide que la multiplication et la réduction habituelles.
la source