Có cải thiện cách tính


11

Hầu hết các thư viện toán học có một số phiên bản của hàm logarit. Hầu hết thời gian chúng tôi cho rằng chúng là hoàn hảo, nhưng thực sự khá nhiều trong số chúng chỉ cung cấp một số chữ số chính xác nhất định.

Đối với một số chức năng, có các biến thể ổn định hơn về số lượng. Ví dụ, cả Fortran, R, Java và C đều có Math.log1pđiện toán log(1.0+x)(cung cấp độ chính xác cao hơn cho các giá trị nhỏ của x) và đối tác expm1. Ở đây, các vấn đề về số phát sinh từ sự mất độ chính xác - nếu xthực sự nhỏ, 1.0 + xmất các chữ số để giữ nguyên số 1 ở đầu.

Tôi đã thấy các chức năng như vậy để tăng độ chính xác trong một số tình huống. Điều này dường như khá phổ biến bất cứ khi nào bạn thực hiện các chức năng phân phối (Gamma, Beta, Poisson, v.v.) với độ chính xác số cao. Ví dụ, hàm Gamma dường như được sử dụng nhiều nhất là logGamma. Nói chung, đi đến "logspace" có thể cải thiện độ chính xác rất nhiều, và do đó R dường như có cờ "logspace" trên hầu hết các chức năng.

Một ví dụ khác, trong R, tồn tại log1mexpcho log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mapid-note.pdf

Tôi đã chơi xung quanh với các biện pháp lý thuyết entropy và thông tin. Một thuật ngữ rất phổ biến là

p * -log(p)

thông thường, người ta muốn cơ sở của logarit là 2, không phải e; nhưng thường thì đây chỉ là một yếu tố tuyến tính và bạn cũng có thể sử dụng logarit tự nhiên (vì vậy đây không phải là yếu tố quan trọng đối với tôi). Dù sao, bạn có biết nếu có một cách tính toán nhanh hơn / trực tiếp hơn / chính xác hơn thuật ngữ này? Tôi đang có nó ở khắp mọi nơi, vì vậy nó thực sự có thể được đền đáp để làm cho nó chính xác và nhanh hơn một chút (tiết kiệm cho tôi công cụ "tối ưu hóa sớm" thông thường, cảm ơn).

Tôi không thấy bất kỳ lý do rõ ràng nào sẽ gây ra sự mất mát về độ chính xác. Vì vậy, tôi rất quan tâm nếu có bất kỳ mẹo hay nào để tăng tốc tính toán này. Điều đó thậm chí có thể giúp tôi điều trị p=0trường hợp góc (điều hợp lý là 0, mặc dù log(0)không tồn tại) hoặc cho tôi cơ sở 2 miễn phí (mặc dù một phép nhân với một hằng số rõ ràng không phải là kẻ giết người đắt tiền). Cảm ơn.


1
Nếu bạn lo lắng về vấn đề quá / tràn, hãy lưu ý rằng vì (độ chính xác kép),sẽ có nhiều nhất là , vì vậy nó không bao giờ có thể rất lớn. (0 khi ) sẽ hoàn toàn ổn. Là một lưu ý phụ, các công thức nhanh có thể khác với các công thức chính xác, vì vậy đôi khi bạn không thể có được cả hai. | đăng nhập p | 700 p log p p = 0m10308pM10308|logp|700plogpp=0
Kirill

R đi kèm với một log2chức năng mà tùy thuộc vào hệ điều hành của bạn có thể là một trình bao bọc đơn giản xung quanh log/log(2)hoặc sử dụng thực tế là C99 đã thêm một log2chức năng.
ẩn danh

Câu trả lời:


11

[ 0 , 1 ] 0plogp sẽ không bị mất độ chính xác ở bất cứ đâu trong và cũng sẽ không bị tràn số mũ gần . Vì vậy, cách nhanh chóng và chính xác là[0,1]0

p ? p * -log(p) : 0
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.