Bonjour, auriez-vous une idée de programme python pour la question suivante d'un TP de mathématiques ?
On suppose que les données d'apprentissage de la machine sont classifiées en deux catégories.
On veut placer dans l'une ou l'autre de ces deux catégories une donnée nouvelle. Pour cela, on calcule sa
distance à chacune des données déjà étiquetées et on lui attribue la catégorie de son plus proche voisin.
Exercice : Dépistage automatique d'une tumeur maligne
On se propose de répartir en deux catégories (Maligne, Bénigne) des tumeurs du sein dont on connaît un
certain nombre de caractéristiques. Dans la réalité, un tel diagnostic automatique est effectué à partir de données
d'apprentissage portant sur une cinquantaine de caractéristiques mesurées sur un échantillon d'un millier de
tumeurs déjà étiquetées « Maligne » ou « Bénigne ». Dans un souci de simplification, on se restreint ici à 2
caractéristiques (diamètre et concavité) mesurées sur un panel de 10 patientes.
Données d'apprentissage :
Diametre | Concavite | Categorie |
13.2 | 8.3 | Benigne |
18.7 | 19.7 | Benigne |
8.2 | 15.9 | Maligne |
13.2 | 9 | Benigne |
13.5 | 4.8 | Maligne |
11.8 | 1.7 | Maligne |
13.6 | 1.9 | Maligne |
12 | 2 | Maligne |
18.2 | 17.7 | Benigne |
12 | 6.6 | Maligne |
On considère une nouvelle tumeur de diamètre et de concavité connues et on cherche à savoir si elle est
maligne (M) ou bénigne (B).
On va utiliser la méthode dite « du plus proche voisin » :
On place dans un repère les 10 points correspondant aux 10 données connues (en abscisse le diamètre,
en ordonnée la concavité), en distinguant les tumeurs malignes (triangles rouges) et les tumeurs bénignes
(losanges bleus).
On place ensuite la nouvelle donnée (représentée par un point vert) et on lui attribue la catégorie (M ou B) de son
plus proche voisin.
1)Ecrire une fonction distance qui calcule la distance entre le nouveau point et les 10 autres points et qui
range les valeurs dans une liste dans l'ordre croissant.
Fait : from math import sqrt
from matplotlib import pyplot as pl
def distance(x,y):
x_b=[13.2,18.7,13.2,18.2,8.2,13.5,11.8,13.6,12,12]
y_b=[8.3,19.7,9,17.7,15.9,4.8,1.7,1.9,2,6.6]
x=x
y=y
L=[]
for k in range(0,10):
a=sqrt((x-x_b[k])**2+(y-y_b[k])**2)
L.append(a)
pl.plot(x_b, y_b,'o',color='b')
pl.plot(x, y,'o',color='g')
pl.show
return(sorted(L))
on considère les 5 points les plus proches du nouveau point et on lui attribue
la catégorie (M ou B) la plus représentée. C'est la méthode des « k » plus proches voisins (avec k=5 ici).
a) Pourquoi préfèrera-t-on choisir un nombre impair de voisins ? --> Fait
b) Ecrire une fonction distance5 qui calcule la distance entre le nouveau point et les 5 points les plus proches de celui-ci et qui trace le graphique avec le nouveau point en bleu si on lui attribue la catégorie B, en rouge sinon. --> C'est cette question qui me pose problème.