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 :

détection d'outliers avec mahal [Débutant]


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut détection d'outliers avec mahal
    Bonjour,

    Je cherche à détecter des outliers dans un diagramme Température-Salinité qui contient plusieurs profils verticaux, ce pour différentes couches de profondeur.

    J'ai une matrice qui contient autant de ligne que de données, avec en colonnes profondeur, température, salinité, densité,... et qui s'appelle tout.

    La méthode la plus appropriées pour détecter des outliers bivariés semble être mahal, mais je n'arrive pas à trouver les outliers à partir de la mahalabonis distance.
    Pour le moment mon code ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    d = [0 25 50 75 100];          % profondeurs
    for k = 1:length(d)-1
    ind = [];
    ind = find(floor(tout(:,1)) >= d(k) & ceil(tout(:,1)) < d(k+1));     % trouver la couche
     
    d1 = mahal(tout(ind,3),tout(ind,2));  % calcul de la fameuse distance
    ind2 = find(d1 > ??)                        % c'est là le problème
     
    figure
    plot(tout(ind,3),tout(ind,2),'k.')         % tracé de mon diagramme TS
    hold on
    plot(tout(ind(ind2),3),tout(ind(ind2),2),'r.')   % tracé des outliers
    end
    Le problème étant que selon mes couches de profondeur je n'ai pas les mêmes valeurs de d1, et que je ne comprends pas pourquoi je peux avoir entre 16 et 20 ou alors des valeurs en 10^4... et donc je ne sais pas comment ne colorer en rouge que les 5% de données les pus éloignées...

    Si quelqu'un maitrise mahal, je suis preneuse (je pense que je n'ai pas tout compris de l'aide dessus) !!

    Merci d'avance

    Kokiett

  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,

    2 approches possibles:
    - si tu fais des hypothèse sur la loi de tes données, tu peux calculer les seuils théoriques, soit dans la littérature (typiquement sous hypothèse de normalité), soit en tabulant le seuil à la main via Monte Carlo.
    - Sans hypothèse, tu peux par exemple éliminer les 5% de distances trop fortes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    seuil= quantile(d1,0.95);
    ind2 = find(d1 > seuil);
    Après si tes différents échantillons (couches) n'ont pas la même loi, il faut surement prendre un seuil différent par couche.

    Dans l'absolu, la notion d'outlier peut être définie pour toute distance, pas forcément Mahalonobis.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci pour cette réponse, mais ça ne donne toujours pas ce que j'espère.
    J'ai modifié mon code pour utiliser un seuil en particulier sur une couche à mes outliers sont visibles (enfin les points que je veux déterminer comme 'bon' ou 'faux', c'est à dire ceux qui sont à l'écart de la diagonale de la première figure).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     k=20;  % couche 900-100m
    ind = [];
    ind = find(floor(tout(:,1)) >= d(k) & ceil(tout(:,1)) < d(k+1));    
    T = tout(ind,2);
    S = tout(ind,3);           
    Tmean = meanT);      % Moyenne et déviation std 
    Tdev = std(T);
    Smean = mean(S);
    Sdev = std(S);
     
    tt = (T-Tmean)./Tdev;   % pour centrer les données
    ss = (S-Smean)./Sdev;
     
    d1 = mahal(tt,ss);
    d2 = mahal(ss,tt);
     
    ind1 = find(d1 > 5.99);    % mon prof dit que 5.99 c'est le bon seuil
    ind2 = find(d2 > 5.99);
     
    figure
    plot(S,T,'k.')
    hold on
    plot(S(ind1),T(ind1),'r')
    title('mahal(tt,ss)')
     
    figure
    plot(S,T,'k.')
    hold on
    plot(S(ind2),T(ind2),'g')
    title('mahal(ss,tt)')
    Mais donc comme on le voit sur les deux autres figures, les points trouvés par ce code sont soit trop écartés en salinité (vert), soit en température (rouge). Pour moi ça veut dire que mahal considère les données T et S comme indépendantes. Alors que ce qui m'intéresse c'est de trouver les points TS qui sortent de cette diagonale (donc avec T et S dépendantes!).

    Du coup mon besoin évolue un peu: mahal permet-elle de faire une analyse bi-variée? Existe-t-il autre chose pour étudier des variables dépendantes?

    Sur le tuto j'avais l'impression que mahal pouvait faire ça (l'image correspondait à ma situation précise), mais le code rajoutait des points à la distribution 'bonne' et mahal permettait de colorer les points extérieurs en rouge et ceux compris dans la distribution en bleu. Mais moi les points 'faux' sont déjà dans la distribution!!! Je suis perdue....

    Si il y en a qui comprennent le problème, je suis toute ouïe!
    Images attachées Images attaché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
    Si, normalement, Mahalonobis se place dans la base de diago de l’échantillon de référence, donc traite les dépendances LINEAIRES.

    J'ai un doute sur la manière dont tu l'as calculé. Qu'y a t-'il dans la matrice tout ? Peux tu donner les dimensions des matrices tout(ind,3) et tout(ind,2).

    Dans ton cas, mahal doit recevoir deux échantillons à deux colonnes, du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mahal(tout(ind,:),tout(ind,:))

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Alors en détail ma matrice tout contient pour chaque donnée relevée dans la zone 8 colonnes: pression, température, salinité, densité, n° de la bouée, N° du profil, longitude, latitude

    Je sélectionne la profondeur avec la pression (là j'ai pris la couche 900-1000m avec mon ind)
    et j'ai renommé T et S mes morceaux de tout qui correspondent. Je suis assez claire (moi je me comprends mais je suis pas sure!!)
    Dans mon cas précis j'ai donc des vecteurs colonnes de 4265 lignes.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci c'est bon!!

    La réponse: il faut récréer une matrice qui contient les 2 données qu'on veut comparer....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    X(:,1) = S;
    X(:,2) = T;
     
    d = mahal(X,X);
    ind1 = find(d > 5.99);    
     
    figure
    plot(S,T,'k.')
    hold on
    plot(S(ind1),T(ind1),'r.')
    Avec la preuve en image!
    Je vais partir en WE le sourire aux lèvres!!
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de doublons avec SSIS
    Par nacimoun dans le forum SSIS
    Réponses: 2
    Dernier message: 28/09/2009, 17h19
  2. Détection de fichier avec un nom aléatoire
    Par ealphonsine dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 13/11/2008, 19h36
  3. détection de collision avec getpixel ?
    Par megaben dans le forum VB.NET
    Réponses: 9
    Dernier message: 30/09/2007, 20h54
  4. détection JVM installé avec script php/javascript
    Par <DYDY> dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2006, 14h42

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