Python函数+用于奇怪的行为

时间:2014-05-24 15:37:13

标签: python numpy

我正在尝试实现多变量高斯pdf,

def multi_var_prob(x,mu,cov):
#Multi variate gaussian
  print x
  print (np.power(1/(2*np.pi),(len(x)*.5))/np.sqrt(np.abs(np.linalg.det(cov))))*np.exp(np.dot(np.matrix.transpose(x-mu),np.dot(np.linalg.inv(cov),(x-mu))))
  return((np.power(1/(2*np.pi),(len(x)*.5))/np.sqrt(np.abs(np.linalg.det(cov))))*np.exp(np.dot(np.matrix.transpose(x-mu),np.dot(np.linalg.inv(cov),(x-mu)))))

def get_multivar_pdf(y,mu,cov):

  for t in y:
    print multi_var_prob((np.matrix.transpose(t)),mu,cov)
  return   

现在从命令行

 >> multi_var_prob(np.matrix('2;4;5'),np.matrix('0;0;6'),np.matrix([[.3,.67,8],[2,3,8], [2,.05,2]]))


[[2]
[4]
[5]]
[[ 0.5179723]]
matrix([[ 0.5179723]])

给出小于1的正确概率。

现在,当我使用

  >>> l=np.matrix([[1,2,4],[3,4,5],[2,4,5]])
  >>> print get_multivar_pdf(l,np.matrix('0;0;6'),np.matrix([[.3,.67,8],[2,3,0],            [2,.05,2]]))

  [[1]
  [2]
  [4]]
 [[ 0.04517737]]
 [[ 0.04517737]]
  [[3]
  [4]
  [5]]
 [[ 1.13453039]]
 [[ 1.13453039]]
  [[2]
  [4]
  [5]]
 [[ 2.61451178]]
 [[ 2.61451178]]
 None

它的概率奇怪地加起来并且> 1 ...但是正在进行的矩阵是 相同。请帮助。我使用Python 2.7

1 个答案:

答案 0 :(得分:1)

    {li>

    The formula for the probability densitymulti_var_prob中使用 在np.exp的调用中缺少-0.5。

    def multi_var_prob(x, mu, cov):
        # Multivariate gaussian
        result = (
            (np.power(1 / (2 * np.pi), (len(x) * .5)) / np.sqrt(np.abs(np.linalg.det(cov))))
            * np.exp(-0.5 * np.dot(
                np.matrix.transpose(x - mu),
                np.dot(np.linalg.inv(cov), (x - mu)))))
        return result
    
  • 协方差矩阵应为positive definite。积极的 确定(实际)矩阵是对称的,并且都是正的 特征值。你的不是:

    In [122]: import numpy.linalg as LA
    
    In [123]: cov = np.matrix([[.3, .67, 8], [2, 3, 8], [2, .05, 2]])
    
    In [124]: cov
    Out[124]: 
    matrix([[ 0.3 ,  0.67,  8.  ],
           [ 2.  ,  3.  ,  8.  ],
           [ 2.  ,  0.05,  2.  ]])
    
    In [125]: LA.eigvals(cov)
    Out[125]: array([-2.86046758,  5.96319816,  2.19726942])
    

    请记住,协方差矩阵中的元素代表变量的协方差,让我们调用其中两个XY。从cov(X, Y) = cov(Y, X)开始,协方差矩阵应该是对称的。

  • 另请注意,multi_var_prob正在返回概率密度, 不是概率。概率密度的总和超过 整个域等于1,但概率密度函数可以 在任何给定点上容易大于1。作为一个极端的例子,考虑Dirac delta function。它在某一点基本上是无限的,在其他任何地方都是零,但它的积分(曲线下的面积)是1.