Untuk membingkai pertanyaan, dalam ilmu komputer sering kita ingin menghitung produk dari beberapa probabilitas:
P(A,B,C) = P(A) * P(B) * P(C)
Pendekatan paling sederhana adalah melipatgandakan angka-angka ini, dan itulah yang akan saya lakukan. Namun, bos saya mengatakan lebih baik menambahkan log probabilitas:
log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))
Ini memberikan probabilitas log, tetapi kita bisa mendapatkan probabilitas setelahnya jika perlu:
P(A,B,C) = e^log(P(A,B,C))
Penambahan log dianggap lebih baik karena dua alasan:
- Ini mencegah "underflow" di mana produk probabilitas sangat kecil sehingga dibulatkan menjadi nol. Ini sering bisa menjadi risiko karena probabilitas seringkali sangat kecil.
- Itu lebih cepat karena banyak arsitektur komputer dapat melakukan penambahan lebih cepat daripada perkalian.
Pertanyaan saya adalah tentang poin kedua. Ini adalah bagaimana saya melihatnya dijelaskan, tetapi tidak memperhitungkan biaya tambahan untuk mendapatkan log! Kita harus membandingkan "biaya log + biaya penambahan" ke "biaya penggandaan". Apakah masih lebih kecil setelah memperhitungkannya?
Juga, halaman Wikipedia ( Kemungkinan log ) membingungkan dalam hal ini, yang menyatakan "Konversi ke formulir log mahal, tetapi hanya dilakukan sekali." Saya tidak mengerti ini, karena saya pikir Anda perlu mengambil log dari setiap istilah secara independen sebelum menambahkan. Apa yang saya lewatkan?
Akhirnya, pembenaran bahwa "komputer melakukan penambahan lebih cepat daripada multiplikasi" agak kabur. Apakah itu spesifik untuk set instruksi x86, atau itu beberapa sifat yang lebih mendasar dari arsitektur prosesor?
Jawaban:
Jika Anda hanya ingin menghitung satu kali, maka Anda benar. Anda harus menghitung n logaritma dan penambahan n - 1 , sedangkan metode naif membutuhkan perkalian n - 1 .P(A1)…P(An) n n−1 n−1
Namun, sangat umum bahwa Anda ingin menjawab pertanyaan dari formulir:
Dalam hal ini, Anda dapat memproses data Anda untuk menghitung semua hanya sekali, dan menjawab setiap permintaan dengan melakukan | Aku | tambahan.logP(Ai) |I|
Ini pertanyaan yang lebih luas. Secara umum (mungkin?) Lebih sulit untuk menghitung perkalian daripada penambahan. Komputasi adalah linier dalam ukuran a dan b (menggunakan algoritma trivial), sedangkan kita saat ini tidak tahu bagaimana menghitung a × b dengan kompleksitas waktu yang sama (periksa algoritma terbaik di sini ).a+b a b a×b
Tentu saja tidak ada jawaban pasti: misalnya jika Anda hanya berurusan dengan bilangan bulat dan Anda mengalikannya dengan angka , maka Anda harus membandingkan shift dengan operasi tambah.2
Namun demikian ini adalah pernyataan yang masuk akal pada semua arsitektur komputer umum: perkalian pada angka floating-point akan lebih lambat daripada penambahan.
sumber
Ngomong-ngomong, ide ini mirip dengan multiplikasi modular Montgomery, di mana multiplikasi dilakukan dalam bentuk Montgomery yang jauh lebih cepat daripada multiplikasi biasa dan kemudian reduksi.
sumber