1

Je suis en train de lire le livre Programmation de l'intelligence collective et d'essayer d'appliquer ce que j'ai appris sur la base de données Northwind. Bien que je ne sois pas encore confiant dans ma compréhension des algorithmes présentés, je commence à avoir une idée des concepts généraux.Expérimentation du système de recommandation

Utilisation de la base de données Northwind, je tente de montrer une liste de « clients qui ont acheté ce également acheté XYZ » en utilisant le pseudo-logique suivante:

  1. Trouver d'autres clients qui ont aussi acheté mon article
  2. Trouver tous les autres articles achetés par les clients
  3. articles classement basés sur l'achat compte
  4. articles Retour haut N de l'étape précédente

Je travaille avec la requête ci-dessous:

declare 
    @customerid nchar(5), 
    @productid int; 

set @customerid = 'ALFKI'; 
set @productid = 59; 

-- find other products from customers who 
-- also purchased my productid 

select top 10 
    od.productid, c.categoryname, p.productname, p.unitsonorder, count(od.productid) 
from 
    [order details] od 
     inner join orders o on o.orderid = od.orderid 
     inner join products p on p.productid = od.productid 
     inner join categories c on c.categoryid = p.categoryid 
where 
    o.customerid <> @customerid and 
    od.productid <> @productid and 
    p.discontinued = 0 
group by 
    od.productid, c.categoryname, p.productname, p.unitsonorder 
order by 5 desc,4 desc 

Je pense que la prochaine étape serait de briser la requête pour que je puisse filtrer en fonction des achats récents (par opposition à tous les achats historiques) et le client limite correspondant à N clients, plutôt que tous les clients qui ont acheté mon produit. Quelqu'un peut-il fournir des pointeurs? Suis-je dans la bonne direction? Devrais-je prendre une direction différente entièrement? À ce stade, mon objectif est la performance par rapport à la précision, car je sais que je n'ai pas encore l'expérience pour appliquer les algorithmes à leur maximum. J'essaie simplement d'appliquer le concept. Une fois satisfait je comprends assez bien, j'ai l'intention de tester cette requête par rapport à une base de données plus grande avec des données client plus réalistes.

Répondre

2

Ceci est généralement appelé «analyse de panier» ou «groupement d'affinité» et il n'est pas aussi simple que cela puisse paraître, principalement en raison du grand nombre de combinaisons. La première chose à considérer est quel est le nombre minimum de cas qui résulterait en une détection positive. Par exemple, disons que nous avons des paniers 1M et que 10 personnes qui ont acheté le produit A ont également acheté le produit B dans le même panier. Est-ce que 10 cas suffisent pour dire que "les gens qui ont acheté A ont aussi acheté B"? Pour cette raison, l'utilisation des achats «récents» est un peu difficile. L'idée est de créer une table de paires de produits, mais si nous avons N produits, le nombre de combinaisons est N * (N-1), donc pour un magasin de 1000 produit, nous aurions 999000 combinaisons, donc algorithme qui élague c'est pas simple.

Une autre chose à considérer est l'ordre des articles et la valeur de chacun. Par exemple, les clients qui achètent des bicyclettes peuvent souvent acheter (ajouter) une "lumière LED". Mais, si l'on met une lumière LED dans un panier, le système devrait-il proposer un vélo dans la liste? Étant donné que vous utilisez SQL Server, je vous renvoie vers Analysis Services Data Mining qui utilise pour cela "MS Association Algorithm". En utilisant les mêmes données, vous pouvez comparer vos résultats à une «solution commerciale».