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

Requêtes MySQL Discussion :

Point d'intérêt :Recherche des plus proches voisins


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 14
    Points : 1
    Points
    1
    Par défaut Point d'intérêt :Recherche des plus proches voisins
    Bonjour,

    Je sais que la communauté MySQL est pas mal développée et je souhaiterai avoir votre aide concernant un problème qui peut être résolu sur n'importe quel type de BDD :

    Je souhaiterai trouver, pour un point donné de la table courante, son plus proche voisin dans la table de référence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE table_courante(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT)
     
    CREATE TABLE table_ref(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT).
    Pour cela je recherche le plus proche voisin en terme de distance euclidienne
    (x-y)² * (x-y)². Dans cet exemple, le vecteur est à 2 dimensions (x et y) mais dans ma vraie table il s'agit d'un vecteur à 64 dimensions (c'est un point d'intérêt avec 64 descripteurs
    ex :table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) + (table_ref.desc_1 - table_courante.desc_1) + etc... )

    j'aimerais que ma requête retourne l'id du point de l'image courant et l'id du point de l'image de référence pour laquelle la distance est la plus petite, et ceux pour l'ensemble de mes points courants.

    Actuellement je suis capable de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select table_courante.id_point,table_ref.id_point ,((table_ref.x-table_courante.x)*(table_ref.x-table_courante.x) + (table_ref.y-table_courante.y)*(table_ref.y-table_courante.y)) AS distance FROM table_ref, table_courante WHERE table_courante.id_point=XXX ORDER BY distance LIMIT 1
    et je fais une boucle ou XXX prend toutes les valeurs de mon id du point courant (0, 1, 2 ...N)
    Mais cette requête prend 3 secondes pour comparer 2 images.. or j'ai 25 images à la sec.. et je dois être capable de faire du temps réel..
    Je souhaiterais donc trouver un moyen de ne pas faire de boucle, et /ou trouver une requête complètement différente ou là requête prendrai quelques dizaines de ms maximum. A terme la table de ref contiendra des milliers de points..

    ATTENTION : ce n'est pas parce que l'id du point de l'image courante = l'id du point de ref qu'il s'agit du même point. Cela n'a rien à voir, ils sont chacun sur 2 images différentes
    J'espère que j'ai été clair

    Merci d'avance pour votre aide
    PS : je débute, Be nice
    PPS :

    J'ai déjà essayé les requete du type fonctions de fenêtrage rank() OVER PARTITION BY ... ça prend 9000 ms ..

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE table_courante(id_point serial
    J'ai déjà essayé les requete du type fonctions de fenêtrage rank() OVER PARTITION BY ... ça prend 9000 ms ..
    Tu es sûr que tu travailles avec MySQL ?
    Il ne connaît pas serial mais auto_increment et pas du tout les fonctions de fenêtrage !

    (x-y)² * (x-y)²
    Il doit y avoir une erreur dans ta formule car ça fait (x-y)^4 !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 911
    Points : 51 674
    Points
    51 674
    Billets dans le blog
    6
    Par défaut
    Il serait plus simple de faire cela avec des objets géométriques et d'utiliser la fonction ST_Distance en agrégeant sur le MIN.
    Avec un index sur la colonne géo.

    Sauf que MySQL est très bugué sur la partie SIG... A me lire : http://blog.developpez.com/sqlpro/p9...x-yeux/#c42694

    A +

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Il doit y avoir une erreur dans ta formule car ça fait (x-y)^4 !
    Oui oui il y a juste une petite erreur quand je l'ai écris mais pas dans le code..

    Tu es sûr que tu travailles avec MySQL ?
    Il ne connaît pas serial mais auto_increment et pas du tout les fonctions de fenêtrage !
    Comme je le disais, je sais que la communauté MySQL est pas mal développée, mais non, me concernant je bosse sur postgre.

    Je souhaitais plus un exemple que j'aurais implémenter ensuite à la sauce postgre

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    je bosse sur postgre
    Et donc, pour reprendre les remarques de SQLPro, Postgresql a, lui par contre, un très bon outil pour les données géographiques.

    Adressez-vous donc au forum Postgresql.

Discussions similaires

  1. Algorithme KD-Tree de recherche du plus proche voisin .
    Par mobi_bil dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 11/05/2014, 11h54
  2. Tracking Recherche du plus proche voisin
    Par themadmax dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 18/12/2013, 10h43
  3. [Débutant] Remplacement de NaN par la moyenne des plus proches voisins
    Par mylia04 dans le forum MATLAB
    Réponses: 4
    Dernier message: 30/07/2013, 11h08
  4. Point d'intérêt : recherche du plus proche voisin
    Par Yannok dans le forum Requêtes
    Réponses: 26
    Dernier message: 14/07/2012, 09h24
  5. Recherche des plus proches voisins dans un espace variable à K dimensions parmis N
    Par JeromeBcx dans le forum Algorithmes et structures de données
    Réponses: 34
    Dernier message: 26/06/2008, 17h46

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