à jour
This commit is contained in:
parent
2e3a2f89ad
commit
65f1eb78d9
@ -1,7 +1,6 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import sys, os
|
import sys, os
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from random import random, choice
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from time import sleep
|
from time import sleep
|
||||||
import argparse
|
import argparse
|
||||||
@ -11,27 +10,48 @@ from math import * # pour utliser les fonctions mathématiques dans l'option -f
|
|||||||
MNI TP3 - 27 janvier 2020
|
MNI TP3 - 27 janvier 2020
|
||||||
Dylan Voisin - M1 Informatique Luminy
|
Dylan Voisin - M1 Informatique Luminy
|
||||||
Franck Palacios - M1 Informatique Luminy
|
Franck Palacios - M1 Informatique Luminy
|
||||||
|
Cyril Colin - M1 Informatique Luminy
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- u1 et u2 ne semblent pas orthogonaux, ceci est dû à la non utilisation
|
- u1 et u2 ne semblent pas orthogonaux, ceci est dû à la non utilisation
|
||||||
d'une échelle 1:1 pour l'affichage des points
|
d'une échelle 1:1 pour l'affichage des points
|
||||||
- u1 et u2 ne sont pas proportionnels par rapport à lambda mais à la
|
- u1 et u2 ne sont pas proportionnels par rapport à lambda mais à la
|
||||||
distance entre le barycentre et le point le plus éloigné selon la
|
distance entre le barycentre et la limite de la fenêtre
|
||||||
composante x ou y
|
|
||||||
- u1 est orienté «vers la droite» et u2 «vers le haut» dans ce programme
|
- u1 est orienté «vers la droite» et u2 «vers le haut» dans ce programme
|
||||||
|
- u1 et u2 apparaîssent comment des traits plutôt que des flèches car
|
||||||
|
matplotlib gère mal l'affichage de vecteurs, et plt.arrow peut dans
|
||||||
|
certains cas donner des têtes de flèche assez étranges selon le rapport
|
||||||
|
y:x du nuage de point
|
||||||
|
- le code n'a pas besoin d'être touché pour changer le comportement lors
|
||||||
|
du lancement, exemples:
|
||||||
|
|
||||||
|
* afficher un nuage de point selon cos(x) entre 0 et 1 (pas de 0.1 par
|
||||||
|
défaut et inchangeable sauf dans le code):
|
||||||
|
> python3 TP3_voisin.py -f "cos(x)" -m 1 -s
|
||||||
|
|
||||||
|
* idem mais avec un bruit de 0.5 (-g applique le bruit -n BRUIT dès la génération)
|
||||||
|
> python3 TP3_voisin.py -f "cos(x)" -m 1 -g -n 0.5 -s
|
||||||
|
|
||||||
|
* afficher 10 boucles (avec bruit, défaut=10) avec la fonction sqrt(x)
|
||||||
|
> python3 TP3_voisin.py -f "sqrt(x)" -m 10 -n 2 -l 10
|
||||||
|
le délai entre chaque itération se fait avec le paramètre -d SECONDES (ex -d 2.5)
|
||||||
|
|
||||||
|
* afficher les points contenus dans le fichier exemple.txt (format plus bas)
|
||||||
|
> python3 TP3_voisin.py -i exemple.txt -s
|
||||||
|
|
||||||
|
* les boucles, génération de bruit à l'initialisation sont également possible pour
|
||||||
|
la lecture d'un fichier
|
||||||
|
|
||||||
|
* on peut afficher l'aide via
|
||||||
|
> python3 TP3_voisin.py -h
|
||||||
|
|
||||||
|
Format du fichier d'entrée:
|
||||||
|
x0 y0
|
||||||
|
x1 y1
|
||||||
|
…
|
||||||
|
xn yn
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def acquérir_depuis_fichier(filename):
|
|
||||||
# l_pts = []
|
|
||||||
# with open(filename) as f:
|
|
||||||
# for line in f:
|
|
||||||
# split = line.split()
|
|
||||||
# if len(split) == 2:
|
|
||||||
# l_pts.append(list(map(float, split)))
|
|
||||||
# return np.array(l_pts)
|
|
||||||
return np.loadtxt(filename)
|
|
||||||
|
|
||||||
def calc_barycentre(l_pts):
|
def calc_barycentre(l_pts):
|
||||||
x = sum(l_pts[:,0]) / len(l_pts)
|
x = sum(l_pts[:,0]) / len(l_pts)
|
||||||
y = sum(l_pts[:,1]) / len(l_pts)
|
y = sum(l_pts[:,1]) / len(l_pts)
|
||||||
@ -130,13 +150,11 @@ def get_info_affichage(l_pts):
|
|||||||
pb = min(l_pts, key = lambda x: x[1])
|
pb = min(l_pts, key = lambda x: x[1])
|
||||||
pg = min(l_pts, key = lambda x: x[0])
|
pg = min(l_pts, key = lambda x: x[0])
|
||||||
dist = min(max(l_pts[:,0]) - bary[0], max(l_pts[:,1]) - bary[1])
|
dist = min(max(l_pts[:,0]) - bary[0], max(l_pts[:,1]) - bary[1])
|
||||||
# dist = max(map(lambda x: np.linalg.norm(x-bary), l_pts))
|
|
||||||
dist_x = max(l_pts[:,0]) - min(l_pts[:,0])
|
dist_x = max(l_pts[:,0]) - min(l_pts[:,0])
|
||||||
dist_y = max(l_pts[:,1]) - min(l_pts[:,1])
|
dist_y = max(l_pts[:,1]) - min(l_pts[:,1])
|
||||||
x_range = min(l_pts[:,0]) - 0.1 * dist_x, max(l_pts[:,0]) + 0.1 * dist_x
|
x_range = min(l_pts[:,0]) - 0.1 * dist_x, max(l_pts[:,0]) + 0.1 * dist_x
|
||||||
y_range = min(l_pts[:,1]) - 0.1 * dist_y, max(l_pts[:,1]) + 0.1 * dist_y
|
y_range = min(l_pts[:,1]) - 0.1 * dist_y, max(l_pts[:,1]) + 0.1 * dist_y
|
||||||
u1, u2 = get_u1_u2_affichage(u1, u2, bary, dist_x, dist_y, pb, pg)
|
u1, u2 = get_u1_u2_affichage(u1, u2, bary, dist_x, dist_y, pb, pg)
|
||||||
# print(u1, u2)
|
|
||||||
return u1, u2, x_range, y_range
|
return u1, u2, x_range, y_range
|
||||||
|
|
||||||
|
|
||||||
@ -148,7 +166,6 @@ def visualiser_nuage(l_pts):
|
|||||||
plt.scatter(l_pts[:,0], l_pts[:,1])
|
plt.scatter(l_pts[:,0], l_pts[:,1])
|
||||||
ax.arrow(*bary, *u1, ec="red", fc="white")
|
ax.arrow(*bary, *u1, ec="red", fc="white")
|
||||||
ax.arrow(*bary, *u2, ec="orange", fc="white")
|
ax.arrow(*bary, *u2, ec="orange", fc="white")
|
||||||
# ax.set_aspect('equal')
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
def animation_nuage(l_pts, loops=10, time_sleep=2, delta_bruit=3):
|
def animation_nuage(l_pts, loops=10, time_sleep=2, delta_bruit=3):
|
||||||
@ -220,41 +237,20 @@ def main(argv):
|
|||||||
print("File", args.input, "not found.", file=sys.stderr)
|
print("File", args.input, "not found.", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
l_pts = acquérir_depuis_fichier(args.input)
|
l_pts = np.loadtxt(args.input)
|
||||||
else:
|
else:
|
||||||
l_pts = []
|
|
||||||
n = args.max_dot_xval
|
n = args.max_dot_xval
|
||||||
f = lambda x: eval(args.function) # fonction génératrice de la ditribution
|
f = lambda x: eval(args.function) # fonction génératrice de la ditribution
|
||||||
if args.generate_with_noise:
|
l_pts = np.array([[i, f(i)] for i in np.arange(0, n, 0.1)])
|
||||||
|
if args.generate_with_noise:
|
||||||
delta_bruit = args.noise # bruit généré, 0 si on en veut aucun
|
delta_bruit = args.noise # bruit généré, 0 si on en veut aucun
|
||||||
else:
|
bruit = np.random.random(len(l_pts)) * 2 * delta_bruit - delta_bruit
|
||||||
delta_bruit = 0
|
l_pts[:,1] += bruit # application du bruit
|
||||||
for i in np.arange(0, n, 0.1):
|
|
||||||
y = f(i) + choice((-1, 1)) * random() * delta_bruit/2
|
|
||||||
l_pts.append([i, y])
|
|
||||||
l_pts = np.array(l_pts)
|
|
||||||
if args.show:
|
if args.show:
|
||||||
visualiser_nuage(l_pts)
|
visualiser_nuage(l_pts)
|
||||||
elif args.loop:
|
elif args.loop:
|
||||||
animation_nuage(l_pts, args.loop, args.delay, args.noise)
|
animation_nuage(l_pts, args.loop, args.delay, args.noise)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# if len(sys.argv) == 2:
|
|
||||||
# l_pts = acquérir_depuis_fichier(sys.argv[1])
|
|
||||||
# else:
|
|
||||||
# l_pts = []
|
|
||||||
# n = 500 # nombre de points
|
|
||||||
# f = lambda x: x/2 + 3 # fonction génératrice de la ditribution
|
|
||||||
# delta_bruit = 10 # bruit généré, 0 si on en veut aucun
|
|
||||||
# for i in range(n):
|
|
||||||
# y = f(i) + choice((-1, 1)) * random() * delta_bruit/2
|
|
||||||
# l_pts.append([i, y])
|
|
||||||
# l_pts = np.array(l_pts)
|
|
||||||
# # np.savetxt("pts.txt", l_pts, "%f")
|
|
||||||
# u1, u2 = diagonaliser_matrice22(calc_matrice_corrélation(l_pts))[:2]
|
|
||||||
# # print(f"{u1/np.linalg.norm(u1)=}\n{u2/np.linalg.norm(u2)=}")
|
|
||||||
# visualiser_nuage(l_pts)
|
|
||||||
# animation_nuage(l_pts, 20, delta_bruit=100)
|
|
||||||
main(sys.argv[1:])
|
main(sys.argv[1:])
|
||||||
|
Reference in New Issue
Block a user