การยกเลิกภัยพิบัติใน Logum


18

ฉันพยายามใช้ฟังก์ชันต่อไปนี้ในทศนิยมที่มีความแม่นยำสองเท่าและมีข้อผิดพลาดสัมพัทธ์ต่ำ:

logsum(x,y)=log(exp(x)+exp(y))

สิ่งนี้ถูกใช้อย่างกว้างขวางในแอปพลิเคชันทางสถิติเพื่อเพิ่มความน่าจะเป็นหรือความหนาแน่นของความน่าจะเป็นที่แสดงในพื้นที่บันทึก แน่นอนว่าหรือสามารถโอเวอร์โฟลว์หรืออันเดอร์โฟล์วได้ง่ายซึ่งอาจจะไม่ดีเพราะพื้นที่บันทึกถูกใช้เพื่อหลีกเลี่ยงการมีอันเดอร์โฟล์ในตอนแรก นี่เป็นวิธีแก้ปัญหาทั่วไป:exp ( y )exp(x)exp(y)

logsum(x,y)=x+log1p(exp(yx))

ยกเลิกจากไม่เกิดขึ้น แต่จะลดลงโดย\ที่แย่กว่านั้นคือเมื่อและปิด นี่คือพล็อตข้อผิดพลาดแบบสัมพัทธ์:exp x l o g 1 p ( exp ( y - x ) )yxexpxlog1p(exp(yx))

ป้อนคำอธิบายรูปภาพที่นี่

พล็อตถูกตัดออกที่เพื่อเน้นรูปร่างของเส้นโค้งเกี่ยวกับการยกเลิกที่เกิดขึ้น ฉันเห็นข้อผิดพลาดมากถึงและสงสัยว่ามันแย่กว่าเดิมมาก (FWIW, ฟังก์ชั่น "ความจริงภาคพื้นดิน" ถูกนำมาใช้โดยลอยความแม่นยำโดยพลการของ MPFR ที่มีความแม่นยำ 128 บิต) l o g s u m ( x , y ) = 0 10 - 111014logsum(x,y)=01011

ฉันลองการปฏิรูปอื่น ๆ ทั้งหมดมีผลลัพธ์เหมือนกัน เมื่อเป็นนิพจน์ด้านนอกจะเกิดข้อผิดพลาดเดียวกันโดยการบันทึกสิ่งที่อยู่ใกล้กับ 1 ด้วยเป็นนิพจน์ด้านนอกการยกเลิกจะเกิดขึ้นในนิพจน์ด้านในl o g 1 ploglog1p

ตอนนี้ข้อผิดพลาดแบบสัมบูรณ์มีน้อยมากดังนั้นมีข้อผิดพลาดสัมพัทธ์น้อยมาก (ภายใน epsilon) อาจมีคนแย้งว่าเนื่องจากผู้ใช้สนใจในความน่าจะเป็นจริง ๆ (ไม่ใช่ความน่าจะเป็นบันทึก) ข้อผิดพลาดสัมพัทธ์ร้ายแรงนี้ก็ไม่ใช่ปัญหา เป็นไปได้ว่ามันมักจะไม่ใช่ แต่ฉันเขียนฟังก์ชั่นห้องสมุดและฉันต้องการให้ลูกค้าสามารถนับความผิดพลาดสัมพัทธ์ได้ไม่เลวร้ายยิ่งกว่าการปัดเศษข้อผิดพลาดl o g s u mexp(logsum(x,y))logsum

ดูเหมือนว่าฉันต้องการแนวทางใหม่ มันจะเป็นอะไร?


ฉันไม่เข้าใจย่อหน้าสุดท้ายของคุณ "ภายใน epsilon" ไม่ได้มีความหมายอะไรกับฉัน คุณหมายถึงหน่วยในสถานที่สุดท้ายหรือไม่ สำหรับผู้ใช้ที่สนใจในความน่าจะเป็นข้อผิดพลาดความน่าจะเป็นบันทึกขนาดเล็กจะส่งผลให้เกิดข้อผิดพลาดน่าจะเป็นขนาดใหญ่ดังนั้นจึงไม่เป็นเช่นนั้น
Aron Ahmadia

คุณได้ลองใช้ "วิธีที่ดีที่สุด" ของทั้งสองวิธีแล้วลองผิดลองถูกไหม? จากนั้นทั้งหมดที่คุณต้องการคือตรรกะที่ถูกต้องในการตรวจสอบว่าคุณอยู่ในกรณีใด (หวังว่าจะมีค่าใช้จ่ายน้อยลงหรือเป็นส่วนหนึ่งของค่าใช้จ่ายของอัลกอริทึมที่ต้องการอยู่ดี) จากนั้นจึงเปลี่ยนไปใช้วิธีที่เหมาะสม
Aron Ahmadia

@AronAhmadia: "ภายใน epsilon" หมายถึงข้อผิดพลาดสัมพัทธ์น้อยกว่า epsilon ทศนิยมที่มีความแม่นยำสองเท่าซึ่งประมาณ 2.22e-16 สำหรับปกติ (เช่นไม่ใช่ subnormal) ลอยมันสอดคล้องกับประมาณ ulp นอกจากนี้หากเป็นข้อผิดพลาดสัมบูรณ์ของxดังนั้นข้อผิดพลาดสัมพัทธ์ของexp ( x )คือexp ( a ) - 1ซึ่งเกือบจะเป็นฟังก์ชันตัวตนใกล้กับศูนย์ IOW ข้อผิดพลาดแน่นอนขนาดเล็กสำหรับxหมายถึงความผิดพลาดเล็ก ๆ สำหรับประสบการณ์( x ) axexp(x)exp(a)1xexp(x)
Neil Toronto

ภาคผนวก: เมื่อข้อผิดพลาดแบบสัมบูรณ์อยู่ใกล้ศูนย์ เมื่อ> 1ตัวอย่างเช่นคุณขวา: ระเบิดญาติ aa>1
Neil Toronto

คำตอบ:


12

สูตร ควรมีเสถียรภาพเป็นตัวเลขโดยทั่วไปจะเป็นการคำนวณเสถียรภาพของตัวเลข บันทึก i e x i = ξ + บันทึก i e x i -

logsum(x,y)=max(x,y)+log1p(exp(abs(xy))
logiexi=ξ+logiexiξ,   ξ=maxixi

ในกรณีที่ logum อยู่ใกล้กับศูนย์มากและคุณต้องการความแม่นยำสัมพัทธ์สูงคุณสามารถใช้ โดยใช้ การดำเนินการที่แม่นยำ (เช่นมากกว่าความแม่นยำสองเท่า) ของ l e x p ( z ) : = บันทึก( 1 + e - | z | )

logsum(x,y)=max(x,y)+lexp(xy)
lexp(z):=log(1+e|z|)
ซึ่งเป็นเกือบเชิงเส้นสำหรับขนาดเล็กZz

ในเรื่องของความผิดพลาดแน่นอนก็คือ ในแง่ของข้อผิดพลาดสัมพัทธ์มันน่ากลัวเมื่อเอาต์พุตใกล้ศูนย์
Neil Toronto

xy

สำหรับ x = -0.775 และ y = -0.6175 ฉันได้รับข้อผิดพลาด ulps 62271 และข้อผิดพลาดสัมพัทธ์ 1.007e-11
Neil Toronto

1
คำนวณจุดข้อมูลที่มีความแม่นยำสูงในช่วงที่น่าสนใจ - อย่างน้อยต้องมีสองช่วงที่แตกต่างกันเนื่องจากพฤติกรรมแบบอะซิมโทติค หนึ่งสามารถใช้การแสดงออกที่กำหนดสำหรับ z ไม่ใกล้เคียงกับศูนย์ สำหรับช่วงที่ไม่ธรรมดาพอดีฟังก์ชั่นที่มีเหตุผลในระดับสูงพอที่จะรับความแม่นยำ เพื่อความมั่นคงเชิงตัวเลขให้ใช้พหุนาม bernstein หรือพหุนาม Tchebychev ในตัวเศษและส่วนซึ่งปรับให้เข้ากับช่วงเวลาที่สนใจ ในตอนท้ายให้ขยายออกเป็นเศษส่วนต่อเนื่องและหาว่าสามารถตัดค่าสัมประสิทธิ์จำนวนเท่าใดโดยไม่ต้องปรับความแม่นยำ
Arnold Neumaier

1
l=l(z)m
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.