Clustering de données par OPTICS : utiliser phpOptics

a marqué ce sujet comme résolu.

Bonjour,

Je possède ces données : pour une même photo, le vote de chaque utilisateur du système ("Luminosité de la photo : Très bonne, Bonne, Plus ou moins bonne, Mauvaise" ; "Angle de la photo : Très bon, Bon, […]" , […]").

Je souhaite : utiliser OPTICS pour calculer le fait que, sur une même photo, le vote du voteur soit isolé des clusters constitués des votes des autres utilisateurs pour cette même photo. Cela entrera dans le calcul de l’indice de confiance du voteur pour cette même photo.

Je vais donc utiliser le package https://github.com/supplyhog/phpOptics . D’après la doc, il suffit en gros de fournir les points à clusteriser, puis de clusteriser avec run().

Je ne comprends cependant pas deux choses :

  1. Comment demander au package : "Ce nouveau point, que je te donne uniquement maintenant, après avoir lancé le run, est-il isolé de tous les clusters, ou bien appartient-il à au moins un cluster ?". En effet, aucune méthode d’aucune classe ne semble avoir été définie en ce sens.
  2. Il semblerait que la seule méthode permettant de récupérer les clusters, et éventuellement donc de répondre à ma précédente question (bien que le test d’appartenance à au moins un cluster n’ait semble-t-il pas été implementé), soit OpticsCluster::extractDBSCANClusters. Or, DBSCAN est légèrement différente de OPTICS, qui étend un petit peu les possibilités offertes par DBSCAN (lire https://fr.wikipedia.org/wiki/OPTICS).

Ayant des connaissances (extrêmement) limitées en statistiques, clustering et n’ayant jamais utilisé ce package PHP, je souhaiterais savoir si quelqu’un parmi vous, par le plus grand des heureux hasards, serait à-même de m’aider à répondre à ces deux questions, s’il vous plaît ? J’ai peu d’espoir car ce serait "un sacré coup de bol" comme on dit, mais je croise les doigts. Sinon, je vais être bloqué pendant des mois. Ou alors je pourrais demander sur d’autres sites aussi, à voir.

Je vous en remercie BEAUCOUP :bounce: :bounce:

Bonne journée, bon long-week-end à tous !

à+

Cela entrera dans le calcul de l’indice de confiance du voteur pour cette même photo.

Et comment ? Plus le voteur est proche d’un cluster, plus il est fiable. Ou bien l’inverse ?

elegance

C’est ça .

Hors cluster = non fiable, ou bien début d’un nouveau cluster donc ultérieurement fiable.

Cependant on parle du vote, pas du voteur.

L’indice de confiance est basé sur ce calcul de distance clustering, mais aussi sur le temps passé à regarder la photo, si un commentaire (saisie libre) est écrit voire s’il est long, etc.

+0 -0
  1. Je doute que ton système de notation soit adapté pour avoir des clusters. Si pour chaque question, tu demandes un nombre entre 0 et 100, ou entre 0 et 20 à la limite, tu as des variables 'continues’, et avec une dizaine de questions ou plus, tu vas éventuellement avoir des clusters. Mais ici, tu parles de notes discrètes (un nombre entre 1 et 4), donc ça s’engage assez mal, et tu ne parles pas du nombre de questions, mais j’imagine 5 ou 6 questions maximum (ce critère me paraît moins important que le nombre d’occurrences pour chaque question).

  2. Hors cluster = non fiable : bof.

  3. Hors cluster = début d’un nouveau cluster : bof. Les techniques de clusterisation sont sensibles. A partir de 50 points, si on ajoute 3 ou 4 points, il se peut que les clusters obtenus bougent de façon significative. Des points qui étaient hors clusters deviennent centres-de-clusters, et inversement.

Avant de chercher à 'positionner' les points nouveaux par rapport aux clusters , je t’invite à :

  1. Vérifier si les clusters obtenus font sens.

  2. Vérifier si les clusters obtenus sont stables quand on ajoute quelques points.

Bonjour @elegance,

Merci pour ta réponse.


Edit important : il faut bien avoir en tête qu’il peut y avoir plusieurs tendances de vote pour une même photo (une tendance disant "cette photo est très lumineuse et très contrastée", une autre "cette photo est moyennement lumineuse et moyennement constratée"). Ainsi, il faut bien prendre en compte ces tendances (= ces "clusters"). Et pour dire que tel ou tel vote est "anormal" (= fait à la va vite ou bien fait volontairement pour fausser le système), il faut donc bien qu’il soit à l’écart de toute tendance. (bien sûr, l’indice de confiance utilise ça mais pas que ça, je vérifie d’autres paramètres, cf. mes messages précédents et même la suite de ce message).


Tu veux dire que la probabilité que les réponses se ressemblent est assez élevée puisque le nombre de choix possibles par question, et le nombre de questions, sont tous deux peu élevés. Et donc qu’il y aura peu de chances d’obtenir des clusters.

Je ne suis pas forcément d’accord. En tenant compte de la subjectivité, il me semble possible, pour une photo donnée, d’avoir beaucoup d’avis la trouvant très lumineuse voire au pire moyennement lumineuse ainsi que très contrastée voire au pire moyennement contrastée. Nous obtenons donc deux clusters. Toute réponse disant que la photo est terne et pas du tout contrastée sera alors considérée comme "à la marge", donc ce sera un vote non pertinent.

Au bout d’un certain nombre de votes et jusqu’à l’infini, on aura toujours en très grande majorité des votes lumineuse+contrastée, et toujours en très faible minorité des votes ternes+non-contrastée.

Je suis cependant un peu d’accord sur l’interrogation que tu as eue, et que j’ai eue également au début et que tu as décrite dans ton point. Mais vraiment, je ne pense pas que ce soit un problème concrètement. A tout hasard, connaitrais-tu une autre façon de déterminer que tel ou tel vote est statistiquement à la marge par rapport aux autres ?

J’ai besoin d’identifier les votes faits à la va-vite ou volontairement faux. Par ailleurs, et de manière indépendante de ce que je viens de te dire, l’indice de confiance du vote pour une photo donnée tient compte de mon système de clustering, mais aussi du temps passé sur la photo, de l’éventuelle présence d’un commentaire en saisie libre, de la taille de ce dernier, et aussi de, pour une même donnée présentée plusieurs fois au voteur, si ce dernier a changé du tout au tout sa notation de vote en vote pour cette même photo (ce qui prouve qu’il vote au hasard).


  1. Hors-cluster = non-fiable : bof.

ça me semble statistiquement pertinent, cf ci-dessus.

As-tu d’autres solutions ?


Hors cluster = début d’un nouveau cluster : bof. Les techniques de clusterisation sont sensibles. A partir de 50 points, si on ajoute 3 ou 4 points, il se peut que les clusters obtenus bougent de façon significative. Des points qui étaient hors clusters deviennent centres-de-clusters, et inversement.

En effet, je pense que le centre des clusters bouge si on ajoute des points, donc le calcul du cluster risque de faire entrer des points qui étaient hors-clusters. Je pense que c’est ce que tu as voulu dire.

  1. Cependant, plus le nombre de votes est grand, plus la précision des clusters sera grande, et plus les votes qu’on sait "faux" resteront, ou redeviendront, "faux" du point de vue du clustering, tout simplement parce qu’ils restent minoritaires et que les autres, "corrects", resteront majoritaires.

  2. Il est normal que les clusters évoluent au cours du temps (ie au cours de l’augmentation du nombre de votes) : c’est une forme d' "apprentissage" et c’est ce que je veux.


Avant de chercher à 'positionner' les points nouveaux par rapport aux clusters , je t’invite à :

Vérifier si les clusters obtenus font sens.

Vérifier si les clusters obtenus sont stables quand on ajoute quelques points.

Impossible.

Le système dont j’ai besoin doit pouvoir s’exécuter en parfaite autonomie. Tout simplement parce que le nombre de photos, les votes, les voteursu, sont totalement dynamiques, je n’ai pas la main sur leur création, etc. Il s’agit d’un site Web avec des comptes utilisateurs créables et utilisables par des internautes comme toi et moi, pouvant voter et soumettre des photos à des votes.

+0 -0

Une remarque à l’arrache, en survolant un peu le sujet.
Si tu utilise des intervalles trop petits comme indiqués (genre en 1 et 4) qui ne sont pas forcément adaptable à un système de cluster, tu peux essayer un système basique à base d’une formule qui vient additionner les différents paramètres pour sortir une valeur.

Sur cette valeur finale tu applique un calcul d’écart-type pour écarter les valeurs farfelues. Ca nécessite d’avoir un minimum de données à l’origine néanmoins, mais je pense qu’au début tu peux très bien faire une validation manuelle par un trusted user avant de laisser le système gérer automatiquement.

Ta formule peut aussi avoir des pondération par exemple : Resultat = a x Luminosité + b x Angle + c x etc.

Faut faire des essais et affiner les valeurs avec le temps.

+1 -0

Une remarque à l’arrache, en survolant un peu le sujet.
Si tu utilise des intervalles trop petits comme indiqués (genre en 1 et 4) qui ne sont pas forcément adaptable à un système de cluster, tu peux essayer un système basique à base d’une formule qui vient additionner les différents paramètres pour sortir une valeur.

Sur cette valeur finale tu applique un calcul d’écart-type pour écarter les valeurs farfelues. Ca nécessite d’avoir un minimum de données à l’origine néanmoins, mais je pense qu’au début tu peux très bien faire une validation manuelle par un trusted user avant de laisser le système gérer automatiquement.

Ta formule peut aussi avoir des pondération par exemple : Resultat = a x Luminosité + b x Angle + c x etc.

Faut faire des essais et affiner les valeurs avec le temps.

zeqL

Bonjour @zeqL !

En effet, la modélisation d’un vote, je compte la faire en définissant mes vecteurs (a x *Luminosité* ; b x *Angle* ; etc.), et je ferai la somme de ses composantes.

Sur ce point, je suis donc totalement en phase avec ton idée.

Néanmoins, comparer cette somme à l’écart-type me semble impossible, puisque ça reviendrait à mettre dans le même panier tous les votes "valides". Or, ces votes valides seront fréquemment divisés en groupes, que j’appelais "tendances" (d’où mon idée initiale de partir sur un système de clustering). Il y aura par exemple, pour une même photo, 80% de votes "image très lumineuse + très bon angle", 20% de votes "image lumineuse + bon angle", 9% de votes "image très lumineuse + bon angle", et 1% de votes "image pas du tout lumineuse + angle tout-pourri". Evidemment les votes "faux" sont ceux du 1%.

Du coup, utiliser l’écart-type reviendrait à faire vi des clusters "80%" et "20%" et "9%". Alors qu’ils sont valides.

Je pense que (comme d’habitude), tu prends le problème à l’envers.

  • Tu parles du vote, et pas du voteur … premier problème.

  • Quels sont les ordres de grandeur ? Tu parles de 5 questions par photo, ou 30 ? On ne sait pas donc on ne peut pas t’aider.

  • Combien de voteurs par photo ? Si tu as 50 votants par photo, c’est totalement insuffisant pour parler de clusters. Si tu en as 500, tu t’en fous totalement s’il y a des réponses farfelues, ça se noie dans la masse. Le seul intérêt de détecter les voteurs farfelus, c’est de les éliminer totalement de ton échantillon (un voteur qui est atypique sur la moitié des photos est retiré purement et simplement).

  • tu as des outils annexes pour détecter les réponses bâclées ( incohérence entre 2 questions qui veulent plus ou moins dire la même chose, temps de réponse, commentaires). Exploite déjà ces outils-là.

  • La clusterisation, c’est basé sur une notion d’écart-type au sein de chaque cluster. Des données avec seulement 4 ou 5 valeurs possibles sur chaque axe sont mal adaptées pour calculer des écart-type. Comme tu le dis : chaque cluster se retrouve être constitué d’une seule valeur.

Je pense que tu as vu le concept de cluster quelque part, ce mot t’a bien plu, et tu t’es dit qu’il fallait absolument le caser quelque part.

En analyse de données (comme dans plein de disciplines), on part d’un problème, et on cherche comment le résoudre. Toi, tu pars d’un outil, et tu cherches comment l’utiliser.

Je plusseoie en particulier deux points dans la réponse de @elegance :

tu as des outils annexes pour détecter les réponses bâclées ( incohérence entre 2 questions qui veulent plus ou moins dire la même chose, temps de réponse, commentaires). Exploite déjà ces outils-là.

C’est un problème qui doit être aussi vieux que les sondages, donc on a des outils éprouvés pour gérer au mieux ce genre de cas1.

En analyse de données (comme dans plein de disciplines), on part d’un problème, et on cherche comment le résoudre. Toi, tu pars d’un outil, et tu cherches comment l’utiliser.

« Partir d’un outil et chercher comment l’utiliser », c’est un point qui revient souvent dans tes sujets sur ce forum. Il y a peut-être une réflexion à avoir dans cette direction – je ne dis pas que c’est facile : ça implique d’être capable de prendre du recul sur ce qu’on fait. Une première étape, c’est d’essayer, face à un problème, de repartir du besoin : quel est l’état final attendu ? (dans les termes les plus simples possibles, quitte à énoncer des trivialités2) puis de faire un état des lieux du problème : quelles sont mes contraintes ? et des solutions à disposition, en gardant dans un coin de la tête le biais des couts irrécupérables. C’est un moyen assez efficace de lever le nez du guidon et de se rendre compte qu’on s’entête dans une solution bancale… ce qui est un problème classique, surtout quand on travaille seul sur un projet.

Passer quelques temps sur autre chose (au moins une journée, voire plus si on est sur le problème depuis des semaines) est aussi un moyen très efficace de prendre du recul. Ce temps de prise de recul est très rarement perdu.


  1. Ça n’empêche pas des instituts de sondages politiques de nous sortir des graphiques sur une question mal posée avec indiqué en tout petit quelque chose comme « on a sorti les 34 % de personnes hors quota de l’échantillon, et aussi les 27 % qui ont dit qu’elles ne savaient pas pour qui voter ou qui ont déclaré ne pas être sûres, et aussi les 5 % qui ont dit voter blanc ou nul, mais t’inquiètes frère le sondage est valide », mais c’est un autre débat : les outils existent – et c’est eux qui provoquent cette impression de répondre plusieurs fois à presque la même question.
  2. Un exemple qui a l’air idiot en aéronautique, un pilote d’avion doit transporter un VIP. Quel est l’état final recherché ? Dans cet ordre : 1. Le pilote et le VIP doivent être en vie ; 2. Le VIP doit arriver à l’endroit prévu, 3. Le VIP doit arriver à l’endroit prévu à l’heure prévue. Ça a l’air con dit comme ça mais ça montre que la sécurité du vol passe avant le fait d’arriver à l’heure à un rendez-vous, même si le passager est super important et met une pression folle. D’ailleurs, le verbaliser au passager peut lui faire comprendre que le pilote peut être amené à prendre des décisions qui ne lui plaisent pas pour son propre bien. C’est le genre de chose qui aurait pu éviter ce genre d’accident. Bref : repartir de l’état final recherché, c’est bien. Et même dans des contextes moins dramatiques, c’est un bon moyen de se rendre compte qu’on est le nez dans le guidon et qu’on part dans une mauvaise direction.

Salut !

Concernant le clustering, je connaissais depuis belle lurette (en fait, depuis la fac au moins) et j’y ai pensé car à mes yeux c’est le plus intuitif : chaque tendance = 1 cluster (défini par sa densité qui doit elle-même être définie par rapport à un seuil relatif au nombre de votes total), et chaque vote incorrect = en-dehors de tout cluster (ou bien futur cluster si beaucoup de votes viennent se mettre à côté de lui). Bon maintenant que c’est dit, après réflexion et relecture de vos explications, en effet cela ne va pas car il n’y aura que 3 questions par photos et 4 réponses discrètes par photo, ce qui fait que la probabilité d’obtenir un nuage de points au lieu d’un graphe constitué de jolis clusters (= obtenir du bruit, en fait) est extrêmement élevée. (C’est ce que vous m’avez expliqué, mais d’une autre façon). (j’en profite pour marquer le coup => je suis bien parti du problème + de ma compréhension de ce dernier pour arriver à la fin vers les clusters, comme vous l’aurez compris).

Ce qui m’amène à la conclusion qu’il est impossible, dans ce contexte d’utilisation, de dire que tel ou tel vote s’inscrit dans au moins une tendance, parmi toutes les tendances constituées par les autres votes. (puisque cette notion de clustering est, selon moi, la "définition"-même de la notion de tendanceS et de détection de votes en-dehors de toute tendance).

Et donc que ce topic est résolu à ce niveau-là : il n’y a aucune possibilité de résoudre mon problème.


En-dehors de cette vérification ("dire que tel ou tel vote s’inscrit dans au moins une tendance, parmi toutes les tendances constituées par les autres votes"), je peux en effet :

  • vérifier la durée passée sur une photo
  • un commentaire a-t-il été laissé ?
  • longueur du commentaire : plus c’est long, plus ça peut tendre vers un bon vote
  • pour une même photo montrée 2 ou 3 fois en quelques jours, les votes d’un même voteur changent-ils beaucoup sur au moins un vote ? Si oui, c’est pas un bon vote.

Voyez-vous d’autres solutions ?


J’ai donné le nombre de questions par photos, et de réponses par questions ("car il n’y aura que 3 questions par photos et 4 réponses discrètes par photo" cf. au-dessus).

Nombre de votants par photos : aucune idée, dans l’idéal ce serait le nombre d’inscrits sur mon site qui votent… Donc au départ, quasiment aucun, et, au bout de quelques années, des MILLIONS !!! (lol)


Si tu as 50 votants par photo, c’est totalement insuffisant pour parler de clusters. Si tu en as 500, tu t’en fous totalement s’il y a des réponses farfelues, ça se noie dans la masse. Le seul intérêt de détecter les voteurs farfelus, c’est de les éliminer totalement de ton échantillon (un voteur qui est atypique sur la moitié des photos est retiré purement et simplement).

Pas bête. Je prends note. J’ai pas le temps de réfléchir sur les applications pratiques de cela maintenant cependant, mais sans doute dans la semaine, ou ce week-end !


@SpaceFox

C’est un problème qui doit être aussi vieux que les sondages, donc on a des outils éprouvés pour gérer au mieux ce genre de cas.

Quels outils ? C’est vraiment ce que je recherche. Si jamais tu as connaissance d’un package PHP tout fait, je suis très intéressé. C’est le point le plus difficile et bloquant de mon projet. Une fois celui-ci résolu, je pourrai reprendre rapidement son "vrai" développement, le livrer puis m’occuper du marketing/communication / aspect juridico-financier (vu qu’il doit être rémunérateur, du moins je l’espère).

Mon but avec ce projet, qui à part cette notion de vérification des votes est très simple, c’est vraiment de me dégager un complément de revenu rapidement, que je vais pouvoir investir dans des placements financiers (dont j’ai besoin si je veux éviter que l’argent soit dormant sur le compte chèque).

Donc même des solutions clés en mains, je suis preneur. Je repasserai ultérieurement sur la partie "apprentissage / intérêt intellectuel".


@elegance

Je pense que tu as vu le concept de cluster quelque part, ce mot t’a bien plu, et tu t’es dit qu’il fallait absolument le caser quelque part.

Il n’est pas nécessaire d’être aussi cinglant pour faire passer le message que l’OP ne raisonne pas dans le bon ordre.

Un peu de tact ne serait pas malvenu.

+0 -0

Quels outils ? C’est vraiment ce que je recherche. Si jamais tu as connaissance d’un package PHP tout fait, je suis très intéressé. C’est le point le plus difficile et bloquant de mon projet. Une fois celui-ci résolu, je pourrai reprendre rapidement son "vrai" développement, le livrer puis m’occuper du marketing/communication / aspect juridico-financier (vu qu’il doit être rémunérateur, du moins je l’espère).

Mon but avec ce projet, qui à part cette notion de vérification des votes est très simple, c’est vraiment de me dégager un complément de revenu rapidement, que je vais pouvoir investir dans des placements financiers (dont j’ai besoin si je veux éviter que l’argent soit dormant sur le compte chèque).

Donc même des solutions clés en mains, je suis preneur. Je repasserai ultérieurement sur la partie "apprentissage / intérêt intellectuel".


Herbe

On peut fournir de l’aide si tu fais des efforts, répondre à des questions, en revanche fournir une solution clé en main dans le cadre d’un business, non. A toi de chercher à minima si ça existe ou de développer toi-même.

D’autant plus que, dans le cas de la robustesse des sondages, quand je parle « d’outils » il ne faut pas imaginer une bibliothèque prête à l’emploi dans un quelconque langage. Ces « outils » passent entre autre par la façon de définir les questions posées, entre autres pour définir les questions proches qui serviront à détecter les réponses incohérentes. De la même façon, la détection de réponses « trop rapides » ne peut se faire qu’au regard des questions posées. Ça ne peut pas être un truc tout fait qu’il suffit de brancher. C’est un « outil » au sens d’un ensemble de connaissances et de procédures à appliquer pour détecter et éliminer les réponses absurdes, avec des tests et des réglages à faire.

En résumé : cherche plutôt du côté des formations sur la conception conduite d’un sondage ou d’une enquête, plutôt que d’une solution technique clé-en-main.

Hello !

Suite à vos réponses :

  • @zeqL aucun souci pour faire les efforts de comprendre comment une éventuelle solution que l’on trouverait à la place du clustering (enfin… à la place de "rien", vu que j’abandonne nécessairement le clustering) fonctionne. C’est même ce que j’avais commencé à faire avec le clustering. C’est important pour moi de comprendre ça pour être sûr que ça match bien mes besoins par exemple.
    • Ce que je voulais dire dans mon précédent post, c’est qu’en revanche je veux à tout prix éviter de devoir écrire moi-même un éventuel "algorithme", je souhaiterais plutôt, comme dans tout projet "professionnel" ou en tout cas à but rémunérateur, donc devant être livré au plus vite, pouvoir utiliser une API (pour ne pas réinventer la roue, comme on dit).
      • Je note cependant la réponse de @SpaceFox, qui m’a indiqué que les outils dont il parle, ce ne sont pas des API mais des systèmes entiers, qui nécessitent de poser les questions d’une certaine manière et éventuellement accompagnées de nouvelles questions, ce que je ne peux pas me permettre (il faut en effet que les photos soient malgré tout rapidement "votables" et sans embêter le voteur de fioritures pour chaque photo). Ainsi, la façon de poser les questions que j’ai mise en place ne peut pas changer, car elle répond directement à des cas d’usages qui sont nécessaires à mon site, et qui ont la priorité absolue sur la détection de votes problématiques.

Pour le moment, je suis arrivé à la conclusion que je dois abandonner tout système de vérifier d’un vote par rapport aux votes des autres utilisateurs, sur une photo donnée. L’indice de confiance que je suis en train de mettre en place sera donc basé sur ses autres variables uniquement.

Si toutefois quelqu’un a connaissance d’une solution qui pourrait satisfaire mes besoins tels que décris dans ce topic, je serais preneur svp :bounce: Et, bien sûr, nécessairement déjà implémentés dans une API (gratuite d’utilisation et encore mieux : open-source en sus).


@zeqL en plus de la première bullet qui t’était adressée, je souhaiterais mentionner mon point de vue : c’est normal de demander leur avis à des confrères sur l’existence d’une lib pour ne pas devoir réinventer la roue, projet business ou pas. Et leur réponse sera d’autant plus appréciée que le projet est un projet de business, bien entendu (c’est humain). Je ne suis pas là à demander à ce que vous m’écriviez l’algo et paf je l’utilise.

+0 -0

Tu as le truc de Google pour vérifier si un utilisateur est humain, un captcha qui se valide automatiquement selon le comportement de l’utilisateur. Ça me parait la solution la plus simple à ton problème.

(Marchera contre les bots, pas contre les gens qui font de faux votes)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte