Не удается установить дистрибутив MvNormal с помощью Distributions.jl. ОШИБКА: PosDefException: матрица не является положительно определенной; Факторизация Холецкого не удалась

Я пытаюсь подогнать распределение MvNormal к матрице спектральных данных, но получаю следующую ошибку:

Distributions.fit(MvNormal, myMatrix)

> ERROR: PosDefException: matrix is not positive definite; Cholesky factorization failed.

myMatrix состоит из показаний поглощения (по одному столбцу на элемент) для многих последовательных волновых чисел (строк). Это не квадратная матрица и, следовательно, она не может быть положительно определенной.

Из того, что я видел в Интернете, многие люди сообщают об ошибках различных методов, которые не работают на этапе факторизации Холецкого в Джулии. Я понимаю, что это происходит из-за более строгой, чем другие языки, проверки соблюдения критерия PD, когда это необходимо.

Другие люди (см. этот пост, например) удалось решить эту проблему, внеся небольшие изменения в параметр сигма при указании распределения. Однако, поскольку я не создаю распределение с точки зрения его параметров, а подгоняю его к матрице, я не уверен, что делать.

Буду очень признателен за любые предложения по

  • как я мог бы попытаться сделать мою матрицу пригодной для факторизации Холецкого, или
  • подобрать многомерное нормальное распределение к моим данным, используя любой другой метод или пакет.

person Ivan Casas    schedule 16.06.2021    source источник


Ответы (1)


На момент написания этого я полагал, что это сообщение об ошибке вводит в заблуждение или, возможно, является ошибкой.

fit не ожидает, что myMatrix будет положительно определенным, на самом деле это даже не должна быть квадратная матрица.

fit ожидает, что вторым аргументом будет матрица n на S, где n — это количество измерений, а S — это количество выборок, с которыми вы сопоставляетесь. Сообщение об ошибке относительно положительно-определенных матриц и положительно-определенных проблем просто исходит из математики, которую он выполняет во время подбора недоопределенной системы. При нормальных обстоятельствах мы ожидаем, что S будет намного больше, чем n.

Пример:

# Construct samples:
C = [0.2 0; 0.1 0.3]
mean = [2.,3.]
d = MvNormal(mean, C)
samples = rand(d, 100) # This is your input data, in this case a 2x100 matrix.

# Fitting:
d_fit = Distributions.fit(MvNormal, samples)

Сравнивая d и d_fit, я вижу довольно хорошее совпадение, и оно улучшается с увеличением количества образцов.

Подводя итог: вам, вероятно, просто нужно больше (уникальных) сэмплов, чтобы соответствовать им.

person Mikael Öhman    schedule 10.07.2021