Bonjour à tous,
Il est clair que R n'est pas très rapide, mais étant donnée notre objectif, il faudrait le montrer de manière un peu plus formelle. Pour cela, je pense qu'il faudrait comparer les performances relatives des différents langages. Un moyen simple serait de programmer le mini pseudo code suivant :
Voila pour l'idée générale. En pratique, ce qui nous intéresse est le temps d'exécution. De plus, on va faire REROLL=100 essais a chaque fois. Donc le code est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ### Lecture des données A <- read.file("matrix5.csv") ### Moyenne de chaque colonne, retourne un vecteur meanCol(A) ### Ecart type de chaque colonne, retourne un vecteur sdCol(A) ### Régression linéaire, la première colonne en fonction de toutes les autres lm(A[,1]~A[,2]+A[,3]+A[,4]+A[,5]) ### Régression linéaire, manuelle (détail dans le post suivant) inv( t(B)*B ) * ( t(B)*a )
Et comme il est possible, pour les petites matrices, que cela soit trop rapide, on ajoute une boucle qui fait faire ITER fois chaque opération :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ### Lecture des données A <- read.file("matrix5.csv") ### REROLL essais pour chaque opération. tableauTemps <- matrice vide(4 colonnes et REROLL lignes) boucle i variant de 1 à REROLL tableauTemps[i,1] <- temps de l'instruction( meanCol(A) ) tableauTemps[i,2] <- temps de l'instruction( sdCol(A) ) tableauTemps[i,3] <- temps de l'instruction( lm(A[,1]~A[,2]+A[,3]+A[,4]+A[,5]) ) tableauTemps[i,4] <- temps de l'instruction( inv( t(B)*B ) * ( t(B)*a ) ) finBoucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ### Lecture des données A <- read.file("matrix5.csv") ### 100 essais pour chaque opération. tableauTemps <- matrice vide (4 colonnes et REROLL lignes) boucle i variant de 1 à REROLL tableauTemps[i,1] <- temps de l'instruction(for(j variant de 1 à ITER) faire meanCol(A)) tableauTemps[i,2] <- temps de l'instruction(for(j variant de 1 à ITER) faire sdCol(A)) tableauTemps[i,3] <- temps de l'instruction(for(j variant de 1 à ITER) faire lm(A[,1]~A[,2]+A[,3]+A[,4]+A[,5]) ) tableauTemps[i,4] <- temps de l'instruction(for(j variant de 1 à ITER) faire inv( t(B)*B ) * ( t(B)*a ) ) finBoucle tableauTemps <- tableauTemps / ITER
Le but est de faire un code optimisé. Idéalement, il faudrait un exemple pour :
- R (Christophe)
- SAS(Laurent Orsy)
- SPSS
- STATA (Virginie)
- R, avec pqr (Mamoun, Christophe)
- R, avec compiler (Mamoun, Christophe)
- R, avec parallel (Mamoun, Christophe)
- C
- C++
- Calm
- Java (Malek)
- Phyton
A priori, il vous faut juste écrire le code, le tester sur 3 ou 4 matrices pour être sur qu'il marche, puis le poster ici. Les matrices sont là, soit en format wide (t colonnes, t² lignes), soit long (t² colonnes, t lignes) :
- Wide : matrix2.csv ; Long : matrixL2.csv (taille 1 Ko)
- Wide : matrix3.csv ; Long : matrixL3.csv (taille 1 Ko)
- Wide : matrix4.csv ; Long : matrixL4.csv (taille 1 Ko)
- Wide : matrix5.csv ; Long : matrixL5.csv (taille 1 Ko)
- Wide : matrix7.csv ; Long : matrixL7.csv (taille 2 Ko)
- Wide : matrix10.csv ; Long : matrixL10.csv (taille 6 Ko)
- Wide : matrix15.csv ; Long : matrixL15.csv (taille 19 Ko)
- Wide : matrix22.csv ; Long : matrixL22.csv (taille 57 Ko)
- Wide : matrix32.csv ; Long : matrixL32.csv (taille 174 Ko)
- Wide : matrix47.csv ; Long : matrixL47.csv (taille 548 Ko)
- Wide : matrix69.csv ; Long : matrixL69.csv (taille 1 732 Ko)
- Wide : matrix100.csv ; Long : matrixL100.csv (taille 5 266 Ko)
- Wide : matrix147.csv ; Long : matrixL147.csv (taille 16 717 Ko)
- Wide : matrix216.csv ; Long : matrixL216.csv (taille 53 015 Ko)
- Wide : matrix317.csv ; Long : matrixL317.csv (taille 167 527 Ko)
- Wide : matrix465.csv ; Long : matrixL465.csv (taille 528 673 Ko)
- Wide : matrix682.csv (taille 1 667 699 Ko)
- Wide : matrix1000.csv (taille 5 256 817 Ko)
Dans tous les cas, CA N'EST PAS LA PEINE de faire tous les tests puisque je referais tout moi-même sur ma machine (histoire de faire les comparaisons a machine constante).
Des volontaires ? Qui fait quoi ?.
Christophe
Partager