用 Scipy 定义正交的多元高斯函数
Defining Multivariate Gaussian Function for Quadrature with Scipy
我在使用 scipy 定义正交的多元高斯 pdf 时遇到了一些问题。我写了一个函数,它将平均向量和协方差矩阵作为输入,returns 是一个高斯函数。
def make_mvn_pdf(mu, sigma):
def f(x):
return sp.stats.multivariate_normal.pdf(x, mu, sigma)
return f
当我使用 make_mvn_pdf 定义高斯分布并尝试对高斯分布进行索引时,我得到了一个没有意义的错误。我首先定义一个均值向量和协方差矩阵并将它们传递给 make_mvn_pdf:
# define covariance matrix
Sigma = np.asarray([[1, .15], [.15, 1]])
# define propagator
B = np.diag([2, 2])
# define data
Obs = np.array([[-0.06895746],[ 0.18778 ]])
# define a Gaussian PDF:
g_int_func = make_mvn_pdf(mean = np.dot(B,Obs[t,:]), cov = Sigma)
我尝试将观察结果传递给密度,以便取回概率:
testarray=np.random.random((2,2))
g_int_func(testarray)
这个returns下面的错误我没看懂
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-50-083a1915f674> in <module>()
1 g_int_func = make_mvn_pdf(np.dot(B,Obs[t,:]),Gamma)
----> 2 g_int_func(testarray)
/Users/...in f(x)
17 def make_mvn_pdf(mu, sigma):
18 def f(x):
---> 19 return sp.stats.multivariate_normal.pdf(x, mu, sigma)
20 return f
21
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in pdf(self, x, mean, cov, allow_singular)
427
428 """
--> 429 dim, mean, cov = _process_parameters(None, mean, cov)
430 x = _process_quantiles(x, dim)
431 psd = _PSD(cov, allow_singular=allow_singular)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in _process_parameters(dim, mean, cov)
54
55 if mean.ndim != 1 or mean.shape[0] != dim:
---> 56 raise ValueError("Array 'mean' must be a vector of length %d." % dim)
57 if cov.ndim == 0:
58 cov = cov * np.eye(dim)
ValueError: Array 'mean' must be a vector of length 2.
ValueError 指出数组 'mean' 必须是长度为 2 的向量,但事实就是如此。事实上,均值和协方差矩阵的维度和传入的数据都是长度为2。
您给出的平均值为 np.dot(B, Obs)
(考虑到您在评论中建议的更改),其中 B
具有形状 (2, 2) 和 Obs
具有形状 (2, 1)。 dot
调用的结果具有形状 (2, 1)。问题是这是一个二维数组,而multivariate_normal.pdf
期望mu
是一个一维数组,即形状为 (2,) 的数组。 (错误消息使用 "vector" 一词,这是一个糟糕的选择,因为对于许多人来说,形状为 (n, 1) 的数组是 一个(列)向量。如果错误消息说 "Array 'mean' must be a one-dimensional array of length 2.")
就不会那么含糊了
至少有两种简单的方法可以解决此问题:
- 您可以确保
Obs
具有形状 (2,) 而不是 (2, 1),例如Obs = np.array([-0.06895746, 0.18778])
。 np.dot(B, Obs)
的形状为 (2,).
- "Flatten"
mean
参数通过使用 ravel
方法:mean=np.dot(B,Obs).ravel()
.
我在使用 scipy 定义正交的多元高斯 pdf 时遇到了一些问题。我写了一个函数,它将平均向量和协方差矩阵作为输入,returns 是一个高斯函数。
def make_mvn_pdf(mu, sigma):
def f(x):
return sp.stats.multivariate_normal.pdf(x, mu, sigma)
return f
当我使用 make_mvn_pdf 定义高斯分布并尝试对高斯分布进行索引时,我得到了一个没有意义的错误。我首先定义一个均值向量和协方差矩阵并将它们传递给 make_mvn_pdf:
# define covariance matrix
Sigma = np.asarray([[1, .15], [.15, 1]])
# define propagator
B = np.diag([2, 2])
# define data
Obs = np.array([[-0.06895746],[ 0.18778 ]])
# define a Gaussian PDF:
g_int_func = make_mvn_pdf(mean = np.dot(B,Obs[t,:]), cov = Sigma)
我尝试将观察结果传递给密度,以便取回概率:
testarray=np.random.random((2,2))
g_int_func(testarray)
这个returns下面的错误我没看懂
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-50-083a1915f674> in <module>()
1 g_int_func = make_mvn_pdf(np.dot(B,Obs[t,:]),Gamma)
----> 2 g_int_func(testarray)
/Users/...in f(x)
17 def make_mvn_pdf(mu, sigma):
18 def f(x):
---> 19 return sp.stats.multivariate_normal.pdf(x, mu, sigma)
20 return f
21
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in pdf(self, x, mean, cov, allow_singular)
427
428 """
--> 429 dim, mean, cov = _process_parameters(None, mean, cov)
430 x = _process_quantiles(x, dim)
431 psd = _PSD(cov, allow_singular=allow_singular)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in _process_parameters(dim, mean, cov)
54
55 if mean.ndim != 1 or mean.shape[0] != dim:
---> 56 raise ValueError("Array 'mean' must be a vector of length %d." % dim)
57 if cov.ndim == 0:
58 cov = cov * np.eye(dim)
ValueError: Array 'mean' must be a vector of length 2.
ValueError 指出数组 'mean' 必须是长度为 2 的向量,但事实就是如此。事实上,均值和协方差矩阵的维度和传入的数据都是长度为2。
您给出的平均值为 np.dot(B, Obs)
(考虑到您在评论中建议的更改),其中 B
具有形状 (2, 2) 和 Obs
具有形状 (2, 1)。 dot
调用的结果具有形状 (2, 1)。问题是这是一个二维数组,而multivariate_normal.pdf
期望mu
是一个一维数组,即形状为 (2,) 的数组。 (错误消息使用 "vector" 一词,这是一个糟糕的选择,因为对于许多人来说,形状为 (n, 1) 的数组是 一个(列)向量。如果错误消息说 "Array 'mean' must be a one-dimensional array of length 2.")
至少有两种简单的方法可以解决此问题:
- 您可以确保
Obs
具有形状 (2,) 而不是 (2, 1),例如Obs = np.array([-0.06895746, 0.18778])
。np.dot(B, Obs)
的形状为 (2,). - "Flatten"
mean
参数通过使用ravel
方法:mean=np.dot(B,Obs).ravel()
.