Рекомендация системы экспериментов
Я читаю книгу "Программирование коллективного разума" и пытаюсь применить полученные знания к базе данных Northwind. Хотя я еще не уверен в своем понимании представленных алгоритмов, я начинаю понимать общие понятия.
Используя базу данных Northwind, я пытаюсь показать список "клиентов, которые купили это, также купили XYZ", используя следующую псевдологию:
- Найти других клиентов, которые также приобрели мой товар
- Найти все другие предметы, приобретенные этими клиентами
- Ранжирование предметов на основе количества покупок
- Вернуть 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". Используя те же данные, вы можете сравнить свои результаты с "коммерческим решением".