Chuyển đổi (bình thường hóa) các giá trị khả năng rất nhỏ thành xác suất


21

Tôi đang viết một thuật toán trong đó, được đưa ra một mô hình, tôi tính toán khả năng cho một danh sách các bộ dữ liệu và sau đó cần chuẩn hóa (để xác suất) từng khả năng. Vì vậy, một cái gì đó như [0,00043, 0,00004, 0,00321] có thể được chuyển đổi thành có thể giống như [0,2, 0,03, 0,77].

Vấn đề của tôi là khả năng đăng nhập, tôi đang làm việc, khá nhỏ (ví dụ, trong không gian nhật ký, các giá trị như -269647.432, -231444.981, v.v.). Trong mã C ++ của tôi, khi tôi cố gắng thêm hai trong số chúng (bằng cách lấy số mũ của chúng) tôi nhận được câu trả lời là "Inf". Tôi đã cố gắng thêm chúng vào không gian nhật ký (Tóm tắt / Phép trừ nhật ký) , nhưng một lần nữa vấp phải cùng một vấn đề.

Bất cứ ai có thể chia sẻ ý kiến ​​chuyên gia của mình về điều này?


Khi bạn sử dụng các chức năng bạn chỉ để liên quan đến log(1+) , bạn có sử dụng các log1pchức năng trong ngôn ngữ của bạn? Điều này sử dụng bản mở rộng Taylor khoảng 1.
Neil G

1
Xem thêm một số cuộc thảo luận liên quan trước đó tại đây
Glen_b -Reinstate Monica

Câu trả lời:


30

Trừ logarit tối đa từ tất cả các bản ghi. Vứt bỏ tất cả các kết quả tiêu cực đến mức họ sẽ vượt qua cấp số nhân. (Khả năng của họ là, cho tất cả các mục đích thực tế, bằng không.)

Thật vậy, nếu bạn muốn có một độ chính xác tương đối của ϵ (như ϵ=10d cho d chữ số chính xác) và bạn có n các khả năng, vứt bỏ bất kỳ kết quả ít hơn so với logarit của ϵ/n . Sau đó tiến hành như bình thường để lũy thừa các giá trị kết quả và chia từng giá trị cho tổng của tất cả các số mũ.

λ1,λ2,,λnb > 1λn=max(λi)b>1

αi={bλiλn,λiλnlog(ϵ)log(n)0otherwise.

Các khả năng chuẩn hóa bằng , Điều này hoạt động vì việc thay thế tất cả các dòng chảy khác bằng 0 gây ra tổng số lỗi tối đa trong khi đó, bởi vì và tất cả đều không âm, mẫu số , trong đó tổng lỗi tương đối do quy tắc thay thế bằng 0 nhỏ hơn hoàn toàn so với , như mong muốn. i = 1 , 2 , ... , n . α i ( n - 1 ) ϵ / n < ϵαi/j=1nαji=1,2,,n.αi(n1)ϵ/n<ϵα i A = Σ j α j1 ( ( n - 1αn=bλnλn=b0=1αiA=jαj1((n1)ϵ/n)/A<ϵ

Để tránh lỗi làm tròn quá nhiều, hãy tính tổng bắt đầu bằng các giá trị nhỏ nhất của . Điều này sẽ được thực hiện tự động khi được sắp xếp đầu tiên theo thứ tự tăng dần. Đây là một xem xét chỉ cho rất lớn .λ i nαiλin

BTW, đơn thuốc này giả định cơ sở của các bản ghi lớn hơn . Đối với các cơ sở nhỏ hơn , trước tiên hãy phủ định tất cả các bản ghi và tiến hành như thể cơ sở bằng .b 1 1 / b1b11/b


Thí dụ

Đặt có ba giá trị với logarit (log tự nhiên, giả sử) bằng và Cái cuối cùng là lớn nhất; trừ nó từ mỗi giá trị sẽ cho và- 231444.981 , - 231444.699. - 38202.733 , - 0.282 , 0.269647.432, 231444.981,231444.699.38202.733, 0.282,0.

Giả sử bạn muốn độ chính xác tương đương với nhân đôi của IEEE (khoảng 16 chữ số thập phân), sao cho và . (Bạn thực sự không thể đạt được độ chính xác này, bởi vì chỉ được trao cho ba con số quan trọng, nhưng không sao: chúng tôi chỉ vứt bỏ các giá trị được đảm bảo không ảnh hưởng đến độ chính xác bạn muốn và độ chính xác bạn thực sự có.) Tính toán = = Điểm khác biệt đầu tiên trong số ba điểm khác biệt, là ít hơn mức này, vì vậy hãy vứt nó đi, chỉ để lại và thừa chúng mang lại n = 3 - 0,282 log ( ε / n ) log ( 10 - 16 ) - log ( 3 ) - 37,93997. - 38202.733 ,ϵ=1016n=30.282log(ϵ/n)log(1016)log(3)37.93997.38202.733,0. exp ( - 0.282 ) = 0.754 exp ( 0 ) = 1 0 0.754 / ( 1 + 0.754 ) =0.2820.exp(0.282)=0.754 và (tất nhiên). Các giá trị được chuẩn hóa là - theo thứ tự-- cho giá trị bạn đã ném đi, và .exp(0)=101 / ( 1 + 0,754 ) = 0,5700.754/(1+0.754)=0.4301/(1+0.754)=0.570


Điều này thật tuyệt vời - thật đơn giản và quá rõ ràng trong nhận thức muộn màng. @Ikram, vui lòng đánh dấu đây là câu trả lời đúng! (trừ khi tất nhiên bạn có thứ gì đó tốt hơn, trong trường hợp đó xin vui lòng chia sẻ)
zelanix

2
@whuber chúng ta thậm chí cần phải vứt đi ? Số mũ sẽ cho chúng ta số 0 dù sao đi nữa, và vì vậy nó sẽ không đóng góp vào tổng. 38202.733
Taylor
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.