gpt4 book ai didi

python - numpy 中的矩阵加法

转载 作者:行者123 更新时间:2023-11-30 22:50:12 25 4
gpt4 key购买 nike

我需要计算矩阵列表的总和,但是,我无法使用np.sum,即使使用axis=0,我也不会知道为什么。目前的解决方案是循环,但是有更好的方法吗?

import numpy as np
SAMPLE_SIZES = [10, 100, 1000, 10000]
ITERATIONS = 1
MEAN = np.array([1, 1])
COVARIANCE = np.array([[1, 0.5], [0.5, 1]])
for sample_size in SAMPLE_SIZES:
max = -1
for i in range(ITERATIONS):
xs = np.random.multivariate_normal(MEAN, COVARIANCE, size=sample_size)
sigma = [[0, 0], [0, 0]]
for x in xs:
sigma += np.outer((x-MEAN), (x-MEAN)) / (sample_size-1)

在上面的代码中,我可以使用一些numpy函数替换最后一个循环吗?我猜如果数据很大,使用循环效率不高。

最佳答案

了解 numpy broadcasting .

xs = np.random.multivariate_normal(MEAN, COVARIANCE, size=sample_size)

xs 现在具有形状 (sample_size, 2),这意味着您可以直接减去 MEAN。现在,您需要在 xs - MEANxs - MEAN 之间求外积,同时在 sample_size 轴上添加。最好使用 np.einsum 来完成此操作。 :

>>> sigma = np.einsum('ij,ik->jk', xs - MEAN, xs - MEAN) / sample_size
>>> sigma
array([[ 1.00216043, 0.49549231],
[ 0.49549231, 1.00004423]])

另一种方法是使用广播:

>>> sigma = np.sum((xs - MEAN)[:, :, np.newaxis]
* (xs - MEAN)[:, np.newaxis, :], axis=0) / sample_size

虽然广播解决方案似乎更容易理解,但 np.einsum 通常为 more efficient比广播。

附加说明:请注意,我除以sample_size,而不是sample_size - 1。这是因为,要估计均值已知的随机变量的协方差矩阵,您需要除以 sample_size。当您还估计同一数据集的平均值并将其用于协方差估计时,请使用 sample_size - 1。否则你的协方差估计将会有偏差。

关于python - numpy 中的矩阵加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39484262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com