K-moyennes vs. les Sup
1. Fonctions auxiliaires
1.1. Chargement des données.
:UNNUMBERED: t
def chargement(chemin) : fichier = open(chemin,'r') notes = {} lignes = fichier.readlines() for li in lignes : l_li = li.split(',') ident = int(l_li[0]) notes[ident] = [ float(l_li[i]) for i in range(1,len(l_li)) ] fichier.close() return notes
1.2. Tirage aléatoire
:UNNUMBERED: t
import random as rd def init_centroide(notes, k) : l = [] for i in notes.keys() : l.append(notes[i]) return rd.sample(l,k)
1.3. Distances
:UNNUMBERED: t
def distance(v1,v2) : somme = 0 for i in range(len(v1)) : somme += (v1[i] - v2[i]) ** 2 return somme ** 0.5
1.4. Barycentre
:UNNUMBERED: t
def moyenne(notes, cat) : n = len(notes[cat[0]]) # dimension de l'espace moyenne = [ 0.0 ] * n for ident in cat : v = notes[ident] for i in range(n) : moyenne[i] += v[i] for i in range(n) : moyenne[i] = moyenne[i] / len(cat) return moyenne
2. k-moyenne
2.1. Plus proche
:UNNUMBERED: t
def mind(p,moy) : i_min = -1 d_min = float("inf") for i in range(len(moy)) : d = distance(moy[i],p) if d < d_min : d_min = d i_min = i return i_min
2.2. Catégories
:UNNUMBERED: t
def cat(notes, moy) : cat = [ [] for i in range(len(moy)) ] for ident in notes.keys() : v = notes[ident] icat = mind(v, moy) cat[icat].append(ident) return cat
2.3. Actualisation
:UNNUMBERED: t
def actu(notes, cat) : moy = [] for c in cat : moy.append(moyenne(notes, c)) return moy
2.4. Algorithme
:UNNUMBERED: t
def kmoyennes(notes,k) : moy = init_centroide(notes,k) old_moy = [ None ] * k while old_moy != moy : categories = cat(notes, moy) old_moy = moy moy = actu(notes,categories) return moy, categories