You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Il existe aussi des méthodes pratiques pour créer des array:
111
139
112
140
* séquences logiques : `np.arange` (suite) ou `np.linspace` (interpolation linéaire entre deux bornes)
113
141
* séquences ordonnées: _array_ rempli de zéros, de 1 ou d'un nombre désiré : `np.zeros`, `np.ones` ou `np.full`
114
142
* séquences aléatoires: fonctions de génération de nombres aléatoires: `np.rand.uniform`, `np.rand.normal`, etc.
115
143
* tableau sous forme de matrice identité: `np.eye`
116
144
117
-
Il est possible d'ajouter un argument `dtype` pour contraindre le type du *array*:
118
145
119
146
```{python}
120
147
np.arange(0,10)
@@ -412,8 +439,6 @@ les fonctions `np.concatenate`, `np.vstack` ou la méthode `.r_` (concaténation
412
439
x = np.random.normal(size = 10)
413
440
```
414
441
415
-
A l'inverse,
416
-
417
442
Pour ordonner un array, on utilise `np.sort`
418
443
419
444
```{python}
@@ -432,10 +457,12 @@ np.partition(x, 3)
432
457
433
458
## Broadcasting
434
459
435
-
Le broadcasting désigne un ensemble de règles pour appliquer une opération qui normalement
436
-
ne s'applique que sur une seule valeur à l'ensemble des membres d'un tableau Numpy.
460
+
Le *broadcasting* désigne un ensemble de règles permettant
461
+
d'appliquer des opérations sur des tableaux de dimensions différentes. En pratique,
462
+
cela consiste généralement à appliquer une seule opération à l'ensemble des membres d'un tableau `numpy`.
437
463
438
-
Le broadcasting nous permet d'appliquer ces opérations sur des tableaux de dimensions différentes.
464
+
La différence peut être comprise à partir de l'exemple suivant. Le *broadcasting* permet
465
+
de transformer le scalaire `5` en *array* de dimension 3:
439
466
440
467
```{python}
441
468
a = np.array([0, 1, 2])
@@ -450,13 +477,15 @@ Le *broadcasting* peut être très pratique pour effectuer de manière efficace
450
477
la structure complexe. Pour plus de détails, se rendre
451
478
[ici](https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arrays-broadcasting.html) ou [ici](https://stackoverflow.com/questions/47435526/what-is-the-meaning-of-axis-1-in-keras-argmax).
452
479
453
-
## Application: k-nearest neighbor fait-main
480
+
## Une application: programmer ses propres k-nearest neighbors
Pour la question 2, vous devriez obtenir un graphique ayant cet aspect :
544
+
545
+
```{r, echo = FALSE}
546
+
knitr::include_graphics("scatter_numpy.png")
547
+
```
548
+
549
+
```{python, include = FALSE}
529
550
# 3. Construire la matrice des distances euclidiennes
530
551
print(X.shape)
531
552
X1 = X[:, np.newaxis, :]
@@ -551,18 +572,29 @@ print(nearest_partition) # Ne pas oublier que le plus proche voisin d'un point e
551
572
552
573
#7. Tester le bout de code
553
574
# Each point in the plot has lines drawn to its two nearest neighbors.
575
+
fig = plt.figure()
554
576
for i in range(X.shape[0]):
555
577
for j in nearest_partition[i, :K+1]:
556
578
# plot a line from X[i] to X[j]
557
579
# use some zip magic to make it happen:
558
580
plt.plot(*zip(X[j], X[i]), color='black')
581
+
fig
582
+
plt.savefig("knn.png", bbox_inches='tight')
583
+
```
584
+
585
+
Le résultat de la question 7 est le suivant:
586
+
587
+
```{r, echo = FALSE}
588
+
knitr::include_graphics("knn.png")
559
589
```
560
590
561
591
562
592
Ai-je inventé cet exercice corsé ? Pas du tout, il [vient de là](https://jakevdp.github.io/PythonDataScienceHandbook/02.08-sorting.html#Example:-k-Nearest-Neighbors). Mais, si je vous l'avais indiqué immédiatement, auriez-vous cherché à répondre aux questions ?
563
593
564
594
Par ailleurs, il ne serait pas une bonne idée de généraliser cet algorithme à de grosses données. La complexité de notre approche est $O(N^2)$. L'algorithme implémenté par Scikit-learn est
565
-
en $O[NlogN]$
595
+
en $O[NlogN]$.
596
+
597
+
De plus, le calcul de distances matricielles en utilisant la puissance des cartes graphiques serait plus rapide. A cet égard, la librairie [faiss](https://github.com/facebookresearch/faiss) offre des performances beaucoup plus satisfaisantes que celles que permettraient `numpy` sur ce problème précis.
0 commit comments