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

R Discussion :

Calcul d'une matrice des distances


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 118
    Points : 64
    Points
    64
    Par défaut Calcul d'une matrice des distances
    Bonjour,

    Je possède un jeu de données contenant 1000 objets.
    Mon but est d'avoir une matrice des distances entre chaque objet et les (n-1) objets restants.
    Avec ce petit code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cala<-function(data)
    {
              source("C:\\Users\\Hamdi Baccouch\\Documents\\R1\\dist")
         for(i in 1:dim(data)[1])
         {
              pp<-paste("obj",i,sep="")
              m=assign(pp,data[i,],pos=1)
     
              aa=paste("k",i,sep="")
              assign(aa,distcomb(m,data),pos=1)
         }
    }
    Le code ci-dessus me permet d'avoir un tableau des distances entre un objet(x) et les (n-1) autres objets, et ça marche pour tous les objets (je peux savoir le tableau des distances entre cet objet et le reste des objets).

    Maintenant je cherche comment organiser ceci dans une matrice, c'est-à-dire chaque ligne ou chaque colone contient les distances de cet objet par rapport aux (n-1) objets restants (ça va être une matrice symétrique bien sûr).

    Veuillez me posez vos questions si c'est pas clair

    Cordialement B.H

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Alors, tout d'abord plusieurs questions :

    • La fonction "distcomb" est une fonction que vous avez écrite? Sinon, à quel package appartient-elle?
    • Comment la fonction "distcomb" fonctionne-t-elle? Que renvoie distcomb(m,data) (comme écrit dans votre fonction)? Un vecteur?
    • Avez-vous besoin de stocker les éléments de lignes data[,i] dans des objets de la forme "obj1", "obj2", ... pour les réutiliser plus tard ou bien uniquement pour le calcul de distance? Si c'est la deuxième option alors je pense que vous pouvez vous en passer.


    Une idée de départ (pas du tout optimisée et à adapter à votre cas particulier bien sûr !) :

    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
    calcDist<-function(data)
    {
    	N1<-dim(data)[1]
     
    	DISTANCESmat<-matrix(rep(0,N1*N1),ncol=N1)
     
    	for(i in 1:N1)
    	{
    		for(j in 1:N1)
    		{
    			DISTANCESmat[i,j]<-dist(data[i,],data[j,])  # ici dist renvoie un numeric, à adapter avec votre fonction de calcul de distance
    		}
    	}
     
    	return(DISTANCESmat)
    }
    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 118
    Points : 64
    Points
    64
    Par défaut
    merci de votre reponse
    Concernant la fonction distcomb voici son code que je l'ai tapé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     distcomb <- function(x, data) {
            data <- t(data)
            temp <- apply(x, 1, function(x) {
                sqrt(colSums((data - x)^2))
            })
            if (is.null(dim(temp))) 
                matrix(temp, nrow(x), ncol(data))
            else t(temp)
        }
    Elle fonctionne comme suit
    elle permet de calculer la distance entre un objet(x) par rapprt à tous le reste des objets. elle me renvoie un vect contenant les dist calculés.

    J'ai pas besoin des objets "obj1" , obj2 en soient meme mais plutot d'une matrice dont le nbr de lignes et le nbr de colones = dim(data)[1] c-a-d just pour le calcul des distances

    Cordialement B.H

  4. #4
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Ok, merci pour ces précisions.

    Est-ce que quelque chose comme ce qui suit ne fonctionnerait pas? (A adapter bien sûr en fonction de vos données, etc).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    calcDist<-function(data)
    {
    	N1<-dim(data)[1]
     
    	DISTANCESmat<-matrix(rep(0,N1*N1),ncol=N1)
     
    	for(i in 1:N1)
    	{
    		DISTANCESmat[i,]<-distcomb(data[i,],data)
    	}
     
    	return(DISTANCESmat)
    }

    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  5. #5
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 118
    Points : 64
    Points
    64
    Par défaut
    Non ça marche pas
    En fait le premier code que j'ai poster me permet d'avoir un vecteur conetnant les dist de cte obte par rapport aux reste.
    j'ai juste besoin de mettre ce vect et les autres vects ds une matrice.
    j'espere que vous me comprenez

  6. #6
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Pas sûr de bien comprendre (surtout que vous ne prenez même pas la peine de relire votre message : lettres inversées ou manquantes... merci de faire un effort !).
    De la manière dont je vous comprends, mon code correspond à ce que vous souhaitez obtenir

    Cela dit, si vous arrivez à obtenir les vecteurs souhaités et que le seul élément qui vous pose problème est de les stocker dans une matrice, je vous conseille de voir du côté de la fonction "rbind" (ou "cbind" en fonction de ce que vous souhaitez faire).

    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 118
    Points : 64
    Points
    64
    Par défaut
    Ok désolé pour la faute de frappe dans le message précédent .
    Voici ce que j'ai tapé
    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
    cala1<-function(data)
    {
              source("C:\\Users\\Hamdi Baccouch\\Documents\\R1\\dist")
       N1=dim(data)[1]          
       DISTANCESmat<-matrix(rep(0,N1*N1),ncol=N1,byrow=T)   
        for(i in 1:N1)
         {
              pp<-paste("obj",i,sep="")
              m=assign(pp,data[i,],pos=1)
     
              aa=paste("k",i,sep="")
     
    a=rbind( assign(aa,distcomb(m,data),pos=1))
     
     
    }
    return(a)
    }
    il m'affiche just le dernier (voici une partie de l'affichage):
    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
    > source("C:\\Users\\Hamdi Baccouch\\Documents\\R1\\cala1")
    > cala1(t)
            [,1]     [,2]    [,3]     [,4]     [,5]     [,6]     [,7]     [,8]
    1000 5.61751 5.376987 5.59208 5.012677 5.305198 4.858765 4.784949 5.682373
             [,9]    [,10]    [,11]    [,12]    [,13]    [,14]    [,15]    [,16]
    1000 5.284333 4.851201 4.920217 5.532131 5.041857 5.045844 5.951036 4.967814
            [,17]    [,18]    [,19]    [,20]    [,21]    [,22]    [,23]    [,24]
    1000 5.368567 5.611556 5.675649 5.161358 5.114884 5.149869 4.930728 5.235358
            [,25]    [,26]   [,27]    [,28]    [,29]    [,30]    [,31]   [,32]
    1000 4.730006 5.948444 5.54125 5.567454 4.904392 5.395347 5.553414 4.94918
            [,33]    [,34]    [,35]    [,36]    [,37]    [,38]    [,39]    [,40]
    1000 5.205779 5.540958 5.657041 4.930162 5.656151 5.893013 4.905108 5.535248
            [,41]    [,42]    [,43]    [,44]    [,45]    [,46]   [,47]    [,48]
    1000 5.579102 5.028677 4.810858 5.359736 5.278535 4.887176 5.68918 5.101825
            [,49]    [,50]    [,51]    [,52]    [,53]    [,54]    [,55]    [,56]
    1000 5.050056 5.592477 4.496105 5.012131 5.878718 5.307565 4.941601 5.902299
            [,57]    [,58]    [,59]    [,60]    [,61]   [,62]    [,63]    [,64]
    1000 5.129713 4.914285 4.917932 4.897832 5.519875 5.46843 5.463109 5.415851
            [,65]    [,66]    [,67]    [,68]    [,69]    [,70]    [,71]    [,72]
    1000 5.258294 5.256738 5.362313 6.169476 4.824758 4.815946 4.563711 5.401563
            [,73]    [,74]    [,75]    [,76]    [,77]    [,78]    [,79]   [,80]
    1000 5.253849 5.415103 5.064542 4.828467 5.410084 5.303809 4.832949 5.47067
            [,81]    [,82]    [,83]    [,84]    [,85]    [,86]    [,87]    [,88]
    1000 5.402223 5.038174 5.307726 4.757692 5.499167 4.466042 5.243961 5.417085
            [,89]    [,90]    [,91]   [,92]    [,93]    [,94]    [,95]    [,96]
    1000 5.280544 5.412542 5.377981 5.14612 5.117337 5.617255 5.179404 4.773886
            [,97]    [,98]    [,99]   [,100]   [,101]  [,102]   [,103]   [,104]
    1000 5.816072 4.851347 5.677417 5.496638 5.528405 5.42668 4.623304 5.262621
    Mais j'ai besoin de toute la matrice

  8. #8
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    [Juste pour info au cas où, vous disposez d'un bouton "éditer" en bas à droite de vos messages qui vous permet de corriger ce genre de fautes.]

    Sinon, ceci devrait fonctionner correctement (même si au final le passage par des "assign" and co complique les choses pour rien à mon avis...) :

    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
    cala1<-function(data)
    {
       source("C:\\Users\\Hamdi Baccouch\\Documents\\R1\\dist")
       N1=dim(data)[1]          
       
       a=NULL
    
        for(i in 1:N1)
         {
              pp<-paste("obj",i,sep="")
              m=assign(pp,data[i,],pos=1)
              
              aa=paste("k",i,sep="")
       
               a=rbind( a , assign(aa,distcomb(m,data),pos=1))
         
    
    }
    return(a)
    }
    Prenez bien le temps de lire l'aide des fonctions et de faire quelques tests, cela vous évitera ce genre d'erreur.

    Bonne continuation


    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  9. #9
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 118
    Points : 64
    Points
    64
    Par défaut
    Encore une fois merci
    ça marche bien

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

Discussions similaires

  1. Calcul d'une matrice de Variance Covariance
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/05/2010, 17h22
  2. Calculs sur une matrice
    Par tarek30 dans le forum JBuilder
    Réponses: 2
    Dernier message: 22/04/2009, 13h21
  3. [E-07] aide pour une matrice des distances
    Par pheron dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/11/2008, 22h24
  4. Calcul d'une matrice dans une boucle for
    Par david_Montreal dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/07/2007, 17h17
  5. Extraction de valeurs - matrice des distances
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 06/04/2007, 17h14

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