2014-05-14 12 views
7

Matlab에서 벡터의 정규화 지수를 계산해야합니다. 단순히 V의 요소수치 적으로 안정적인 구현

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

오버플 작성

로그 (realmax) = 709.7827보다 크다. (언더 플로우 조건에 대해 잘 모르겠습니다.)

숫자가 불안정하지 않도록 구현하려면 어떻게해야합니까?

업데이트 : 오버플로를 방지하는 방법에 대한 훌륭한 답변을 받았습니다. 그러나 코드에서 언더 플로의 가능성에 대한 귀하의 생각을 듣고 기쁘게 생각합니다.

답변

6

다음 접근법 의해 오버플 지수를 감산하고 지수 함수 지수 복용 대신 분할 회피 : 일반적으로

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

를 오버 플로우 로그 도메인에서 작동에 의해 회피 될 수있다 가능한 한 오랫동안 그리고 지수를 지수로 가져 가야합니다.

+0

감사. 나는 bsxfun을 처음 사용합니다. V가 행렬이라면 무엇을 Dim Dim을 따라 적용하기를 원합니까? – user25004

+0

@ user25004 어떻게 될까요? 'exp (V)'는 행렬이되고'sum (exp (V), dim)'는 벡터가됩니다. 어떻게'exp (V)/sum (exp (V, dim))'를 정의 할 수 있습니까? –

+0

dim이라는 변수가 1 인 경우 이전 코드를 각 열에 적용해야합니다. dim이 2이면 코드는 행별로 적용됩니다. – user25004

2

답변은 이전 질문과 매우 유사합니다. 수학을 사용하십시오!

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)))) 

모두 조립할 :

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))) 

입력 범위에 강력한 인 코드 :

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

좋은 생각! 최대 값 빼기 –