2014-05-24 91 views
0

我想實現一個多元高斯PDF Python函數+,用於奇怪的行爲

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 ... ...但在持續的矩陣是
same.Please help.I使用Python 2.7

+0

請指出愚蠢的錯誤,我一直做......這將不勝感激 – user3443615

+0

什麼粗糙輸出你期待? –

+0

對於給定的向量矩陣像'l'這個程序中它應該打印出相應行的正確概率 – user3443615

回答

1
  • 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

+0

感謝unutbu解決了這個問題,但是可以指定下面的值是否理智?multi_var_prob(np.matrix('0 ; 3; 4 '),np.matrix(' 0; 0; 6' ),np.matrix([[1,2,3],[2,0,4],[3,4,7]]) ) [[0] [3] [4]] [[1.60114334e-08]] 矩陣([[44.70284829]]) – user3443615

+0

同樣,協方差矩陣不是正定:'LA.eigvals(NP .matrix([[1,2,3],[2,0,4],[3,4,7]]))'顯示特徵值是'array([10.19615242,-0.19615242,-2。])' 。因此,雖然'multi_var_prob'返回一個數字,但它不與有效的多元正態pdf相關聯。 – unutbu

+0

另請注意,您可以使用[scipy.stats.multivariate_normal](http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.multivariate_normal.html)而不是自己定義此功能。如果你有scipy。 – unutbu