我有多个 Nx3 点,并且我从其相应的多元高斯中顺序为每个点生成一个新值,每个点都有 1x3 均值和 3x3 cov。因此,我总共有数组:Nx3 点数组、Nx3 均值数组和 Nx3x3 cov 数组。
我只看到如何使用经典的 for 循环来做到这一点:
import numpy as np
from scipy.stats import multivariate_normal
# Generate example data
N = 5 # Small number for minimal example, can be increased for real use case
points = np.random.rand(N, 3)
means = np.random.rand(N, 3)
covs = np.array([np.eye(3) for _ in range(N)]) # Identity matrices as example covariances
# Initialize an array to store the PDF values
pdf_values = np.zeros(N)
# Loop over each point, mean, and covariance matrix
for i in range(N):
pdf_values[i] = multivariate_normal.pdf(points[i], mean=means[i], cov=covs[i])
print("Points:\n", points)
print("Means:\n", means)
print("Covariances:\n", covs)
print("PDF Values:\n", pdf_values)
有什么方法可以加快速度吗向上?我尝试将所有内容直接传递给 multivariate_normal.pdf,但也从似乎不受支持的文档中传递(与为 Nx3 点生成值的更简单情况不同,但具有相同的均值和协方差。
也许某些实现不是来自scipy?
我可能抱太大希望,但不知何故,我希望有一种更简单的方法来加快速度,并避免直接使用 Pythonic 循环在大量数据中使用此 for 循环进行迭代。
可以使用 NumPy 的矢量化操作和广播来加速的代码。以下是如何操作:
import numpy as np
from scipy.stats import multivariate_normal
# Generate example data
N = 5
points = np.random.rand(N, 3)
means = np.random.rand(N, 3)
covs = np.array([np.eye(3) for _ in range(N)])
# Vectorized calculation
pdf_values = multivariate_normal.pdf(points, mean=means, cov=covs)
print("Points:\n", points)
print("Means:\n", means)
print("Covariances:\n", covs)
print("PDF Values:\n", pdf_values)
此代码中发生了什么?
-
矢量化计算: 我们不是循环遍历每个点、均值和协方差矩阵,而是直接将
points
、means
和covs
数组传递给multivariate_normal.pdf
。scipy 中的multivariate_normal.pdf
函数经过优化,可以使用矢量化操作来处理此类输入。 -
广播:
multivariate_normal.pdf
函数要求均值和协方差的形状与点数相匹配或可以广播。在这种情况下,means
和covs
的形状正确,允许 NumPy 对每个点使用相应的均值和协方差向量来有效地计算 PDF 值。
这种矢量化方法充分利用了 NumPy 的优化操作,与使用显式循环相比,这应该会带来显著的加速,尤其是在大型数据集上。
其他提示:
- 对于极大的数据集,可以研究使用多个内核或 GPU 计算来进一步并行化计算。诸如 CuPy 之类的库可以在 GPU 上执行 NumPy 兼容的计算,这可能会带来额外的加速。
- 如果的协方差矩阵具有一些特殊结构(例如,对角矩阵或所有点相同的协方差矩阵),则利用此结构可以进一步优化计算。
请记住,最佳方法始终取决于的具体数据集大小和硬件。始终建议对不同的方法进行基准测试,以确定最适合需求的方法。
标签:python,numpy From: 78795739