Numpy Cholesky descomposición LinAlgError

En mi bash de realizar una descomposición aleatoria en una matriz de varianza-covarianza para una matriz 2D de condición de frontera periódica, bajo ciertas combinaciones de parámetros, siempre obtengo LinAlgError: Matrix is not positive definite - Cholesky decomposition cannot be computed . No estoy seguro de si es un problema numpy.linalg o de implementación, ya que el script es sencillo:

 sigma = 3. U = 4 def FromListToGrid(l_): i = np.floor(l_/U) j = l_ - i*U return np.array((i,j)) Ulist = range(U**2) Cov = [] for l in Ulist: di = np.array([np.abs(FromListToGrid(l)[0]-FromListToGrid(i)[0]) for i, x in enumerate(Ulist)]) di = np.minimum(di, U-di) dj = np.array([np.abs(FromListToGrid(l)[1]-FromListToGrid(i)[1]) for i, x in enumerate(Ulist)]) dj = np.minimum(dj, U-dj) d = np.sqrt(di**2+dj**2) Cov.append(np.exp(-d/sigma)) Cov = np.vstack(Cov) W = np.linalg.cholesky(Cov) 

Los bashs de eliminar potenciales singulares también fallaron para resolver el problema. Cualquier ayuda es muy apreciada.

Profundizando un poco más en el problema, intenté imprimir los valores propios de la matriz de Cov.

 print np.linalg.eigvalsh(Cov) 

Y la respuesta resulta ser esta.

 [-0.0801339 -0.0801339 0.12653595 0.12653595 0.12653595 0.12653595 0.14847999 0.36269785 0.36269785 0.36269785 0.36269785 1.09439988 1.09439988 1.09439988 1.09439988 9.6772531 ] 

Jajaja Observe los dos primeros valores propios negativos? Ahora, una matriz es positiva definida si y solo si todos sus valores propios son positivos. Entonces, el problema con la matriz no es que esté cerca de ‘cero’, sino que sea ‘negativo’. Para extender la analogía de @duffymo, esto es un álgebra lineal equivalente a tratar de tomar una raíz cuadrada de un número negativo.

Ahora, intentemos realizar la misma operación, pero esta vez con scipy.

 scipy.linalg.cholesky(Cov, lower=True) 

Y eso deja de decir algo más.

 numpy.linalg.linalg.LinAlgError: 12-th leading minor not positive definite 

Eso está diciendo algo más (aunque realmente no pude entender por qué se quejaba de la 12ª menor).

En pocas palabras, la matriz no está muy cerca de ‘cero’, sino que se parece más a ‘negativa’

El problema es la información que le estás dando. La matriz es singular, según el solucionador. Eso significa un elemento diagonal cero o casi cero, por lo que la inversión es imposible.

Sería más fácil de diagnosticar si pudiera proporcionar una versión pequeña de la matriz.

Las diagonales cero no son la única forma de crear una singularidad. Si dos filas son proporcionales entre sí, entonces no necesita ambas en la solución; son redundantes Es más complejo que solo buscar ceros en la diagonal.

Si su matriz es correcta, tiene un espacio nulo no vacío. Tendrá que cambiar los algoritmos a algo como SVD.

Ver mi comentario a continuación.