2

Выходы моей нейронной сети действуют как записи ковариационной матрицы. Тем не менее, один к одному соответствует между выходами и входами, приводит к не положительно определенным ковариационным матрицам.Обеспечение положительно определенной ковариационной матрицы

Таким образом, я прочитал https://www.quora.com/When-carrying-out-the-EM-algorithm-how-do-I-ensure-that-the-covariance-matrix-is-positive-definite-at-all-times-avoiding-rounding-issues и https://en.wikipedia.org/wiki/Cholesky_decomposition, более specificially «Если А имеет реальные записи, L имеет реальные записи, а также и разложение может быть записано A = LL^T».

Теперь мои выходы соответствуют элементам матрицы L, а затем я генерирую матрицу ковариации, умножая ее на ее транспонирование.

Однако иногда у меня все еще есть ошибка с положительно определенной матрицей. Как это возможно?

Я нашел матрицу, которая производит ошибку, см

print L.shape 
print Sigma.shape 

S = Sigma[1,18,:,:] # The matrix that gives the error 
L_ = L[1,18,:,:] 
print L_ 
S = np.dot(L_,np.transpose(L_)) 
print S 
chol = np.linalg.cholesky(S) 

дает в качестве вывода:

(3, 20, 2, 2) 
(3, 20, 2, 2) 
[[ -1.69684255e+00 0.00000000e+00] 
[ -1.50235415e+00 1.73807144e-04]] 
[[ 2.87927461 2.54925847] 
[ 2.54925847 2.25706792]] 
..... 
LinAlgError: Matrix is not positive definite 

Однако этот код с копированием значения работает отлично (но, вероятно, не точно то же значение, потому что не все десятичные знаки печатаются)

B = np.array([[-1.69684255e+00, 0.00000000e+00], [-1.50235415e+00, 1.73807144e-04]]) 
A = np.dot(B,B.T) 
chol_A = np.linalg.cholesky(A) 

Так вопросы:

  • Правильно ли используется метод Sigma = LL '(с транспозицией)?
  • Если да, то почему я получаю сообщение об ошибке? Может ли это быть связано с проблемами округления?

Edit: Я также вычислен собственные значения

print np.linalg.eigvalsh(S) 
[ -7.89378944432428397703915834426880e-08 
    5.13634252548217773437500000000000e+00] 

А во втором случае

print np.linalg.eigvalsh(A) 
[ 1.69341869415973178547574207186699e-08 
    5.680668125860393e+00] 

Так есть небольшое отрицательное собственное значение для первого случая, который объявляет без положительной определенности , Но как это решить?

+0

Ну, [Cholesky demposition] (https://en.wikipedia.org/wiki/Cholesky_decomposition), который вы указали, определяется только для матриц 'S', которые являются PD. Предложение «Когда A имеет вещественные записи, L также имеет вещественные записи, а факторизация может быть записана. A = LL^T» предполагает, что «A» - это PD, который ваш 'S' явно не является, как вы заметили. – sygi

+0

У вас такое же расхождение между оригиналом и копией, если вы распечатываете значения L для большей точности и копируете их? – dmuir

+0

Да, тот же результат для np.set_printoptions (точность = 40). Решив его, добавив eps * I к ковариационной матрице, хотя это не самое приятное решение, похоже, работает – Derk

ответ

1

Это похоже на числовую проблему, однако в целом неверно, что LL всегда будет положительно определенным. Например, возьмите L как матрицу, где каждый столбец [1 0 0 0 ... 0] (или даже более экстремальный) - возьмите L как нулевую матрицу произвольной размерности), LL 'не будет PD. В общем, я бы рекомендовал делать

S = LL' + eps I 

, который заботится о обеих проблем (для небольших ЭПС), и является «регуляризованная» оценка ковариационной. Вы даже можете пойти на «оптимальное» (при некоторых предположениях) значение eps с помощью оценки Ledoit-Wolf.

1

Я подозреваю, что вычисление L*L' выполняется с поплавками в первом случае и с удвоениями во втором. Я попытался взять ваш L в качестве матрицы с плавающей точкой, вычислив L*L и найти его собственные значения, и я получаю те же значения, которые вы делаете в первом случае, но если я преобразую L в матрицу парных чисел, вычислите L*L' и найдите собственные значения I получите те же значения, что и во втором случае.

Это имеет смысл, как при вычислении L*L' [1,1] квадрат 1.73807144e-04 будет в поплавках быть пренебрежимым по сравнению с квадратом -1,50235415e + 00.

Если я прав, решение состоит в том, чтобы преобразовать L в матрицу двойников перед любым вычислением.

 Смежные вопросы

  • Нет связанных вопросов^_^