Это правильный способ вычисления ковариационной матрицы для 2D-карты объектов?

#neural-network #statistics #pytorch #covariance #covariance-matrix

#нейронная сеть #Статистика #pytorch #ковариация #ковариационная матрица

Вопрос:

В нейронной сети у меня есть несколько 2D-карт объектов со значениями от 0 до 1. Для этих карт я хочу вычислить ковариационную матрицу на основе значений в каждой координации. К сожалению, pytorch не имеет такой .cov() функции, как в numpy. Поэтому вместо этого я написал следующую функцию:

 def get_covariance(tensor):
    bn, nk, w, h = tensor.shape
    tensor_reshape = tensor.reshape(bn, nk, 2, -1)
    x = tensor_reshape[:, :, 0, :]
    y = tensor_reshape[:, :, 1, :]
    mean_x = torch.mean(x, dim=2).unsqueeze(-1)
    mean_y = torch.mean(y, dim=2).unsqueeze(-1)

    xx = torch.sum((x - mean_x) * (x - mean_x), dim=2).unsqueeze(-1) / (h * w - 1)
    xy = torch.sum((x - mean_x) * (y - mean_y), dim=2).unsqueeze(-1) / (h * w - 1)
    yx = xy
    yy = torch.sum((y - mean_y) * (y - mean_y), dim=2).unsqueeze(-1) / (h * w - 1)

    cov = torch.cat((xx, xy, yx, yy), dim=2)
    cov = cov.reshape(bn, nk, 2, 2)
    return cov
  

Это правильный способ сделать это?

Редактировать:

Вот сравнение с функцией numpy:

 a = torch.randn(1, 1, 64, 64)
a_numpy = a.reshape(1, 1, 2, -1).numpy()

torch_cov = get_covariance(a)
numpy_cov = np.cov(a_numpy[0][0])

torch_cov
tensor([[[[ 0.4964, -0.0053],
          [-0.0053,  0.4926]]]])

numpy_cov
array([[ 0.99295635, -0.01069122],
       [-0.01069122,  0.98539236]])
  

По-видимому, мои значения слишком малы в 2 раза. Почему это может быть?

Редактирование 2: Аааа, я понял это. Его нужно разделить на (h*w/2 - 1) 🙂 Тогда значения совпадают.

Комментарии:

1. Вы сравнивали с результатами NumPy .cov() ?

2. По какой-то причине я получаю половину значений с моей формулой :/

3. @spadel Пожалуйста, отправьте самостоятельный ответ и примите его, спасибо.