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

Langage SQL Discussion :

Sélection de données selon une probabilité


Sujet :

Langage SQL

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 831
    Points
    831
    Par défaut Sélection de données selon une probabilité
    Bonjour,
    Je suis sur un projet de génération de données fictives.
    J'ai donc des tables de références dans lesquelles je peux ajouter le nombre d'occurrences (count(*)) des valeurs dans la base à imiter.
    Quelle serait la meilleure façon de sélectionner des valeurs dans cette table en respectant les probabilités d'apparition.

    A ce stade, j'utilise cette méthode (en gros) :
    J'ai défini une table PROBA dans laquelle j'ai une colonne val qui prend les valeurs de 0 à 99
    Dans ma table de référence, je normalise les "count" des valeurs pour les ramener entre 0 et 100
    Et je les sélectionne via une requête comme celle ci (je suis sur sqlite)

    SELECT * FROM tablename INNER JOIN (select * from PROBA ORDER BY RANDOM() limit 1) p ON tablename.weightcol > p.val ORDER BY RANDOM() LIMIT 1;

    Ca marche bien mais le problème, c'est que les count ne sont pas du tout répartis de façon linéaire
    Par exemple, si j'ai une valeur A avec un count normalisé à 100 et 100 valeurs B, C.... chacune avec un count normalisé à 1, je devrais avoir 50% de chances d'avoir A et 50% de chance d'avoir l'une des autres valeurs (soit 0,5% pour chaque) or en utilisant la requête mentionnée, je vais me retrouver avec A dans un chouille plus de 99% des cas et l'une des autres valeurs dans un chouille moins de 1% (soit 0.01% pour chaque valeur)

    J'ai pas réussi à trouver de technique plus pertinente pour sélectionner mes valeurs. Quelqu'un ici aurait-il une idée ?
    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 872
    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 872
    Points : 53 034
    Points
    53 034
    Billets dans le blog
    6
    Par défaut
    Dans un tel cas on estime le nombre de ligne à l'aide des probabilités et l'on constitue des "tranches" numérotées pour ensuite générer un tirage aléatoire sur le nombre...

    Un exemple :
    valeur A : 10%
    valeur B : 33%
    valeur C : 57 %

    La table de tirage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE T_TIRAGE_TRG
    (TRG_ID         INT IDENTITY PRIMARY KEY,
     TRG_VALEUR     VARCHAR(32) NOT NULL,
     TRG_BAS        INT,
     TRG_HAUT       INT);
     
    CREATE INDEX X_TRG_BAS_HAUT_VAL 
       ON T_TIRAGE_TRG (TRG_BAS, TRG_HAUT, TRG_VALEUR);
    Les valeurs de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO T_TIRAGE_TRG VALUES 
    ('A', 0, 10),
    ('B', 10, 43),
    ('C', 43, 100);
    La requête pour tirer au sort une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH 
    T AS (SELECT 100 * RAND() AS N)
    SELECT TRG_VALEUR, 100 * RAND()
    FROM   T_TIRAGE_TRG
           JOIN T ON N BETWEEN TRG_BAS AND TRG_HAUT;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 831
    Points
    831
    Par défaut
    Bonjour,
    Merci pour cette réponse, cela donne effectivement une bonne solution.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/08/2022, 13h58
  2. Réponses: 0
    Dernier message: 19/02/2022, 18h06
  3. Choix aléatoire selon une loi de probabilité donnée
    Par Lupa99 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 30/05/2018, 14h02
  4. Réponses: 5
    Dernier message: 23/02/2005, 09h43
  5. Réponses: 9
    Dernier message: 14/09/2004, 20h10

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