[英]Python function+for strange behaviour
我正在尝试实现多元高斯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
为概率密度的公式中使用multi_var_prob
中缺少呼叫到-0.5 np.exp
。
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
协方差矩阵应为正定的 。 正定(实)矩阵是对称的,并且具有所有正特征值。 您不:
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。 作为一个极端的例子,考虑狄拉克增量函数 。 它在一点上基本上是无限的,在其他任何地方都为零,但其积分(曲线下的面积)为1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.