Algorithme de correspondance des préférences

12

Il y a ce projet parallèle sur lequel je travaille où j'ai besoin de structurer une solution au problème suivant.

J'ai deux groupes de personnes (clients). Le groupe a l' Aintention d'acheter et le groupe a l' Bintention de vendre un produit déterminé X. Le produit a une série d'attributs x_i, et mon objectif est de faciliter la transaction entre Aet Ben faisant correspondre leurs préférences. L'idée principale est de signaler à chaque membre d' Aun correspondant Bdont le produit correspond le mieux à ses besoins, et vice versa.

Quelques aspects compliquant le problème:

  1. La liste des attributs n'est pas finie. L'acheteur peut être intéressé par une caractéristique très particulière ou une sorte de design, ce qui est rare parmi la population et je ne peux pas le prévoir. Impossible de répertorier tous les attributs auparavant;

  2. Les attributs peuvent être continus, binaires ou non quantifiables (ex: prix, fonctionnalité, conception);

Une suggestion sur la façon d'aborder ce problème et de le résoudre de manière automatisée?

J'apprécierais également quelques références à d'autres problèmes similaires si possible.


Excellentes suggestions! Beaucoup de similitudes dans la façon dont je pense aborder le problème.

Le principal problème lié à la cartographie des attributs est que le niveau de détail auquel le produit doit être décrit dépend de chaque acheteur. Prenons un exemple de voiture. Le produit «voiture» possède de nombreux attributs qui vont de ses performances, sa structure mécanique, son prix, etc.

Supposons que je veuille juste une voiture bon marché ou une voiture électrique. Ok, c'est facile à cartographier car ils représentent les principales caractéristiques de ce produit. Mais disons, par exemple, que je veux une voiture avec une transmission à double embrayage ou des phares au xénon. Eh bien, il pourrait y avoir beaucoup de voitures dans la base de données avec ces attributs, mais je ne demanderais pas au vendeur de renseigner ce niveau de détail sur leur produit avant de savoir qu'il y a quelqu'un qui les regarde. Une telle procédure obligerait chaque vendeur à remplir un formulaire complexe et très détaillé, il suffit d'essayer de vendre sa voiture sur la plateforme. Ça ne marcherait pas.

Mais encore, mon défi est d'essayer d'être aussi détaillé que nécessaire dans la recherche pour faire un bon match. Donc, la façon dont je pense est de cartographier les principaux aspects du produit, ceux qui sont probablement pertinents pour tout le monde, afin de réduire le groupe de vendeurs potentiels.

La prochaine étape serait une «recherche affinée». Afin d'éviter de créer un formulaire trop détaillé, je pourrais demander aux acheteurs et aux vendeurs d'écrire un texte libre de leurs spécifications. Et puis utilisez un algorithme de correspondance de mots pour trouver des correspondances possibles. Bien que je comprenne que ce n'est pas une bonne solution au problème parce que le vendeur ne peut pas «deviner» ce dont l'acheteur a besoin. Mais pourrait me rapprocher.

Les critères de pondération suggérés sont excellents. Cela me permet de quantifier le niveau auquel le vendeur correspond aux besoins de l'acheteur. Cependant, la partie mise à l'échelle peut être un problème, car l'importance de chaque attribut varie d'un client à l'autre. Je pense utiliser une sorte de reconnaissance de modèle ou simplement demander à l'acheteur de saisir le niveau d'importance de chaque attribut.

RD
la source

Réponses:

9

Ma première suggestion serait de mapper en quelque sorte les attributs non quantifiables aux quantités à l'aide de fonctions de mappage appropriées. Sinon, laissez-les simplement de côté.

Deuxièmement, je ne pense pas que vous devez supposer que la liste des attributs n'est pas finie. Une approche standard et intuitive consiste à représenter chaque attribut comme une dimension individuelle dans un espace vectoriel. Chaque produit n'est alors qu'un point dans cet espace. Dans ce cas, si vous souhaitez ajouter dynamiquement plus d'attributs, il vous suffit de remapper les vecteurs de produit dans le nouvel espace de fonctionnalité (avec des dimensions supplémentaires).

Avec cette représentation, un vendeur est un point dans l'espace des fonctionnalités avec des attributs de produit et un acheteur est un point dans le même espace des fonctionnalités avec des attributs de préférence. La tâche consiste alors à trouver le point acheteur le plus similaire pour un point vendeur donné.

Si votre ensemble de données (c'est-à-dire le nombre d'acheteurs / vendeurs) n'est pas très important, vous pouvez résoudre ce problème avec une approche de voisin le plus proche implémentée à l'aide d'arbres kd.

Pour les données de très grande taille, vous pouvez adopter une approche infrarouge. Indexez l'ensemble des vendeurs (c'est-à-dire les attributs du produit) en traitant chaque attribut comme un terme distinct, le poids du terme étant défini sur la valeur d'attribut. Dans ce cas, une requête est un acheteur qui est également codé dans l'espace de termes comme un vecteur de requête avec des pondérations de termes appropriées. L'étape de récupération vous renverrait une liste des K correspondances les plus similaires.

Debasis
la source
Wright. Le problème principal ici est le nombre de dimensions, c'est-à-dire le niveau de détail que je dois utiliser. Pourriez-vous me préciser «l'approche IR».
RD
1
Par IR, j'entendais la recherche d'informations. Vous pourriez penser que les documents (vendeurs) de votre collection et la requête (un acheteur) sont tous des vecteurs intégrés dans un espace de terme (attribut). Comme je l'ai dit, une telle approche nécessite un nombre prédéfini de dimensions pour fonctionner.
Debasis
7

Comme suggéré, se déchaîner . Tout d'abord, corrigez-moi si je me trompe:

  • Quelques fonctionnalités existent pour chaque produit unique;
  • Il n'y a pas de liste de fonctionnalités ultimes et les clients peuvent ajouter de nouvelles fonctionnalités à leurs produits.

Si tel est le cas, la construction d'une table complète des fonctionnalités du produit pourrait être coûteuse en termes de calcul. Et le tableau de données final serait extrêmement clairsemé.

La première étape consiste à réduire la liste des clients (produits) pour la correspondance. Construisons un graphique bipartite, où les vendeurs seraient des nœuds de type 1 et les acheteurs des nœuds de type 2. Créez un avantage entre n'importe quel vendeur et acheteur chaque fois qu'ils font référence à une caractéristique de produit similaire, comme dans l'esquisse suivante:

graphique

En utilisant le graphique ci-dessus, pour chaque produit de vendeur unique, vous pouvez sélectionner uniquement les acheteurs intéressés par les fonctionnalités qui correspondent au produit (il est possible de filtrer au moins une fonctionnalité commune, de faire correspondre l'ensemble complet des fonctionnalités ou de définir un niveau de seuil). Mais ce n'est certainement pas suffisant. L'étape suivante consiste à comparer les valeurs des fonctionnalités, comme décrit par le vendeur et l'acheteur. Il existe de nombreuses variantes (par exemple, k-Nearest-Neighbors). Mais pourquoi ne pas essayer de résoudre cette question en utilisant le graphique existant? Ajoutons des poids aux bords:

  • pour les fonctionnalités continues (par exemple, le prix):

    prix_poids

  • pour les fonctionnalités binaires et non quantifiables - juste biconditionnel logique:

    fonction_poids

L'idée principale ici est de mettre à l' échelle chaque entité à l'intervalle [0, 1]. De plus, nous pouvons utiliser des coefficients de fonctionnalité pour déterminer les fonctionnalités les plus importantes. Par exemple, en supposant que le prix est deux fois plus important que la disponibilité d'une fonction rare:

adj_w_1

adj_w_2

L'une des dernières étapes consiste à simplifier la structure du graphique et à réduire de nombreux bords à un bord avec un poids égal à la somme des poids calculés précédemment pour chaque entité. Avec une structure aussi réduite, chaque paire de clients / produits ne pourrait avoir qu'un seul bord (pas de bords parallèles). Donc, pour trouver la meilleure offre pour le vendeur exact, il vous suffit de sélectionner des acheteurs connectés avec des bords pondérés max.

Défi futur: introduire une méthode bon marché pour pondérer les bords à la première étape :)

sobach
la source