परिवर्तित करना (सामान्य करना) प्रायिकता के लिए बहुत कम संभावना मूल्यों को दर्शाता है


21

मैं एक एल्गोरिथ्म लिख रहा हूं, जहां एक मॉडल दिया गया है, मैं डेटासेट की एक सूची के लिए संभावना की गणना करता हूं और फिर संभावना में से हर एक को सामान्य (संभाव्यता) करने की आवश्यकता होती है। तो कुछ [0.00043, 0.00004, 0.00321] की तरह परिवर्तित हो सकता है [0.2, 0.03, 0.77]।

मेरी समस्या यह है कि लॉग लाइबिलिटीज, मैं जिसके साथ काम कर रहा हूं, वह काफी छोटा है (उदाहरण के लिए, लॉग स्पेस में, मान -269647.432, -231444.981 आदि) हैं। मेरे C ++ कोड में, जब मैं उनमें से दो को जोड़ने की कोशिश करता हूं (उनके घातांक को ले कर) मुझे "Inf" का उत्तर मिलता है। मैंने उन्हें लॉग-स्पेस ( लॉग का जोड़ / घटाव) में जोड़ने की कोशिश की , लेकिन फिर से उसी समस्या पर ठोकर खाई।

क्या कोई इस पर अपनी विशेषज्ञ राय साझा कर सकता है?


जब आपने को शामिल करने के लिए गए कार्यों का उपयोग किया था, तो क्या आपने अपनी भाषा में फ़ंक्शन का उपयोग किया था ? यह टेलर के विस्तार का उपयोग करता है लगभग 1.log(1+)log1p
नील जी

1
कुछ पहले भी देखें, संबंधित चर्चा यहाँ
Glen_b -Reinstate Monica

जवाबों:


30

सभी लॉग से अधिकतम लघुगणक घटाना। सभी परिणामों को फेंक दें जो बहुत नकारात्मक हैं वे घातीय को कम कर देंगे। (उनकी संभावनाएं सभी व्यावहारिक उद्देश्यों के लिए हैं, शून्य।)

वास्तव में, यदि आप चाहते हैं कि एक सटीक परिशुद्धता of (जैसे कि परिशुद्धता के अंकों के लिए ) और आपके पास संभावनाएं हैं, तो किसी भी परिणाम को के लघुगणक से कम फेंक दें । फिर परिणामी मूल्यों को प्रतिपादित करने के लिए सामान्य रूप से आगे बढ़ें और सभी घातांक के योग से प्रत्येक को विभाजित करें।ε = 10 - डी डी एन ε / nϵϵ=10ddnϵ/n

सूत्र पसंद करने वालों के लिए, लघुगणक को साथ । आधार लिए लघुगणक के लिए , परिभाषित करेंλ n = अधिकतम ( λ i ) b > 1λ1,λ2,,λnλn=max(λi)b>1

αi={bλiλn,λiλnlog(ϵ)log(n)0otherwise.

सामान्यीकृत संभावना समान , यह काम करता है क्योंकि सभी को अन्यथा शून्य से हुए से कुल त्रुटि हो जाती है , क्योंकि और सभी गैर-ऋणात्मक हैं, भाजक , शून्य-प्रतिस्थापन नियम के कारण कुल सापेक्ष त्रुटि कड़ाई से से छोटी है। । मैं = 1 , 2 , ... , एन अल्फा मैं ( n - 1 ) ε / n < ε अल्फा n = λ n - λ n = 0 = 1 अल्फा मैं एक = Σ जे अल्फा जे1 ( ( n - 1αi/j=1nαji=1,2,,n.αi(n1)ϵ/n<ϵαn=bλnλn=b0=1αiA=jαj1((n1)ϵ/n)/A<ϵ

बहुत अधिक गोलाकार त्रुटि से बचने के लिए, के सबसे छोटे मूल्यों के साथ शुरू होने वाले योग की गणना करें । यह स्वचालित रूप से किया जाएगा जब को पहले बढ़ते क्रम में क्रमबद्ध किया जाता है। यह केवल बहुत बड़े लिए एक विचार है ।λ i nαiλin

BTW, इस नुस्खे ने माना कि लॉग का आधार से अधिक है । आधार लिए से कम है , पहले सभी लॉग को नकार दें और आगे बढ़ें जैसे कि आधार बराबर था ।बी 1 1 / बी1b11/b


उदाहरण

लॉगरिदम (प्राकृतिक लॉग, कहते हैं) के साथ और साथ तीन मान होने दें अंतिम सबसे बड़ा है; प्रत्येक मूल्य से इसे घटाकर और- 231444.981 , - 231444.699। - 38202.733 , - 0.282 , 0।269647.432, 231444.981,231444.699.38202.733, 0.282,0.

मान लीजिए कि आप IEEE डबल्स (लगभग 16 दशमलव अंक) के लिए सटीक तुलना करना चाहते हैं, ताकि और । (आप वास्तव में इस सटीकता को प्राप्त नहीं कर सकते हैं, क्योंकि केवल तीन महत्वपूर्ण आंकड़ों को दिया गया है, लेकिन यह ठीक है: हम केवल उन मूल्यों को फेंक रहे हैं जो आपको परिशुद्धता और वास्तव में आपके द्वारा सटीक परिशुद्धता को प्रभावित नहीं करने की गारंटी देते हैं। है।) कंप्यूट = = तीन अंतरों में से पहला, इस से कम है, इसलिए इसे फेंक दें, सिर्फ छोड़कर और करना n = 3 - 0.282 लॉग ( ε / n ) लॉग ( 10 - 16 ) - लॉग ( 3 ) - ३७.९३,९९७। - 38202.733 , - 0.282 0. एक्सप ( - 0.282 ) = 0.754 एक्सप ( 0 ) = 1 0 0.754 / ( 1 + 0.754 ) =ϵ=1016n=30.282log(ϵ/n)log(1016)log(3)37.93997.38202.733,0.2820.exp(-0.282)=0.754 और (बेशक)। सामान्यीकृत मान हैं - क्रम में - लिए जिसे आपने फेंक दिया, , और ।exp(0)=101 / ( 1 + 0.754 ) = 0.5700.754/(1+0.754)=0.4301/(1+0.754)=0.570


यह शानदार है - इतना सरल है, और बहुत स्पष्ट है। @ इकरम, कृपया इसे सही उत्तर के रूप में चिह्नित करें! (जब तक कि आपके पास कुछ बेहतर न हो, जिस स्थिति में कृपया शेयर करें)
zelanix

2
@ क्या हमें भी दूर फेंकने की आवश्यकता है ? एक्सपेरीनेटिंग जो हमें वैसे भी शून्य देता है, और इसलिए यह राशि में योगदान नहीं करेगा। -38202.733
टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.