algo de matching

algo de matching - Algo - Programmation

Marsh Posté le 14-05-2007 à 15:18:26    

Voici le problème que je dois résoudre. Je cherche des idées ou des liens vers les bonnes infos.
 
Pour simplifier, j'ai une base avec :
- des produits
- des personnes décrites par un profil (c'est à dire une série de critères notés de 0 à 100% chacun)
- des notes entre une personne et un produit
 
A partir d'une personne j'aimerais proposer automatiquement une liste triée par intérêt des produits susceptibles de l'intéresser. En se basant bien entendu sur la similarité entre différentes personnes/critères/produits.
 
Je me rend bien compte que la question est vaste. Mais avez vous des idées d'algo ou d'endroit où je pourrais approfondir le sujet ?

Message cité 1 fois
Message édité par flamipuche le 14-05-2007 à 15:37:25
Reply

Marsh Posté le 14-05-2007 à 15:18:26   

Reply

Marsh Posté le 14-05-2007 à 15:21:46    

flamipuche a écrit :

En ce basant bien entendu


Mes yeux :o
 

flamipuche a écrit :

sur la simularité entre différentes personnes/critères/produits.


c'est quoi ?
 

flamipuche a écrit :

Je me rend bien compte que la question est vaste. Mais avez vous des idées d'algo ou d'endroit où je pourrais approfondir le sujet ?


Oui ...


---------------
Töp of the plöp
Reply

Marsh Posté le 14-05-2007 à 15:37:25    

Si j'avais pas perdu le login de mon site web, je te filerais mes requêtes à la mord moi le noeud de mon système de notation, mais je m'en souvient plus :D
 
J'avais fait un truc du même genre "les gens qui ont aimé ce manga on aussi aimé..."
Et j'avais aussi amélioré le truc (mais jamais mis en ligne car pas assez de monde votant :D) pour pondérer les votes en fonction des notations qu'on avait soit-même.
 
Genre si dans mon profile "j'aime le bleu et la télé", les notes d'une personne qui "aime le vert et les chiens" compteront moins que ceux d'une personne comptabible, même si leur notation pour un produit est similaire à la mienne. Ct un peu la merde mais c'est marrant à faire en tout cas :D
 
Indice : Pour avoir un truc qui tiens la route, il faut appliquer des algo logarithmiques : un profile similaire compte tout plein beaucoup plus qu'un critère pas similaire. Sinon, à cause de la masse d'infos, et la quantité de profils différents, ta pondération sera noyée et inutile.


Message édité par MagicBuzz le 14-05-2007 à 15:39:00
Reply

Marsh Posté le 14-05-2007 à 15:41:11    

oui un peu ce genre de truc effectivement. Sauf que dans mon cas une personne est décrite par un profil de critères (un peu comme une description type agence matrimoniale) et que c'est cette similarité d'un profil et/ou partie d'un profil qui sert à trouver les produits.

Reply

Marsh Posté le 14-05-2007 à 15:48:03    

oui oui, c'est justement les évolutions que j'ai jamais mis en ligne sur mon site ;)
 
j'avais rajouté un truc pour entrer son horoscope chinois (à défaut de trouver un truc japonais) et les notes accordées à des personnes ayant des profils compatibles comptaient beaucoup plus que les avis des gens incompatibles (mais que je prenais quand même en compte, après tout, on n'est pas tous formatés pareil ;))
 
le truc devenait "intelligent", puisqu'il prenait aussi en compte les notations qu'on avait donné, et on les comparait avec des notations d'autres personnes. si une personne donnait souvent des notes similaires pour les mêmes produits, alors ses avis devaient très beaucoup tout plein important par rapport à tout le reste, puisque se baser sur des goûts similaires est plus fiable que sur un horoscope :D
 
ps : ceci dit, après tu arrives dans un véritable problème de complexité et de lenteur. le plus dur, c'est d'arriver à des tables de statistiques afin de réduire considérablement les temps de recherche, au détriment de la finesse des résultats... sans trop perdre en pertinance


Message édité par MagicBuzz le 14-05-2007 à 15:49:34
Reply

Marsh Posté le 14-05-2007 à 16:20:06    

Réponse au PM en public (j'aime pas les PM :p)
 

flamipuche a écrit :

Arhhh tu me fais baver avec ton algo perdu. Tu peux pas m'en dire un peu plus de mémoire.


Ben en gros, l'algo est simple :
- Tu récupères l'ensemble des personnes ayant un profile pour ou moins similaire (cumul des abs(différences entres profiles))
- Tu prends l'ensemble des notes attribuées par ces personnes, aux produits, et tu pondères ces notes par le nombre de notes (si 20 personnes dise qu'un produit est bien, c'est plus parlant que si 2 personnes disent qu'un autre produit est très bien, il faut donc en tenir compte). Et enfin, tu appliques à ces notes la pondération que tu as trouvé dans le premier calcul (si une personne est "très compatible", son avis a plus de sens que celui d'une personnes "moyennement compatible".
 
Le gros problème ensuite, c'est que si t'as 2 personnes très compatibles, et 1000 personnes moyennement compatibles (c'est la réalité des données généralement), il faut que les personnes très compatibles compte énormément par rapport aux autres, donc il faut appliquer une fonction logarithmique dessus.
 
Ensuite, je peux guère t'en dire plus. Le souci, c'est que tu vas rapidement avoir le problème du volume de données à comparer. Il est donc utile d'établir des tables de statisques, mises à jour régulièrement.
Par exemple, établir 20 profiles "types", et les rattachers à toutes les personnes. Ainsi, lorsque tu fais le calcul, au lieu de comparer les 100 000 profils de ta base, tu ne match qu'une vingtaine de profils, pondérés avec des pondération correspondant au nombre de personnes qui en sont proches. Idem pour les notations, tu peux établir de façon statistiques qu'un profil particulier donnes généralement certaines notes à certains produits. A nouveau, tu réduit considérablement la portée des calculs.
En revanche, tu perds énormément en pertinance des résultats. Il faut donc trouver un juste milieu entre le nombre d'éléments "type", et la vitesse de rafraîchissement des données (hebdomadaire, quotidien, horraire, etc.). Tout ceci ne peut se faire qu'en fonction de tes données à toi, il n'y a pas de règle générale.
 
Ne pas oublier aussi qu'un filtrage du "bruit" peut être intéressant.
Par exemple, au sein d'un profile, il y a des personnes très atypiques (qui vont systématiquement donner des notes contraires aux autres). C'est là qu'il est important de ne pas faire une bête moyenne, mais de la pondérer par le nombre de personnes à chaque fois : si 100 personnes donnent une note de 10/10 à un produit, et que 10 personnes donnes un avis de 0/10 au même produit, la note tombe à 9/10. Pourtant, les 10 personnes qui ont donné un avis contraire sont négligeables, et ne devraient pas entrer en considération. C'est d'autant plus vrai si ces 10 personnes ensuite donnent 10/10 à un produit que les 100 autres personnes n'ont pas noté : ce produit va sortir en premier, alors qu'il a peu de chances d'intéresser la personne qui consulte le truc.
 
Enfin, si la personne qui consulte le truc a effectivement donné 0/10 au premier produit, on se rend compte que celui où les 10 autres ont donné 10/10 est réellement succeptible de l'intéresser, alors que l'avis des 100 autres est moins intéressant ! Ainsi, la pondération des notation au sein d'un même profil ne repose plus sur le nombre de votants, mais sur la différence entre les notes qu'ils ont attribué, et celle que la personne qui consulte ont attribué aussi. Et ceci doit s'appliquer à l'ensemble des profils : c'est à dire que si j'aime les rousses et toi les blondes, mais qu'on adore tous les deux les mêmes produits, il y a de grandes chances que les produits que j'aime et que tu ne connais pas t'intéressent, même si on est logiquement incompatibles.


Message édité par MagicBuzz le 14-05-2007 à 16:21:22
Reply

Marsh Posté le 14-05-2007 à 16:20:59    

En tout cas, je te souhaite un très bon courage. Moi il m'avais fallu plusieurs jours de réflexion pour pondre des requêtes SQL qui faisaient 4 pages de long avant d'arriver à un résultat pas trop incohérent ;)

Reply

Marsh Posté le 14-05-2007 à 16:22:50    

Merci pour l'aide. je vais cogiter l'idée.

Reply

Marsh Posté le 16-05-2007 à 14:30:39    

Pour info (ça permettra à flamipuche de trouver plus d'infos sur le web, je pense), la méthode expliquée par MagicBuzz appartient au domaine des systèmes de recommandation ( http://en.wikipedia.org/wiki/Recommendation_system ). On peut ainsi rechercher des algorithmes de collaborative filtering ( http://en.wikipedia.org/wiki/Collaborative_filtering ).
 
La recherche est très active sur le sujet, y a moyen de trouver un max d'informations :)


---------------
Soyons ouverts d'esprit, mais pas au point de laisser notre cerveau s'enfuir.
Reply

Marsh Posté le 16-05-2007 à 21:58:51    

Merci pour ces excellents point de départ. C'est ce qu'il me fallait ;-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed