2010-09-13 10 views
21

में मेरे पास पाइथन में प्रोग्राम किया गया एक बेयसियन क्लासिफायरफायर है, समस्या यह है कि जब मैं सुविधाओं की संभावनाओं को गुणा करता हूं तो मुझे बहुत कम फ्लोट मान जैसे 2.5e-320 या कुछ ऐसा मिलता है, और अचानक यह बदल जाता है 0.0। 0.0 स्पष्ट रूप से मेरे लिए उपयोग नहीं है क्योंकि मुझे "सर्वोत्तम" श्रेणी मिलनी चाहिए, जिस पर आधारित वर्ग MAX मान (अधिक मूल्य) देता है।पाइथन में छोटे फ्लोट्स शून्य

इससे निपटने का सबसे अच्छा तरीका क्या होगा? मैंने संख्या (-320) के घातीय भाग को खोजने के बारे में सोचा और, यदि यह बहुत कम हो जाता है, तो मूल्य 1e20 या उस तरह के कुछ मूल्य को गुणा करता है। लेकिन शायद एक बेहतर तरीका है?

+23

यह गणित नहीं है। गणित में, सकारात्मक संख्या मनमाने ढंग से छोटी हो सकती है। यह अस्थायी बिंदु है। – recursive

+6

@ एस। लॉट यह निश्चित रूप से किसी भी खिंचाव से गणित प्रश्न नहीं है। इसमें फ्लोटिंग पॉइंट नंबरों और पायथन के साथ-साथ अन्य प्रोग्रामिंग भाषाओं में काम करने के तरीके के साथ सब कुछ है। –

+12

मेरा मानना ​​है कि 2.5e-320 सटीक संभावना है कि एक व्हेल अचानक पेट्यूनिया के कटोरे में बदल जाएगा। – Seth

उत्तर

22

आप जो वर्णन करते हैं वह बेवकूफ बेयस वर्गीकृत के साथ एक मानक समस्या है। आप जवाब खोजने के लिए इसके साथ अंडरफ्लो खोज सकते हैं। या here देखें।

संक्षिप्त उत्तर यह है कि लॉगरिदम के संदर्भ में सभी को व्यक्त करना मानक है। इसलिए संभावनाओं को गुणा करने के बजाय, आप उनके लॉगरिदम को जोड़ते हैं।

आप अन्य एल्गोरिदम के साथ-साथ वर्गीकरण के लिए भी देखना चाहेंगे।

+0

हे! उत्तर के लिए बहुत बहुत धन्यवाद, मैं उसमें देख लूंगा, क्योंकि यह मेरी समस्या को बिल्कुल ठीक करता है। मैं सोच रहा था कि यह सामान्य होना चाहिए क्योंकि मैं 3.14e-05 की कई बार संभावनाओं को गुणा कर रहा हूं, इसलिए वे मेरे क्लासिफायरफायर में बहुत सी फीचर्स के साथ ई-300 स्तर (उदाहरण के लिए) बहुत तेजी से पहुंचते हैं। – Pravel

+0

हाँ, रिकर्सिव के रूप में भी उल्लेख किया गया है, यह लॉगरिदम का उपयोग करके और संभावनाओं को जोड़कर निपटाया जाता है। मुहम्मद द्वारा प्रदान किए गए लिंक में यह सब समझाया गया है। जवाबों के लिए आप सबका धन्यवाद! – Pravel

3

stdlib से Decimal पर एक नज़र डालें।

from decimal import Decimal, getcontext 

getcontext().prec = 320 

Decimal(1)/Decimal(7) 

मैं यहां परिणाम पोस्ट नहीं कर रहा हूं क्योंकि यह काफी लंबा है।

7

Floating point संख्याओं में अनंत परिशुद्धता नहीं है, यही कारण है कि आपने संख्याओं को 0 पर बदल दिया है। क्या आप सभी संभावनाओं को एक बड़े पैमाने पर गुणा कर सकते हैं, ताकि आपकी संख्या एक उच्च श्रेणी में रहे? यदि आप केवल अधिकतम और परिमाण के बारे में चिंतित हैं, तो आपको अंत में विभाजित करने की भी आवश्यकता नहीं है। वैकल्पिक रूप से आप एक अनंत सटीक दशमलव का उपयोग कर सकते हैं, जैसे ikanobori सुझाव देता है।

17

क्या आपके काम को लॉगरिदमिक स्थान में करना संभव होगा? (उदाहरण के लिए, 1e-320 को संग्रहीत करने के बजाय, बस -320 स्टोर करें, और गुणा के बजाय अतिरिक्त उपयोग करें)

+0

हे! आपका समाधान बहुत अच्छा लगता है। यह बहुत सरल है और कोशिश करने में काफी आसान लगता है। धन्यवाद! मैं कोशिश करुंगा। – Pravel