Hủy bỏ thảm khốc trong logum


18

Tôi đang cố gắng thực hiện chức năng sau trong dấu phẩy động có độ chính xác kép với sai số tương đối thấp :

tôiogSbạnm(x,y)= =đăng nhập(điểm kinh nghiệm(x)+điểm kinh nghiệm(y))

Điều này được sử dụng rộng rãi trong các ứng dụng thống kê để thêm xác suất hoặc mật độ xác suất được thể hiện trong không gian nhật ký. Tất nhiên, hoặc có thể dễ dàng tràn hoặc tràn, điều này sẽ rất tệ vì không gian nhật ký được sử dụng để tránh tràn vào vị trí đầu tiên. Đây là giải pháp điển hình:exp ( y )điểm kinh nghiệm(x)điểm kinh nghiệm(y)

tôiogSbạnm(x,y)= =x+tôiog1p(điểm kinh nghiệm(y-x))

Hủy bỏ từ sẽ xảy ra, nhưng được giảm nhẹ bởi . Tệ hơn nữa là khi và gần nhau. Đây là một biểu đồ lỗi tương đối:y-xđiểm kinh nghiệmxlog1p(exp(yx))

nhập mô tả hình ảnh ở đây

Cốt truyện bị cắt ở để nhấn mạnh hình dạng của đường cong , về việc hủy bỏ xảy ra. Tôi đã thấy lỗi lên tới và nghi ngờ rằng nó sẽ trở nên tồi tệ hơn nhiều. (FWIW, chức năng "sự thật mặt đất" được triển khai bằng cách sử dụng các số float chính xác tùy ý của MPFR với độ chính xác 128 bit.)1014logsum(x,y)=01011

Tôi đã thử các cải cách khác, tất cả đều có kết quả tương tự. Với là biểu thức bên ngoài, lỗi tương tự xảy ra bằng cách lấy nhật ký của một cái gì đó gần 1. Với làm biểu thức bên ngoài, việc hủy bỏ xảy ra trong biểu thức bên trong.loglog1p

Bây giờ, lỗi tuyệt đối là rất nhỏ, vì vậy có lỗi tương đối rất nhỏ (trong một epsilon). Người ta có thể lập luận rằng, bởi vì người dùng thực sự quan tâm đến xác suất (không phải xác suất đăng nhập), lỗi tương đối khủng khiếp này không phải là vấn đề. Có vẻ như điều đó thường không xảy ra, nhưng tôi đang viết một chức năng thư viện và tôi muốn khách hàng của mình có thể tính được lỗi tương đối không tệ hơn nhiều so với lỗi làm tròn.exp(logsum(x,y))logsum

Có vẻ như tôi cần một cách tiếp cận mới. Nó có thể là gì?


Tôi không hiểu đoạn cuối của bạn. "trong một epsilon" không có ý nghĩa gì với tôi. Bạn có nghĩa là một đơn vị ở vị trí cuối cùng ? Đối với người dùng quan tâm đến xác suất, một lỗi xác suất đăng nhập nhỏ sẽ dẫn đến lỗi xác suất lớn, vì vậy đây không phải là trường hợp.
Aron Ahmadia

Vì tò mò, bạn đã thử dùng "phương pháp tốt nhất" trong hai phương pháp của mình và vạch ra lỗi đó chưa? Sau đó, tất cả những gì bạn cần là logic phù hợp để phát hiện trường hợp nào bạn gặp phải (hy vọng sẽ ít tốn kém hơn hoặc là một phần chi phí cần thiết của thuật toán), sau đó chuyển sang phương pháp thích hợp.
Aron Ahmadia

@AronAhmadia: "Trong một epsilon" có nghĩa là sai số tương đối nhỏ hơn một epsilon điểm chính xác kép, khoảng 2,22e-16. Đối với phao bình thường (tức là không bình thường), nó tương ứng với khoảng một ulp. Ngoài ra, nếu là lỗi tuyệt đối của , thì lỗi tương đối của là , gần bằng hàm nhận dạng gần bằng 0. IOW, lỗi tuyệt đối nhỏ đối với hàm ý lỗi tương đối nhỏ đối với . x exp ( x ) exp ( a ) - 1 x exp ( x )mộtxexp(x)exp(a)1xexp(x)
Neil Toronto

Phụ lục: Khi sai số tuyệt đối gần bằng không. Khi chẳng hạn, bạn đúng: tương đối phát nổ. a > 1aa>1
Neil Toronto

Câu trả lời:


12

Công thức nên ổn định về số. Nó khái quát cho một tính toán ổn định về số log Σ i đ x i = ξ + log Σ i đ x i -

tôiogSbạnm(x,y)= =tối đa(x,y)+tôiog1p(điểm kinh nghiệm(-cơ bụng(x-y))
đăng nhậpΣTôiexTôi= =ξ+đăng nhậpΣTôiexTôi-ξ,   ξ= =tối đaTôixTôi

tôiogSbạnm(x,y)= =tối đa(x,y)+tôiexp(x-y)
tôiexp(z): =đăng nhập(1+e-|z|)
z

Về mặt lỗi tuyệt đối, nó là. Xét về lỗi tương đối, thật tệ khi đầu ra gần bằng không.
Neil Toronto

xy

Với x = -0,775 và y = -0,6175, tôi nhận được lỗi 62271 ulps và lỗi tương đối 1.007e-11.
Neil Toronto

1
Tính toán các điểm dữ liệu có độ chính xác cao trong phạm vi quan tâm - ít nhất là cần có các phạm vi khác nhau do hành vi tiệm cận. Người ta có thể sử dụng biểu thức xác định cho z không gần bằng không. Đối với phạm vi đặc biệt phù hợp với chức năng hợp lý đủ mức độ cao để có được độ chính xác mong muốn. Để ổn định bằng số, sử dụng đa thức bernstein hoặc đa thức Tchitherchev trong tử số và mẫu số, điều chỉnh theo khoảng quan tâm. Cuối cùng, mở rộng thành một phân số tiếp tục và tìm hiểu xem người ta có thể cắt giảm bao nhiêu hệ số mà không làm mất đi độ chính xác.
Arnold Neumaier

1
l=tôi(z)m
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.