我试图在Python中基于Paciorek and Schervish, 2005的方程(5,6)实现一个非平稳高斯协方差函数。见附图:
我已经生成了一些代码,我相信这些代码做的是正确的,尽管它在填充矩阵C
元素时效率非常低。请参见下面的合成示例:
import numpy as np
from scipy.spatial.distance import cdist
np.random.seed(1)
n = 100
x = np.random.rand(n,2)
length_scales = np.random.rand(n,2)
sigma2 = 1
C = np.zeros((n,n))
for i in range(n):
Sigmai = np.diag(length_scales[i,:])
xi = np.atleast_2d(x[i,:]).T
for j in range(n):
Sigmaj = np.diag(length_scales[j,:])
xj = np.atleast_2d(x[j,:]).T
Qij = cdist(np.dot(np.diag(1/(((Sigmai+Sigmaj)/2).diagonal())),xi).T,\
np.dot(np.diag(1/(((Sigmai+Sigmaj)/2).diagonal())),xj).T,'sqeuclidean')
C[i,j] = sigma2 * np.prod(Sigmai.diagonal())**.25 * np.prod(Sigmaj.diagonal())**.25 *\
np.prod(((Sigmai+Sigmaj)/2).diagonal())**-.5 * np.exp(-Qij)
我意识到我可以通过填充C
的下三角稍微提高效率,但是对于大的n
这仍然非常缓慢
我的问题是,是否可以重新编写上述代码,这样我就不必迭代计算C
请参阅使用
np.meshgrid
作为避免使用for循环的方法的示例,以及每种情况下运行时间的比较:用于循环
np.meshgrid
打印:
相关问题 更多 >
编程相关推荐