Как вы генерируете положительно определенную матрицу в pytorch? - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь определить многомерное распределение Гаусса со случайно сгенерированной ковариационной матрицей:

psi = torch.zeros(512).normal_(0., 1.).requires_grad_(True)

# Generate random matrix
Sigma_k = torch.rand(512, 512)
# Make it symmetric positive
Sigma_k = Sigma_k * Sigma_k.t()
# Make it definite
Sigma_k.add_(0.001, torch.eye(512)).requires_grad_(True)

multivariate_normal.MultivariateNormal(psi, Sigma_k)

Но я получаю исключение:

RuntimeError: Ошибка Lapack в potrf: старший несовершеннолетний порядка 2 не является положительно определенным в /Users/soumith/mc3build/conda-bld/pytorch_1549597882250/work/aten/src/TH/generic/THTensorLapack.cpp:658

Чтоправильный способ генерирования положительно определенной квадратной матрицы?

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

В «сделай это определенно»

tensor.add() не меняет tensor, а только возвращает измененную версию. Вы хотите использовать tensor.add_()

1 голос
/ 02 октября 2019

Ответ состоит в том, что нужно сделать точечное произведение матрицы A и ее транспонированной матрицы (A.t()), чтобы получить положительную полуопределенную матрицу. Последнее, что нужно сделать, это убедиться, что оно определено (строго больше нуля).

С Pytorch:

Sigma_k = torch.rand(512, 512)
Sigma_k = torch.mm(Sigma_k, Sigma_k.t())
Sigma_k.add_(torch.eye(512))

Формальный алгоритм описан здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...