σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyFeuilles de routeParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Feuilles de routeParcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours SciPy›Module 3 · Matrices, signaux et structure›Sujet 3.2·~45 minIntermédiaire

Matrices creuses

Position dans le parcoursModule 3 sur 3 · Sujet 2 sur 5
3.2 Matrices creuses
—Score du lab— / 100XP total—Série—

Ne stocker que ce qui n'est pas nul

Beaucoup de grandes matrices sont presque entièrement nulles. Une grille pour valoriser une option a une ligne par niveau de prix, et chaque ligne ne touche que ses deux voisines. Une telle matrice est dite creuse. Stocker chaque zéro gaspille mémoire et temps. scipy.sparse ne garde que les entrées non nulles. Le format csr_matrix (ligne creuse compressée) utilise trois listes. data contient les valeurs non nulles ligne par ligne, indices la colonne de chaque valeur, et indptr dit où chaque ligne commence et finit dans data : la ligne iii est data[indptr[i]:indptr[i+1]]. Le dernier nombre de indptr est le nombre de valeurs non nulles, nnz.

Des formats différents conviennent à des tâches différentes. coo_matrix stocke de simples triplets (ligne, colonne, valeur) et c'est la façon facile de construire une matrice. csr_matrix est rapide pour les tranches de lignes et pour le produit AxA\mathbf xAx, qui coûte environ nnz multiplications au lieu de n2n^2n2. csc_matrix est la même idée par colonnes, et dia_matrix stocke des diagonales, idéal pour les matrices bandes. Pour un système Ax=bA\mathbf x=\mathbf bAx=b, sparse.linalg.spsolve exploite les zéros pour être bien plus rapide qu'une résolution dense. Le creux n'est pas toujours meilleur : si plus d'un tiers environ des entrées sont non nulles, la comptabilité coûte plus qu'elle ne rapporte. En finance, la sparsité apparaît dans les grilles de valorisation, dans les modèles à facteurs où la plupart des expositions sont nulles, et quand on ne garde que les fortes corrélations.

Ax costs ≈nnz multiplications,density=nnzn2,row i=data[indptr[i]:indptr[i+1]]A\mathbf x\ \text{costs}\ \approx \mathrm{nnz}\ \text{multiplications},\qquad \text{density}=\frac{\mathrm{nnz}}{n^{2}},\qquad \text{row } i=\texttt{data}[\texttt{indptr}[i]:\texttt{indptr}[i+1]]Ax costs ≈nnz multiplications,density=n2nnz​,row i=data[indptr[i]:indptr[i+1]](1)
Lire une matrice CSRPrenons la matrice 4×44\times44×4 de lignes (5;0;0;1)(5;0;0;1)(5;0;0;1), (0;0;2;0)(0;0;2;0)(0;0;2;0), (0;0;0;0)(0;0;0;0)(0;0;0;0) et (3;0;0;4)(3;0;0;4)(3;0;0;4). En CSR, data=[5,1,2,3,4], indices=[0,3,2,0,3] et indptr=[0,2,3,3,5]. La ligne 222 est vide car indptr[2]=indptr[3]=3, et nnz=5. Multiplier par (1;1;1;1)(1;1;1;1)(1;1;1;1) additionne chaque ligne, ce qui donne (6;2;0;7)(6;2;0;7)(6;2;0;7) avec seulement 555 multiplications. Une matrice tridiagonale avec n=1000n=1000n=1000, comme une grille de valorisation aux différences finies, a 2 9982\,9982998 valeurs non nulles sur 1 000 0001\,000\,0001000000 entrées, soit une densité de 0,30%0{,}30\%0,30%. Elle demande environ 404040 Ko en CSR contre 888 Mo en dense. Sur données réelles, les corrélations de 555555 actions du fichier de prix partagé forment une matrice 55×5555\times5555×55. Ne garder que les entrées avec ∣ρ∣>0,5|\rho|>0{,}5∣ρ∣>0,5 laisse 249249249 des 3 0253\,0253025 entrées, soit 8,2%8{,}2\%8,2%, et la copie CSR prend 3,23{,}23,2 Ko contre 24,224{,}224,2 Ko en dense. À ∣ρ∣>0,6|\rho|>0{,}6∣ρ∣>0,6, il n'en reste que 4,3%4{,}3\%4,3%.
  • Trois listes : data, indices et indptr décrivent une matrice CSR, et indptr[-1] est le nombre de valeurs non nulles.
  • Construire en COO, calculer en CSR : les triplets sont faciles à assembler, le stockage par lignes est rapide pour produits et résolutions.
  • Le creux ne paie que s'il y a surtout des zéros : une matrice dense vaut mieux quand beaucoup d'entrées sont non nulles.

Lab : ce qui est noté

  • Compter les valeurs non nulles10 pts
  • Combien de valeurs dans une ligne10 pts
  • La densité d'une grille10 pts
  • Un produit creux15 pts
  • Quel format pour quelle tâche15 pts
  • Un système tridiagonal10 pts
  • Quand le creux rapporte et quand non30 pts
0/ 7 traités
Exercices
1Réponse numérique10 ptsSans réponse

Une matrice CSR a indptr=[0,2,3,3,5]. Que vaut nnz, le nombre de valeurs non nulles stockées ?

n=n =n=accepté : ± 0.01
2Réponse numérique10 ptsSans réponse

Avec indptr=[0,2,3,3,5], combien de valeurs stockées contient la ligne 333 (la dernière, en comptant à partir de 000) ? C'est indptr[4]-indptr[3].

k=k =k=accepté : ± 0.01
3Réponse numérique10 ptsSans réponse

Une matrice de valorisation tridiagonale avec n=1000n=1000n=1000 a 2 9982\,9982998 valeurs non nulles parmi 1 000 0001\,000\,0001000000 d'entrées. Quelle est la densité en pourcentage ? Donnez deux décimales.

d=d =d=accepté : ± 0.01
4Réponse numérique15 ptsSans réponse

Pour la matrice de lignes (5;0;0;1)(5;0;0;1)(5;0;0;1), (0;0;2;0)(0;0;2;0)(0;0;2;0), (0;0;0;0)(0;0;0;0)(0;0;0;0) et (3;0;0;4)(3;0;0;4)(3;0;0;4), que vaut la dernière composante de AxA\mathbf xAx pour x=(1;1;1;1)\mathbf x=(1;1;1;1)x=(1;1;1;1) ?

y=y =y=accepté : ± 0.01
5Associer15 ptsSans réponse

Associez chaque format creux à la tâche qui lui convient le mieux.

Choisissez le partenaire de chaque élément de gauche.

coo_matrix
csr_matrix
csc_matrix
dia_matrix
6Choix10 ptsSans réponse

Vous devez résoudre à chaque pas de temps d'une grille de valorisation un système tridiagonal à n=100 000n=100\,000n=100000 inconnues. Quel est le choix raisonnable ?

7Expliquer avec des mots30 ptsSans réponse

En une ou deux phrases, expliquez pourquoi un format creux économise mémoire et temps pour une matrice surtout nulle, et pourquoi il peut perdre face à une matrice dense quand la plupart des entrées sont non nulles.

Mode mathsSaisie au clavier ou en LaTeXExercice 1 sur 7 · Ctrl ⏎ pour vérifier

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub