同时计算多个轴上的方差

问题描述 投票:0回答:1

我试图了解多个轴上的方差是如何工作的以及它是否可以通过使用单独的操作来实现。 让我们有一个形状为 (2,2,3) 的输入 3d 矩阵,我们感兴趣的是计算轴 0,2 上的方差。如果我们使用 pytorch 张量,那么可以通过 torch.var(input,axis=(0,2)) 来实现。现在我正在尝试分部分实现这一点,代码如下

import torch

# Create a sample 3D tensor
input_tensor = torch.tensor([
    [[1.0, 2.0, 3.0],
     [4.0, 5.0, 6.0]],
    [[7.0, 8.0, 9.0],
     [10.0, 11.0, 12.0]]
])

#calculating variance over multiple axes
input_tensor.var(axis=(0,2),unbiased=False)

#calculating them using individual operations
((input_tensor - input_tensor.mean(axis=(0,2),keepdims=True))**2).mean((0,2))

我已经了解了它的一些要点,但我想知道它的内部工作原理以及如果我们同时访问多个轴,矩阵会是什么样子。我可以在 2D 中将它们联系起来,但在 3D 维度中却感到困惑,尤其是在上述轴中。当我们保持“unbiased=True”时,pytorch 结果也会改变。 我正在寻找可能的解释,它是如何在底层以数学方式完成的,以及如何通过单独的操作来实现的。

pytorch linear-algebra probability matrix-multiplication variance
1个回答
0
投票

计算多个维度上的方差可以被认为是计算一维向量的方差,其分量是内部维度与外部维度的串联。内部是第二个,外部是零维度,从右向左读取。

请考虑以下代码作为示例:

import torch
test_tensor = torch.randn((3,4,5))
v1 = test_tensor.var(dim=[0,2], unbiased=False)[0]  # pick the first coordinate of the result
mean = 0
for i in range(3):
    for j in range(5):
        mean += test_tensor[i, 0, j].item()
mean /= 15
v2 = 0
for i in range(3):
    for j in range(5):
        v2 += (test_tensor[i, 0, j].item() - mean)**2
v2 /= 15
print(v1.item(), v2)


您可以尝试一下,验证两种计算方差的方法是等价的。

注意显式计算中的嵌套顺序。每次经过第二个维度时,我都会跨过零维度一次。从数学上讲,均值和方差并不重要,因为这些函数不依赖于元素的顺序,因此我可以切换顺序并在第二个维度上的每个步骤中传递零维度。但对于其他功能,顺序可能很重要。

我指定的顺序(第二次传递时在零维度中迈出一步)与您尝试此操作时得到的结果一致:

test_tensor[:, 0, :].flatten()

关于有偏见无偏见: 它是通过计算某个总体的有限样本的方差来估计该总体的方差。假设您可以从同一总体中获得许多有限样本。对于每个样本,您计算方差。这些方差会有所不同,因为您是从总体中抽样而不是从整个总体中抽样。

现在,您计算所计算出的方差的平均值。该均值与原始总体的实际方差有何关系?如果它们(样本方差的平均值和实际总体方差)一致,则这是一个无偏估计量。如果他们不同意,则这是一个有偏差的估计。

事实证明,如果您希望估计器无偏,您可以将平方距离之和除以

n-1
,而不是除以
n

欲了解更多详情,请参阅 贝塞尔修正

© www.soinside.com 2019 - 2024. All rights reserved.