2014-05-14 19 views
7

Tôi cần tính toán số mũ chuẩn hóa của một vectơ trong Matlab.Thực hiện ổn định về số lượng

Đơn giản chỉ cần viết

res = exp(V)/sum(exp(V)) 

tràn trong một phần tử của V là lớn hơn (realmax) log = 709,7827. (Tôi không chắc chắn về điều kiện bên dưới.)

Tôi nên triển khai nó như thế nào để tránh sự bất ổn định số?

Cập nhật: Tôi đã nhận được phản hồi tuyệt vời về cách tránh tràn. Tuy nhiên, tôi vẫn vui khi nghe suy nghĩ của bạn về khả năng tràn trong mã.

Trả lời

6

Các phương pháp sau đây tránh tràn bởi trừ số mũ và sau đó lấy mũ, thay vì chia hàm mũ:

res = 1./sum(exp(bsxfun(@minus, V(:), V(:).'))) 

Theo nguyên tắc chung, tràn có thể tránh được bằng cách làm việc trong lĩnh vực đăng nhập càng lâu càng tốt, và chỉ lấy số mũ ở cuối.

+0

Cảm ơn. Tôi mới đến bsxfun. Điều gì sẽ xảy ra nếu V là ma trận và chúng tôi muốn điều này áp dụng cùng với thứ nguyên mờ? – user25004

+0

@ user25004 Điều đó sẽ như thế nào? 'exp (V)' sau đó sẽ là một ma trận và 'tổng (exp (V), mờ)' sẽ là một vectơ. Làm thế nào để bạn xác định 'exp (V)/sum (exp (V, dim))' trong trường hợp đó? –

+0

Ý tôi là nếu biến được gọi là mờ là 1, tôi muốn mã trước của bạn được áp dụng cho mỗi cột. Nếu mờ là 2, mã sẽ được áp dụng hàng khôn ngoan. – user25004

2

Câu trả lời khá giống với câu hỏi trước của bạn. Sử dụng Toán!

exp(V)=exp(V-max(V))*exp(max(V)) 
sum(exp(V))=sum(exp(V-max(V))*exp(max(V)))=exp(max(V)*sum(exp(V-max(V)))) 

Đưa cả hai cùng nhau:

res=exp(V-max(V))*exp(max(V))/exp(max(V)*sum(exp(V-max(V)))=exp(V-max(V))/sum(exp(V-max(V))) 

Mã mà là mạnh mẽ đến phạm vi đầu vào:

res=exp(V-max(V))/sum(exp(V-max(V))) 
+0

Ý tưởng hay! Trừ tối đa –

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