我正在尝试实现多变量高斯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
答案 0 :(得分:1)
The formula for the probability density在multi_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])
请记住,协方差矩阵中的元素代表变量的协方差,让我们调用其中两个X
和Y
。从cov(X, Y) = cov(Y, X)
开始,协方差矩阵应该是对称的。
另请注意,multi_var_prob
正在返回概率密度,
不是概率。概率密度的总和超过
整个域等于1,但概率密度函数可以
在任何给定点上容易大于1。作为一个极端的例子,考虑Dirac delta function。它在某一点基本上是无限的,在其他任何地方都是零,但它的积分(曲线下的面积)是1.