การแปลง (การทำให้เป็นปกติ) ค่าความน่าจะเป็นที่น้อยมากเป็นความน่าจะเป็น


21

ฉันกำลังเขียนอัลกอริทึมที่ได้รับแบบจำลองฉันคำนวณความน่าจะเป็นของรายการชุดข้อมูลจากนั้นจำเป็นต้องทำให้เป็นปกติ (เป็นความน่าจะเป็น) แต่ละโอกาส ดังนั้นบางอย่างเช่น [0.00043, 0.00004, 0.00321] อาจถูกแปลงเป็นอาจจะเป็น [0.2, 0.03, 0.77]

ปัญหาของฉันคือความน่าจะเป็นของบันทึกที่ฉันกำลังทำงานอยู่มีขนาดค่อนข้างเล็ก (ตัวอย่างเช่นในพื้นที่บันทึกค่ามีค่าเช่น -269647.432, -231444.981 เป็นต้น) ในรหัส C ++ ของฉันเมื่อฉันพยายามเพิ่มพวกเขาสองคน (โดยการยกกำลังของพวกเขา) ฉันได้รับคำตอบของ "Inf" ฉันพยายามเพิ่มพวกเขาใน log-space (Summation / Subtraction of log)แต่ก็พบปัญหาเดียวกันอีกครั้ง

ใครสามารถแบ่งปันความเห็นของผู้เชี่ยวชาญเกี่ยวกับเรื่องนี้?


เมื่อคุณใช้ฟังก์ชั่นที่คุณชี้ว่าเกี่ยวข้องกับคุณใช้ฟังก์ชั่นในภาษาของคุณหรือไม่? สิ่งนี้ใช้การขยายตัวของเทย์เลอร์ประมาณ 1log(1+)log1p
Neil G

1
ดูบางส่วนก่อนหน้านี้การสนทนาที่เกี่ยวข้องที่นี่
Glen_b -Reinstate Monica

คำตอบ:


30

ลบลอการิทึมสูงสุดจากบันทึกทั้งหมด ทิ้งผลลัพธ์ทั้งหมดที่มีค่าเป็นลบ (ความเป็นไปได้ของพวกเขาคือเพื่อวัตถุประสงค์ในทางปฏิบัติทั้งหมดเป็นศูนย์)

อันที่จริงถ้าคุณต้องการความแม่นยำญาติของ (เช่นสำหรับตัวเลขของความแม่นยำ) และคุณมีโอกาสเกิดทิ้งผลใด ๆ น้อยกว่าลอการิทึมของ n จากนั้นดำเนินการตามปกติเพื่อยกกำลังค่าที่เป็นผลลัพธ์และหารแต่ละค่าด้วยผลรวมของเลขชี้กำลังทั้งหมดϵ = 10 - d d n ϵ / nϵϵ=10ddnϵ/n

สำหรับผู้ที่ชอบสูตรให้ลอการิทึมจะกับlambda_i) สำหรับลอการิทึมถึงฐานb \ gt 1ให้นิยามλ n = สูงสุด( λ i ) b > 1λ1,λ2,,λnλn=max(λi)b>1

αผม={λผม-λn,λผม-λnเข้าสู่ระบบ(ε)-เข้าสู่ระบบ(n)0มิฉะนั้น.

ความเป็นไปได้ที่ทำให้เป็นมาตรฐานเท่ากับ , วิธีนี้ใช้ได้ผลเนื่องจากการแทนที่ underflowingเป็นศูนย์ทั้งหมดทำให้เกิดข้อผิดพลาดทั้งหมดที่มากที่สุดในขณะที่เพราะและทั้งหมดไม่ใช่แบบลบตัวดังนั้นข้อผิดพลาดสัมพัทธ์ทั้งหมดเนื่องจากกฎศูนย์เปลี่ยนมีขนาดเล็กกว่าตามที่ต้องการฉัน= 1 , 2 , ... , n α i ( n - 1 ) ϵ / n < ϵ α n = b λ n - λ n = b 0 = 1 α i A = j α j1 ( ( n - 1αผม/ΣJ=1nαJผม=1,2,...,n.αผม(n-1)ε/n<εαn=λn-λn=0=1αผมA=ΣJαJ1((n-1)ε/n)/A<ε

เพื่อหลีกเลี่ยงการมากเกินไปปัดเศษข้อผิดพลาดการคำนวณผลรวมที่เริ่มต้นด้วยค่าที่เล็กที่สุดของ\สิ่งนี้จะทำโดยอัตโนมัติเมื่อถูกเรียงลำดับตามลำดับที่เพิ่มขึ้นเป็นครั้งแรก นี่เป็นข้อพิจารณาสำหรับมีขนาดใหญ่มากเท่านั้นλ i nαผมλผมn

BTW ยานี้สันนิษฐานว่าฐานของบันทึกที่มีค่ามากกว่า1สำหรับฐานน้อยกว่า , ลบล้างแรกบันทึกและดำเนินการเช่นถ้าฐานเท่ากับ bb 1 1 / b111/


ตัวอย่าง

ให้มีสามค่าด้วยลอการิทึม (บันทึกธรรมชาติ, พูด) เท่ากับและ สุดท้ายคือที่ใหญ่ที่สุด; การลบออกจากแต่ละค่าจะให้และ- 231444.981 , - 231444.699 - 38202.733 , - 0.282 , 0-269647.432, -231444.981,-231444.699-38202.733, -0.282,0

สมมติว่าคุณต้องการความแม่นยำเทียบเคียงได้กับมาตรฐาน IEEE คู่ผสม (ประมาณ 16 หลักทศนิยม) เพื่อให้และ 3 (คุณไม่สามารถบรรลุความแม่นยำนี้ได้จริง ๆ เพราะนั้นมอบให้กับบุคคลสำคัญเพียงสามตัวเท่านั้น แต่ก็ไม่เป็นไร: เราแค่ทิ้งค่าที่รับรองว่าจะไม่ส่งผลต่อความแม่นยำที่คุณต้องการและความแม่นยำที่แท้จริงของคุณ มี.) คำนวณ = = ความแตกต่างสามอย่างแรกคือน้อยกว่านี้ดังนั้นจงทิ้งมันทิ้งไปแค่และ ยกกำลังพวกมันให้ n = 3 - 0.282 บันทึก( ϵ / n ) บันทึก( 10 - 16 ) - บันทึก( 3 ) - 37.93997 - 38202.733 , - 0.282 0. exp ( - 0.282 ) = 0.754 exp ( 0 ) = 1 0 0.754 / ( 1 + 0.754 ) =ε=10-16n=3-0.282เข้าสู่ระบบ(ε/n)เข้าสู่ระบบ(10-16)-เข้าสู่ระบบ(3)-37.93997-38202.733,-0.2820ประสบการณ์(-0.282)=0.754และ (แน่นอน) ค่าปกติเป็น - ใน order--สำหรับคนที่คุณโยนออกไปและ1ประสบการณ์(0)=100.754/(1+0.754)=0.4301/(1+0.754)=0.570


สิ่งนี้ยอดเยี่ยม - เรียบง่ายและชัดเจนมากในการเข้าใจถึงปัญหาหลังเหตุการณ์ @Ikram โปรดทำเครื่องหมายว่านี่เป็นคำตอบที่ถูกต้อง! (เว้นแต่แน่นอนคุณมีสิ่งที่ดีกว่าซึ่งในกรณีนี้โปรดแบ่งปัน)
zelanix

2
@ ทำไมเราถึงต้องทิ้งไป ? การยกกำลังที่ให้เราเป็นศูนย์อยู่แล้วและมันจะไม่ส่งผลต่อยอดรวม -38202.733
เทย์เลอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.