IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

code k-means correct ?


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut code k-means correct ?
    Salut!
    ceci est mon premier post je commence par cette question :
    Est ce code matlab pour k-means est correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function label = MyKMeans(X, k)
    n = size(X,2);
    last = 0;
    label = ceil(k*rand(1,n));  % Initialisation aléatoire %
    while any(label ~= last)
        E = sparse(1:n,label,1,n,k,n);  
        m = X*(E*spdiags(1./sum(E,1)',0,k,k));    % Claculer m de chaque classe
        last = label;
        [w,label] = max(bsxfun(@minus,m'*X,dot(m,m,1)'/2),[],1); % Affecter les individus au plus proche centre de gravite
    end
    Merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Ce serait plus facile pour nous si tu nous donnais les formules implémentées ! En attendant, tu peux comparer tes résultats à ceux de la fonction matlab kmeans

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    les formules implémentées ????

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    En fait il manquait juste un commentaire précisant E(i,j)= 1 <=> Xi \in Cj.

    Je ne comprends pas ton calcul de "% Affecter les individus au plus proche centre de gravite". Pourquoi ne pas simplement passer en 3D arrays ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    X= rand(5,3,1); % 5 obs en dimensions 3
    m= rand(1,3,2)  % 2 centroides
     
    min( squeeze(sum(bsxfun(@minus,X,m).^2 ,2) ,[],2)
    je trouve ça plus lisible (min!), mais j'ai peut etre raté un truc dans ton calcul (pourquoi un max?)

  5. #5
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Bonjour,
    étant donné que cette fonction est tirée du MATLAB File Exchange :
    http://www.mathworks.com/matlabcentr...s/litekmeans.m
    Il est préférable (c'est un euphémisme) de citer ses sources.
    Si tu as un doute sur la fonction, tu peux contacter son auteur :
    Michael Chen (sth4nth chez gmail point com).
    Ou comme le propose VV33D tu peux comparer les résultats avec d'autres algorithmes kmeans.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    J'ai un probleme de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in ==> MyKMeans at 2
    n = size(X,2);

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    C'est une erreur d'éxécution.
    Quel est le message d'erreur ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le message d'erreur complet serait mieux.
    Est-ce l'erreur
    Undefined function or variable 'X'
    ?

    Si oui, pense à appeler ta fonction en lui passant ses deux arguments X et k comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X = ...
    k = ...
    label = MyKMeans(X, k);
    plus de détails sur l'utilisation des fonctions en tapant doc function.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    ça marche.
    mais il me donne un vecteur! ca represente quoi ???
    Une derniere question :
    comment faire un graphe des individu finaux dans leur classe et chaque classe d'une couleur differente ??

  10. #10
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    J'imagine un vecteur classes [N,1], ou N est le nombre d'observations, qui te donne la classe de chaque observation.

    Pour le dessin, si tes observations sont en 2D, un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cmp= hsv(length(unique(classes)))
    figure;hold on;
    for k= unique(classes)
        plot(X(classes==k,1),X(classes==k,2),'color',cmp(k,:));
    end

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    j'ai changé "classes" avec "label" le vecteur obtenu par la fonction precedente
    quand je compile votre fonction je trouve cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cmp =
     
        1.0000         0         0
        0.5000    1.0000         0
             0    1.0000    1.0000
        0.5000         0    1.0000
     
    ??? Index exceeds matrix dimensions.

  12. #12
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    - si unique(classes) est un vecteur colonne, il faut le transposer.
    - si les observations sont en colonne plutôt qu'en ligne, il faut inverser les 2 indices dans X
    - si la numérotation des classes commence a 0, il faut cmp(k+1,: )

    Que donnent size(X), size(label) et min(label) ?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Désolé mais j'ai pas compris ce que je doit faire ??
    Que donnent size(X), size(label) et min(label) ?
    size(x) donne la taille de matrice X: (n,m)
    size (label) donne la longueur du vecteur label : n
    min (label) donne la valeur minimale du vecteur label

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    cet algorithme donne une classification pour les variables, moi je veux une classification pour les individus

  15. #15
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    cet algorithme donne une classification pour les variables, moi je veux une classification pour les individus
    -> il suffit de transposer ta matrice de données

    Desolé mais j'ai pas compris ce que je doit faire ??
    Je voulais les valeurs numériques pour corriger l'erreur dans le code qui fait le graphique

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    peut etre que je ne me suis pas bien expliquee :
    je veux obtenir un plot comme ceci :

  17. #17
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    C'est exactement ce que fait mon code, une fois réglés les problèmes de dimension, et après avoir enlever les lignes et mis des marqueurs

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    J'ai changer "X" en "data" car mes donnes s'appellent "Data"
    j'ai trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cmp =
     
        1.0000         0         0
        0.5000    1.0000         0
             0    1.0000    1.0000
        0.5000         0    1.0000


    comment faire pour avoir des points au lieux des lignes ??
    Elle sert a quoi cmp ???

  19. #19
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    cmp est une colormap qui définit les couleurs successives

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    plot(X(classes==k,1),X(classes==k,2),'color',cmp(k,:),'linestyle','none','marker','.');

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    OK!
    maintenant je trouve ça :

    1)- Comment faire la legende de chaque classe ??
    2)- Le resultat ne se montre pas logique !!!!!! les classes doivent etre separees, n'est ce pas ?
    3)- Dans votre code "classes" c'est quoi ??
    4)- les 2 axes représentent quoi ??
    5)- moi je travaille sur des données de 50 variables et 120 individus, est il possible de faire un plot des individus dans leur classes ?

    Plus important, ce code est il correct ? est ce une classification kmeans ou bien une classification binaire ?

Discussions similaires

  1. [Python 3.X] [Vérification] Ce code est-il correct et efficace ?
    Par Ennicolem dans le forum Django
    Réponses: 0
    Dernier message: 11/01/2015, 21h02
  2. [WD16] Code SQL requête correct ?
    Par WDKyle dans le forum WinDev
    Réponses: 6
    Dernier message: 29/11/2013, 21h19
  3. Ce code est-il correct ?
    Par cirdan_elf dans le forum C
    Réponses: 2
    Dernier message: 02/12/2009, 14h28
  4. Réponses: 5
    Dernier message: 10/11/2007, 10h20
  5. utilisation de tableaux : code correct ?
    Par kuzloka dans le forum C++
    Réponses: 5
    Dernier message: 25/12/2005, 20h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo