2017-04-14 1 views
-1

Je veux mettre en œuvre la solution indiquée ici: https://math.stackexchange.com/questions/2234019/fastest-way-of-sampling-multivariable-guassian-with-covariance-matrix-that-is-ci/Mise en œuvre du prélèvement multivariée gaussienne avec la matrice de covariance qui est circulante sur Python

Lequel cela devrait-je utiliser?
https://docs.scipy.org/doc/scipy/reference/linalg.html

Ai-je besoin d'écrire mon propre code? Quelle méthode donne le temps de calcul le plus efficace?

+0

La seule solution de la tablette, je suis au courant de https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html est, mais il ne semble pas faire toute optimisation pour la covariance circulante. –

+0

Pour être sûr de bien comprendre: vous savez comment échantillonner un Gaussien multivarié avec une matrice de covariance arbitraire (décomposition de Cholesky et produit scalaire), mais vous voulez éviter la décomposition de Cholesky et cherchez quelque chose de plus rapide qui profite de la circulance de la covariance propriété? Ai-je raison? –

+0

Oui Ahmed. Je veux le faire sous O (N^3) fois. La décomposition de Cholesky pour une matrice définie positive arbitraire prend ici beaucoup de temps. –

Répondre

0

I traduit une de C++ pour python http://people.sc.fsu.edu/~jburkardt/cpp_src/toeplitz_cholesky/toeplitz_cholesky.html

Ceci calcule la factorisation de Cholesky d'une matrice de Toeplitz définie non négative symétrique.

import numpy as np 


def toeplitz_cholesky_lower(n, g): 
    # G[0][0:N] contains the first row. 
    # G[1][1:N] contains the first column. 

    arr = [[0] * n for _ in range(n)] 
    for entry in range(n): 
     arr[entry][0] = g[0][entry] 
    g[0][1:] = g[0][:-1] 
    g[0][0] = 0.0 

    for i in range(1,n): 
     rho = - g[1][i]/g[0][i] 
     div = np.sqrt((1.0 - rho)*(1.0 + rho)) 
     for j in range(i,n): 
      g1j = g[0][j] 
      g2j = g[1][j] 
      g[0][j] = (g1j + rho*g2j)/div 
      g[1][j] = (rho*g1j + g2j)/div 
     for j in range(i,n): 
      arr[j][i] = g[0][j] 
     for j in range(n-1, i, -1): 
      g[0][j] = g[0][j-1] 
     g[0][i] = 0.0 
    return arr