Um die Frage zu formulieren, wollen wir in der Informatik häufig das Produkt mehrerer Wahrscheinlichkeiten berechnen:
P(A,B,C) = P(A) * P(B) * P(C)
Am einfachsten ist es, diese Zahlen einfach zu multiplizieren, und genau das wollte ich tun. Mein Chef sagte jedoch, es sei besser, das Protokoll der Wahrscheinlichkeiten hinzuzufügen:
log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))
Dies gibt die Log-Wahrscheinlichkeit an, aber wir können die Wahrscheinlichkeit bei Bedarf nachträglich ermitteln:
P(A,B,C) = e^log(P(A,B,C))
Das Hinzufügen von Protokollen wird aus zwei Gründen als besser angesehen:
- Es verhindert "Unterlauf", wobei das Produkt der Wahrscheinlichkeiten so klein ist, dass es auf Null gerundet wird. Dies kann häufig ein Risiko darstellen, da die Wahrscheinlichkeiten häufig sehr gering sind.
- Es ist schneller, da viele Computerarchitekturen die Addition schneller ausführen können als die Multiplikation.
Meine Frage betrifft den zweiten Punkt. So habe ich es beschrieben gesehen, aber es berücksichtigt nicht die zusätzlichen Kosten für das Abrufen des Protokolls! Wir sollten "Kosten für Log + Kosten für Addition" mit "Kosten für Multiplikation" vergleichen. Ist es noch kleiner, wenn man das berücksichtigt?
Auch die Wikipedia-Seite ( Log-Wahrscheinlichkeit ) ist in dieser Hinsicht verwirrend und besagt: "Die Konvertierung in die Log-Form ist teuer, fällt aber nur einmal an." Ich verstehe das nicht, weil ich denke, dass Sie vor dem Hinzufügen das Protokoll jedes Begriffs unabhängig erstellen müssten. Was vermisse ich?
Schließlich ist die Rechtfertigung, dass "Computer Additionen schneller ausführen als Multiplikationen", etwas vage. Ist das spezifisch für den x86-Befehlssatz oder ist es eine grundlegendere Eigenschaft von Prozessorarchitekturen?
Antworten:
Wenn Sie nur einmal berechnen möchten , dann haben Sie Recht. Sie müssen n Logarithmen und n - 1 Additionen berechnen , während die naive Methode n - 1 Multiplikationen erfordert .P(A1)…P(An) n n−1 n−1
Es ist jedoch sehr häufig, dass Sie Fragen des Formulars beantworten möchten:
In diesem Fall können Sie Ihre Daten vorverarbeiten, um das gesamte nur einmal zu berechnen , und jede Abfrage mit | beantworten Ich | Ergänzungen.logP(Ai) |I|
Dies ist eine weiter gefasste Frage. Im Allgemeinen ist es (wahrscheinlich?) Schwieriger, die Multiplikation zu berechnen als die Addition. Die Berechnung von ist linear in der Größe von a und b (unter Verwendung des trivialen Algorithmus), wohingegen wir derzeit nicht wissen, wie man a × b mit der gleichen zeitlichen Komplexität berechnet (überprüfen Sie die besten Algorithmen hier ).a+b a b a×b
Natürlich gibt es keine definitive Antwort: zum Beispiel , wenn Sie mit ganzen Zahlen beschäftigen nur und Sie vermehren sich durch Potenzen von , dann sollten Sie eher Verschiebung mit Zusatzoperationen vergleichen.2
Dies ist jedoch eine vernünftige Aussage für alle gängigen Computerarchitekturen: Die Multiplikation mit Gleitkommazahlen ist langsamer als die Addition.
quelle
Mit "einmal angefallen" ist wahrscheinlich gemeint, dass wenn SieN p1,...pN pi
Schließlich ist die Addition schneller als die Multiplikation, nicht wegen der Maschinenarchitektur. Die Addition ist von Natur aus schneller als die Multiplikation. In Bezug auf die Komplexität braucht esO(n) n O(n2)
Diese Idee ähnelt im Übrigen der modularen Multiplikation nach Montgomery, bei der Multiplikationen in der Montgomery-Form durchgeführt werden, die viel schneller ist als die übliche Multiplikation und anschließende Reduktion.
quelle