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