Рекомендация системы экспериментов - PullRequest
1 голос
/ 01 декабря 2009

Я читаю книгу «Программирование коллективного разума» и пытаюсь применить полученные знания к базе данных Northwind. Хотя я еще не уверен в своем понимании представленных алгоритмов, я начинаю понимать общие понятия.

Используя базу данных Northwind, я пытаюсь показать список «клиентов, которые купили это, также купили XYZ», используя следующую псевдологию:

  1. Найти других клиентов, которые также приобрели мой товар
  2. Найти все другие товары, приобретенные этими клиентами
  3. Рейтинг предметов на основе количества покупок
  4. Вернуть N лучших предметов из предыдущего шага

Я работаю с запросом ниже:

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

Я думаю, что моим следующим шагом будет разбиение запроса, чтобы я мог фильтровать по последним покупкам (в отличие от всех прошлых покупок) и ограничивать соответствие клиентов N покупателям, а не ВСЕМ покупателям, купившим мой продукт. Кто-нибудь может предоставить какие-либо указатели? Я направился в правильном направлении? Должен ли я идти в совершенно ином направлении?

На данный момент моя цель - производительность, а не точность, так как я знаю, что у меня еще нет опыта применения алгоритмов для их максимальной выгоды. Я просто пытаюсь применить концепцию. После того, как я убедился, что понимаю это достаточно хорошо, я намерен проверить этот запрос на более крупной базе данных с более реалистичными данными о клиентах.

1 Ответ

2 голосов
/ 01 декабря 2009

Это обычно называется анализом «корзины рынка» или «группировкой по аффинности», и это не так просто, как кажется, в основном из-за большого количества комбинаций. Первое, на что нужно обратить внимание, - это то, каково минимальное количество случаев, которые привели бы к положительному выявлению. Например, скажем, у нас есть 1M корзин, и 10 человек, которые купили продукт A, также купили продукт B в той же корзине. Достаточно ли 10 случаев, чтобы сказать, что «люди, которые купили А, также купили В»? В связи с этим использование «недавних» покупок немного сложнее. Идея состоит в том, чтобы создать таблицу пар продуктов, но если у нас есть N продуктов, количество комбинаций равно N * (N-1), поэтому для магазина из 1000 продуктов у нас будет 999000 комбинаций, поэтому алгоритм, который сокращает это не просто.

Еще одна вещь, которую следует учитывать, - это порядок предметов и стоимость каждого из них. Например, клиенты, покупающие велосипеды, часто могут купить (добавить) «светодиод». Но если положить светодиодный индикатор в корзину, должна ли система предлагать в списке велосипед?

Учитывая, что вы используете сервер SQL, я бы указал на интеллектуальный анализ данных служб , который использует для этой цели «алгоритм ассоциации MS». Используя те же данные, вы можете сравнить свои результаты с «коммерческим решением».

...