Çok küçük olasılık değerlerini olasılık olasılığına dönüştürme (normalleştirme)


21

Bir model verildiğinde, veri setleri listesi için olasılıkları hesapladığım ve sonra olasılıkların her birini normalleştirme (olasılık) gerektiren bir algoritma yazıyorum. Böylece [0.00043, 0.00004, 0.00321] gibi bir şey [0.2, 0.03, 0.77] gibi olabilir.

Benim sorunum, çalışmakta olduğum log olasılıklarının oldukça küçük olması (örneğin, log alanında, değerler -269647.432, -231444.981 vb.). C ++ kodumda ikisini eklemeye çalıştığımda (üslerini alarak) "Inf" cevabını alıyorum. Onları kütük boşluğuna eklemeye çalıştım ( kütüğün Toplanması / Çıkarılması) , fakat yine aynı problem üzerine tökezledi.

Birileri bu konuda uzman fikrini paylaşabilir mi?


işaret ettiğiniz işlevleri günlük(1+...)kullandığınızda, log1pişlevi kendi dilinizde mi kullandınız ? Bu, Taylor'ın 1 civarında genişlemesini kullanır.
Neil G

1
Ayrıca daha önce bazı, burada
Glen_b -Reinstate Monica

Yanıtlar:


30

Tüm loglardan maksimum logaritmayı çıkarın. O kadar negatif olan tüm sonuçları atın ki bunlar üstelden aşağı akacak. (Olasılıkları, tüm pratik amaçlar için sıfırdır.)

Aslında, göreceli hassasiyetini istiyorsanız ε(örneğin, d basamak haneleri için gibi ) ve n olasılıklarınız varsa, ϵ / n logaritmasından daha az bir sonuç atarsınız . Ardından ortaya çıkan değerleri üstelleştirmek ve her birini üstellerin toplamına bölmek için her zamanki gibi devam edin.ε=10-ddnε/n

Formüller gibi, logaritma olalım olanlar için ile Âλ1,λ2,...,λn . B > 1 tabanına logaritmalar içintanımlayın.λn=maksimum(λben)b>1

αben={bλben-λn,λben-λngünlük(ε)-günlük(n)0aksi takdirde.

Normalleştirilmiş olasılıklar , i = 1 , 2 , , n'ye eşittir . Aksi underflowing tüm değiştirilmesi Bu çalışmalar için α i sıfır ile en toplam hata yapar ( n - 1 ) ε / n < £ değerinin ise, çünkü α n bir = Σ j α j1αben/Σj=1nαjben=1,2,...,n.αben(n-1)ε/n<ε ve tümü α i negatif değildir,, sıfır değiştirme kuralı nedeniyletoplamgörecelihata kesinlikledeğerinden daha küçüktür., istediğiniz gibi.αn=bλn-λn=b0=1αbenbir=Σjαj1((n-1)ε/n)/bir<ε

Çok fazla yuvarlama hatasından kaçınmak için, en küçük değerleriyle başlayan toplamı hesaplayın . Bu, λ i önce artan düzende sıralandığında otomatik olarak yapılacaktır . Bu yalnızca çok büyük bir husustur n .αbenλbenn

BTW, bu reçete günlüklerinin taban büyüktür varsayılır . Bazlar için b az taban eşit sanki ve birinci negate tüm günlükleri devam .1b1 / b11/b


Örnek

Logaritma ile üç değer olmasına izin verin (doğal loglar, diyelim) - 231444.981-269647.432, ve - 231.444,699. Sonuncusu en büyüğüdür; Her değer çıkarılmadan verir - 38202.733 , - 0.282 , ve 0.231444.981,231444.699.38202.733, 0.282,0.

Eğer, IEEE çift (16 hakkında ondalık hane) ile karşılaştırılabilir hassasiyet istiyoruz varsayalım böylece ve ve n = 3 olur . (Bu hassasiyeti gerçekten başaramazsınız, çünkü - 0.282 yalnızca üç önemli rakama verilir, ancak sorun değil: biz sadece istediğiniz hassasiyeti ve gerçekte hassasiyetinizi daha iyi etkilememesi garanti edilen değerleri atarız. var.) Hesaplama günlüğü ( ϵ / n ) = log ( 10 - 16 ) - log ( 3 ) = -ϵ=1016n=30.282log(ϵ/n)log(1016)log(3) , üç farklılıkların ilk - 38202,733 , az bundan daha, bu nedenle sadece bırakarak at gitsin - 0.28237.93997.38202.733,0.282 Bunları üstelleştirmek , exp ( - 0.282 ) = 0.754 ve exp ( 0 ) = 1 (elbette) verir. Normalleştirilmiş değerler - sırayla--0.exp(0.282)=0.754exp(0)=1 uzağa attı biri için, 0.754 / ( 1 + 0.754 ) = 0.430 ve 1 / ( 1 +00.754/(1+0.754)=0.430 .1/(1+0.754)=0.570


Bu harika - çok basit ve çok açık bir şekilde görülebiliyor. @ İkram, lütfen bunu doğru cevap olarak işaretleyin! (tabii ki daha iyi bir şeye sahip değilseniz, bu durumda lütfen paylaşın)
zelanix

2
@whuber atmamız bile gerekiyor mu ? Üstelik bu, üstelik bize sıfırı veren ve böylece toplamı da etkilemeyecek. -38202.733
Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.