【问题标题】:What is my problem with the implementation of multivariate_gauss pdf?multivariate_gauss pdf的实现有什么问题?
【发布时间】:2021-06-13 19:39:30
【问题描述】:

我用python计算了multivariate_gauss分布,但是不知道哪里出了问题。 代码在这里

# calculate multi-d gaussian pdf
def mul_gauss(x, mu, sigma) -> float:
    d = len(x[0])
    front = 1 / math.sqrt(((2 * math.pi) ** d) * np.linalg.det(sigma))
    tmp = (np.array(x) - np.array(mu))
    tmp_T = np.transpose(tmp)
    back = -0.5 * (np.matmul(np.matmul(tmp, np.linalg.inv(sigma)), tmp_T))[0][0]
    return front * math.exp(back)

我将结果与 scipy.stats.multivariate_normal(x,mu,sigma) 进行了比较

x = [[2,2]]
mu = [[4,4]]
sigma = [[3,0],[0,3]]
ret_1 = mul_gauss(x, mu, sigma)
ret_2 = scipy.stats.multivariate_normal(x[0], mu[0], sigma).pdf(x[0])
print('ret_1=',ret1)
print('ret_2=',ret2)

输出是 ret_1=0.013984262505331654 ret_2=0.03978873577297383

谁能帮帮我?

【问题讨论】:

  • 看来一切都是正确的。事实上,使用 scipy stats 多元正态 pdf 方法我意识到了一些我不明白的事情。如果您尝试例如 x = [[2,2]] and mu = [[2,2]] and x = [[4,4]] and mu = [[4,4]] 它返回不同的值!否则,据我所知,您的代码将返回正确的代码。所以pdf方法是我认为正在做一些奇怪的事情
  • @GonzaloPolo 实际上,当我使用 x = [[a,b,c]] 和 mu=[[d,e,f]] 等 3-d 情况时,我的代码返回值大于 1 。但这是不可能的。所以我认为我的代码确实有一些问题,但我找不到它。
  • 甚至插入一个正定协方差矩阵作为输入?我无法重现它

标签: python numpy math gaussian


【解决方案1】:

在 main 的第 5 行中,您将对象上的 .pdf() 作为方法调用。 这是一个修复:

# calculate multi-d gaussian pdf
import math

import numpy as np
from scipy import stats


def mul_gauss(x, mu, sigma) -> float:
    d = x[0].shape[0]
    coeff = 1/np.sqrt((2 * math.pi) ** d * np.linalg.det(sigma))
    tmp = x - mu
    exponent = -0.5 * (np.matmul(np.matmul(tmp, np.linalg.inv(sigma)), tmp.T))[0][0]
    return coeff * math.exp(exponent)


x = np.array([[2,2]])
mu = np.array([[4,4]])
sigma = np.array([[3,0],[0,3]])
ret_1 = mul_gauss(x, mu, sigma)
ret_2 = stats.multivariate_normal.pdf(x[0], mu[0], sigma)
print('ret_1=',ret_1)
print('ret_2=',ret_2)

输出:

ret_1= 0.013984262505331654
ret_2= 0.013984262505331658

干杯。

【讨论】:

  • 当我尝试这种情况时: x = [[2,2]] mu = [[4,4]] sigma = [[3,1],[2,3]] 结果是还是不一样 ret_1=0.025528112117341697 ret_2=0.03198155263310794 我需要让它们独立吗?
  • ,我尝试4-d case:x = [[5.1,3.5,1.4,0.2]] mu = [5.0059999999999,3.4180000000000006,1.464,0.243999999999999] sigma = [0.1242489959183676,010099999999999999999999999999999999999999999999999998999999999999999999999999999999999999990 ,0.01613877551020407,0.010546938775510202],[0.10029795918367343,0.14517959183673468,0.01168163265306121,0.011436734693877546],[0.01613877551020407,0.01168163265306121,0.03010612244897958,0.00569795918367347],[0.010546938775510202,0.011436734693877546,0.00569795918367347,0.011493877551020406]的PDF是大于1大这是可能的?跨度>
  • @Whipser,您必须始终检查 sigma 协方差矩阵是否为正定矩阵。在您的评论中,矩阵 sigma[[3,1], [2,3]] 甚至不是对称的,因此它不是 PD(正定式)。检查矩阵是否为 PD 是其所有特征值均 > 0。
  • @GonzaloPolo 我检查了多元高斯的定义,但没有找到 PD 要求。所以 PD 要求只是针对 scipy 库还是我遗漏了一些信息?
  • @Whipser,问题是一维正态分布中假设方差参数为正的方式相同(甚至称为“sigma square”,它是随机变量的方差) ,对于多变量正态,这相当于说协方差矩阵是 PD(它是组成不同维度的各种随机变量的协方差)。我不知道 scipy 代码,所以它也可能不会检查这个。用一维试试,看看当你输入一个负方差时会发生什么。希望有帮助
猜你喜欢
  • 2019-06-07
  • 2021-07-25
  • 2011-09-08
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多