2012-09-16 4 views
2

이 표현식을 파이썬으로 코딩하려하지만 약간의 어려움이 있습니다. 파이썬에서이 표현식에 대한 코드

enter image description here

내가 지금까지 가지고 몇 가지 조언을 원하는 코드입니다.

x = 1x2 vector 
mu = 1x2 vector 
Sigma = 2x2 matrix 

xT = (x-mu).transpose() 
sig = Sigma**(-1) 
dotP = dot(xT ,sig) 
dotdot = dot(dotP, (x-mu)) 
    E = exp((-1/2) dotdot ) 

올바른 경로에 있습니까? 어떤 제안?

답변

4
  • Sigma ** (-1)은 원하는 것이 아닙니다. 그러면 Sigma의 각 요소가 -1의 힘 (즉, 1/Sigma)으로 증가하지만 수학 표현식에서는 반전을 의미하며 이는 파이썬에서 np.linalg.inv(Sigma)으로 작성됩니다.

  • (-1/2) dotdot은 구문 오류입니다. 파이썬에서는 곱셈에 항상 *을 포함 시키거나, 단지 - dotdot/2을 수행해야합니다. 아마도 파이썬 2를 사용하고 있기 때문에, 부서는 다소 불안정합니다. from __future__ import division (매우 권장 됨)을 수행하지 않은 경우 1/2은 실제로는 0입니다. 이는 정수로 나뉩니다. .5을 사용하면이 문제를 해결할 수 있습니다.하지만 본부에서 부서 수입을하는 것이 좋습니다.

  • 이것은 매우 사소한 것이지만, 한 번만 수행해야하는 경우에는 x-mu 빼기를 두 번하고 있습니다. 벡터를 한 번만 수행하면 벡터가 큰 경우 약간의 속도를 줄일 수 있습니다. (물론, 여기에 두 가지 차원에서 그 일을하고, 그래서 이것은 전혀 문제가되지 않습니다.)

  • 을 오히려 (미세이다),이 같은 인 the_array.T를 사용하는 것이 더 좋아 the_array.transpose()를 호출하는 대신 맡은 일.

  • 나는 또한 xT이라는 이름을 사용하지 않을 것입니다. 그것은 내게 거짓 일 때 x의 전치라는 것을 의미합니다.

아마 이런 식으로 결합 것 :

# near the top of the file 
# you probably did some kind of `from somewhere import *`. 
# most people like to only import specific names and/or do imports like this, 
# to make it clear where your functions are coming from. 
import numpy as np 

centered = x - mu 
prec = np.linalg.inv(Sigma) 
E = np.exp(-.5 * np.dot(centered.T, np.dot(prec, centered))) 
+0

안녕 덕분에 당신의 도움을. 오류가 발생했습니다 - ValueError : 행렬이 E = exp (- .5 * 점 (c.T, 점 (InvSig, c))에 과 일치하지 않음 – banditKing

+0

이 해결되었습니다. 감사합니다 – banditKing

+0

매트릭스 곱셈을 사용하여'E' 표현을 단순화 할 수 있습니다 :'centered = (x-mu) .view (np.matrix); prec = np.linalig.inv (시그마) .view (np.matrix); E = np.exp (-0.5 * centered.T * prec * centered)' –

관련 문제