In meinem Versuch, Cholesky-Zerlegung auf einer Varianz-Kovarianz-Matrix für ein 2D-Array der periodischen Randbedingung durchzuführen, bekomme ich unter bestimmten Parameterkombinationen immer LinAlgError: Matrix is not positive definite - Cholesky decomposition cannot be computed
. Nicht sicher, ob es sich um eine numpy.linalg
oder Implementierungsproblem ist, wie das Skript einfach ist:Numpy Cholesky Zerlegung LinAlgError
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)
Versuche Potential singularies entfernen auch das Problem zu lösen ist fehlgeschlagen. Jede Hilfe wird sehr geschätzt.
Was haben Sie getan, um Singularitäten zu entfernen? Funktioniert etwas wie Cov = Cov + numpy.diag (numpy.repeat (delta, k))? (Im Grunde eine kleine diagonale Matrix zu Cov hinzufügen. Hier Delta ist ein kleiner float und k ist Dimension von Cov) –
Ich hatte einfach Cov = Cov + d * np.identity (k). Aber wenn man sich die ursprüngliche Matrix anschaut, scheint kein Wert nahe 0 zu sein. –