Multiplier efficacement les matrices creuses et lentes de Numpy / Scipy

Je suis en train de travailler pour mettre en œuvre l'équation suivante:

X =(Y.T * Y + Y.T * C * Y) ^ -1

Y est un (e x f) la matrice C (n x n) de diagonale; n est d'environ 300 k et f varie entre 100 et 200. Dans le cadre d'un processus d'optimisation de cette équation sera utilisé près de 100 millions de fois, donc elle doit être traitée très rapidement.

Y est initialisé aléatoirement, et C est une très sparse matrix avec seulement quelques numéros de la 300k sur la diagonale sera différent de 0.Depuis Numpy diagonal fonctions crée des matrices denses, j'ai créé C comme un sparse rse de la matrice. Mais lorsque j'essaie de résoudre la première partie de l'équation:

r = dot(C, Y)

L'ordinateur tombe en panne en raison des limites de la Mémoire. J'ai alors décidé d'essayer de convertir Y de csr_matrix et de faire la même opération:

r = dot(C, Ysparse)

et cette approche a pris 1.38 ms. Mais cette solution est un peu "délicat" depuis que je suis à l'aide d'une matrice creuse pour stocker dense, je me demande quelle est l'efficacité de cette vraiment.

Donc ma question est si est-il un moyen de multiplier les rares C et de la densité de Y, sans avoir à tourner en Y dans éparses et d'améliorer les performances? Si d'une certaine façon C pourrait être représenté comme diagonale dense sans consommer beaucoup de mémoire peut-être que cela conduirait à la performance très efficace mais je ne sais pas si c'est possible.

Je vous remercie de votre aide!

source d'informationauteur Willian Fuks