Рекомендация системы экспериментов

Я читаю книгу "Программирование коллективного разума" и пытаюсь применить полученные знания к базе данных 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 ответ

Решение

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

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

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

Другие вопросы по тегам