2010-11-17 34 views
5

Tôi có một mảng Nx1 tương ứng với phân phối xác suất, tức là tổng của các phần tử tổng cộng thành 1. Mảng này được biểu diễn dưới dạng mảng thường xuyên. Vì N có thể tương đối lớn, ví dụ: 10 hoặc 20, nhiều phần tử riêng lẻ gần bằng 0. Tôi thấy rằng khi tôi đăng nhập (my_array), tôi nhận được lỗi "FloatingPointError: giá trị không hợp lệ gặp phải trong nhật ký". Lưu ý rằng đây là sau khi thiết lập seterr (không hợp lệ = 'nâng cao') trong một cách cố ý.ghi nhật ký các giá trị rất nhỏ bằng cách sử dụng numpy/scipy trong Python

Tôi có thể giải quyết vấn đề bằng số này như thế nào? Tôi muốn đại diện cho vectơ tương ứng với phân phối xác suất và nhật ký lấy của chúng mà không làm tròn đến 0, kể từ đó tôi kết thúc việc ghi nhật ký (0) làm tăng lỗi.

cảm ơn.

+0

Xác suất bằng 0 là trường hợp đặc biệt, tại sao bạn cho rằng nó giống với xác suất khác 0? Tại sao không chỉ đơn giản là lọc nó ra khỏi dữ liệu và làm việc với khác không chỉ? –

+1

Bạn đã kiểm tra kỹ xem tất cả các giá trị trong phân phối có thực sự tích cực không? Không có giá trị âm và không có giá trị chính xác bằng không? Giá trị thực sự nhỏ không quan trọng. –

+0

Vấn đề tương tự như: http://stackoverflow.com/questions/3704570/in-python-small-floats-tending-to-zero – monkut

Trả lời

1

Cách 'khá gần' với 0 là bao nhiêu? Python có vẻ vui vẻ khi đăng nhập 10^-rất lớn:

>>> log(0.0000000000000000000000000001) 
-64.472382603833282 

Ngoài ra, tại sao bạn lại lấy nhật ký? Bạn định làm gì với họ sau khi bạn đã lấy chúng?

2

Có gì gần bằng không?

>>> np.log(0) 
-inf 
>>> 0.*np.log(0) 
nan 
>>> np.log(1e-200) 
-460.51701859880916 
>>> 1e-200*np.log(1e-200) 
-4.6051701859880914e-198 

Một giải pháp là thêm một số dương nhỏ vào tất cả các xác suất để hạn chế chúng đủ xa khỏi số không.

Giải pháp thứ hai là để xử lý số không rõ ràng, ví dụ thay 0. * np.log (0) với số không trong mảng kết quả, hoặc chỉ bao gồm các điểm có khả năng khác không trong mảng khả

2

Bạn có thể chỉ cần thả đuôi theo độ chính xác bạn cần.

eps = 1e-50 
array[array<eps]=eps 
log(array) 
0

Tùy thuộc vào những gì bạn đang làm sau đó, bạn có thể sử dụng biến đổi khác không phát nổ trên các giá trị bằng không như nhật ký. Có thể là sigmoid function hoặc một cái gì đó khác với một Jacobian được xác định rõ ràng.

Nếu bạn chỉ muốn hình dung dữ liệu, bạn luôn có thể thêm một số giá trị nhỏ trước khi bạn ghi nhật ký.

Các vấn đề liên quan