k plus proches voisins
import matplotlib.pyplot as plt
import csv
from math import sqrt
from random import *
def affichage_iris(tab:list):
'''
ne rien toucher à cette fonction
'''
x0,x1,x2=[],[],[]
y0,y1,y2=[],[],[]
esp=[]
for i in range (1,len(tab)):
if tab[i][2]==0:
x0.append(tab[i][0])
y0.append(tab[i][1])
if tab[i][2]==1:
x1.append(tab[i][0])
y1.append(tab[i][1])
if tab[i][2]==2:
x2.append(tab[i][0])
y2.append(tab[i][1])
plt.axis('equal')
plt.scatter(x0, y0, color='r', label='iris setosa')
plt.scatter(x1, y1, color='g', label='iris versicolor')
plt.scatter(x2, y2, color='b', label='iris virginica')
plt.legend()
axes = plt.gca()
axes.set_xlabel('longueur des pétales')
axes.set_ylabel('largeur des pétales')
axes.legend()
plt.show()
def recup_donnees(nomDeFichier)->list:
'''
à partir du nom de fichier, cette fonction récupère les données et les renvoie sous forme de tableau de tableaux
ne rien toucher à cette fonction
'''
iris=[]
with open(nomDeFichier,'r',encoding='utf-8') as f:
lecteur=csv.reader(f,delimiter=',')
for row in lecteur:
iris.append(row)
for i in range (1,len(iris)):
for j in range(2):
iris[i][j]=float(iris[i][j])
iris[i][2]=int(iris[i][j])
return iris
def mini_iris(tab:list):
'''
recherche le minimu et enlève l'élément du tableau de tableaux
renvoie le minimum et le tableau de tableaux modifié
'''
min=100000
indicemin=0
for i in range (len(tab)):
if tab[i][3] < min:
min=tab[i][3]
indicemin=i
min=tab.pop(indicemin)
return min,tab
def distance(x1:float,y1:float,x2:float,y2:float)->float:
'''
calcule la "distance" entre deux iris
'''
return sqrt((x2-x1)**2+(y2-y1)**2)
def kppv_iris(iris:list, larg:float,haut:float,nbvoisins:int)-> list:
'''
recherche des nbvoisins les plus proches pour déterminer l'espèce de l'iris donc les pétales mesurent larg x haut.
Une fois l'espèce déterminée, le nouvel iris est ajouté au tableau iris qui est renvoyé modifié en fin de fonction.
'''
#copie du tableau de tableaux iris dans le tableau de tableaux iris_kppv
iris_kppv=[[iris[i][j] for j in range(3)]for i in range(1,len(iris))]
#calcul des distances à toutes les autres fleurs et stockage dans le tableau de tableaux iris_kppv
for i in range (0,len(iris_kppv)):
iris_kppv[i].append(distance(larg,haut,iris_kppv[i][0],iris_kppv[i][1]))
#recherche des k voisins les plus proches
voisins=[]
for i in range (nbvoisins):
voisin_proche,iris_kppv=mini_iris(iris_kppv)
voisins.append(voisin_proche)
#recherche de l'espèce majoritaire des k voisins
#le tableau espece va contenir l'effectif de chaque espèce : espece[0]->setosa ; espece[1]->versicolor ; espece[2]->virginica
espece=[0,0,0]
#on parcourt le tableau de tableaux contenant les proches voisins
for i in range (len(voisins)):
if voisins[i][2]==0:
espece[0]+=1
if voisins[i][2]==1:
espece[1]+=1
if voisins[i][2]==2:
espece[2]+=1
#ajout de l'iris inconnu au tableaua de taableaux "iris"
iris.append([larg,haut,espece.index(max(espece))])
return iris
#####################################################
#récupération des données
fleurs=recup_donnees('iris.csv')
#application de l'algorithme des k plus proches voisins
#fleurs=kppv_iris(fleurs,5.5,1.95,5)
test=[[randint(100,700)/100,randint(0,300)/100] for i in range (1000)]
shuffle(test)
for i in range (1000):
fleurs=kppv_iris(fleurs,test[i][0],test[i][1],5)
#affichage des données
affichage_iris(fleurs)