2017-04-04 40 views
11

Sorunlara neden olan çok küçük olan bazı olasılıklarla çalışmaya çalışıyorum. ÖrneğinÇok küçük sayılarla Aritmetik R

probs <- c(4.225867e-03,3.463125e-04,2.480971e-05,1.660538e-06,1.074064e-07,6.829168e-09,4.305051e-10,2.702241e-11,1.692533e-12,1.058970e-13,6.622117e-15,4.139935e-16,2.587807e-17,1.617488e-18,1.010964e-19,6.318630e-21,3.949177e-22 2.468246e-23,1.542657e-24,9.641616e-26,6.026013e-27,3.766259e-28,2.353912e-29,1.471195e-30,9.194971e-32 

Ancak bu vektör ile aritmetik 12. değerine bakın (.Machine $ double.eps azdır muhtemelen çünkü) sıfıra yuvarlamak sonra her şeyi neden olur. Örneğin:

probs > 0 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

ama

1-probs < 1 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Ben gmp paketini kullanarak denedim ama büyük güçlere kaldırdığında gerçekten yavaş olur combinatoric bazlı hesaplamalar ve as.bigq (probs) yapıyorum.

Bunu aşmanın herhangi bir yolu var mı?

+11

Bu tür sorunların üstesinden gelmek için, günlük olasılıkları ile çalışmak yaygındır, böylece olasılıkları çoğaltma yerine (genellikle küçük olasılıkların sebebi olan) toplayabilirsiniz. – Marius

+2

@Marius Şaşırtıcı bir şekilde, bu bir yinelenen gibi görünmüyor (belki doğru aramadım). Sayısal doğruluğu geliştirmek için R'de log olasılıklarının kullanımı hakkında kanonik bir cevaba sahip olmak güzel olurdu. Belki de yorumunuzu genişletebilir ve cevap verebilirsin. –

+0

@JohnColeman Her dil için ayrı ayrı belirtilecek log-olasılık stratejisine gerçekten ihtiyacımız var mı? Diğer dillerde benzer soruları gördüğümü biliyorum. –

cevap

6

Makine öğrenimi ve diğer istatistiksel bilgi işlem konularında çok küçük olasılıklar söz konusu olur. Kayan nokta sayılarının iç gösteriminin sınırlamaları nedeniyle hassas bir hata alıyorsunuz. Bu keyfi doğruluk aritmetiği kullanılarak çözülebilir, ancak bu genellikle yapılmaz.

En popüler çözüm l og transformation to represent your probabilities kullanmak ve daha sonra çarpma yerine ekleme kullanmaktır. Bu, log-olabilirlik olarak adlandırılır. Bu dönüşüm çok küçük sayılar problemini önler ve ayrıca, log-olabilirlik değerleri, şeylerin olasılığını karşılaştırmak için doğrudan kullanılabilir (daha düşük log-olabilirlik her zaman daha düşük olasılık anlamına gelir).

Bir subtle distinction between likelihood and probability olduğunu unutmayın, ancak günlük sayısı çok az sayıdaki negatif sayılara dönüşen günlük dönüşümü, sayısız yerlerin sayısı dikkate alınmadan çalışır.