Ко мне обращались клиенты с просьбой сделать рекомендации при подборе номенклатуры "как в интернет магазине". Небольшое исследование показало что подобные алгоритмы строятся на принципах коллаборативной фильтрации, которая бывает 2х видов "по схожести покупателей" и "по схожести предметов" (также есть гибрид этих методов). Первой мыслью было сделать алгоритм Slope One и выдавать в подборе те товары, которые покупают "похожие" покупатели, но вот Амазон в своей статье указывает на недостатки такого подхода https://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf
На этой картинке изображено сравнение 2х подходов:
И они используют свой алгоритм в своей интернет платформе — по схожести предметов "Item-to-Item".
В 1С есть механизм поиска ассоциаций, это реализовано в виде расчета регистра "Номенклатура продаваемая совместно", но он имеет некие настройки, которые надо подобрать эмпирическим путем, кроме того метод вычисления оценки недоступен (а он может быть разный). В то же время амазоновский и другие аналогичные методы считают "похожесть" разными способами . Например вот тут приведены различные оценки схожести векторов https://en.m.wikipedia.org/wiki/Cosine_similarity (я сразу извиняюсь за то что привожу в этой и других своих постах англоязычные тексты, но причина по которой я это делаю в том, что в русскоязычных просто недостаточно полная информация — недописанные статьи и просто не все есть. Это как начать смотреть сериал в котором не хватает серий. Проще уж сразу на англоязычных ресурсах все смотреть)
Детального описания "от и до" я не нашел, поэтому пришлось допускать свои вольности чтобы сделать применение.
Исходными данными являются продажи — документы реализации с товарами. На основе их строятся вектора. Если покупатель купил товар то присваивается "1", если не купил — "0". Т.е. количество не учитывается, учитывается только состав товара в корзине. В результате мы получаем набор векторов продаж для каждого товара . Что то типа такого: (0,1,1,0,0), (0,0,1,0,0) — размер векторов одинаковый.
Далее мы используем оценку от Амазон в виде косинуса между векторами:
Ну и получается для каждого товара мы получаем набор векторов со своими весовыми коэффициентами "похожести". Я беру для каждого товара не более 3х похожих товаров, сортирую их по убыванию коэффициентов и вывожу как рекомендуемые. Можно брать одного "победителя" для каждого товара. Тут возможны вариации.
Сначала для разработки я использовал чистую демо базу где сделал такие исходные данные (номер продажи используется как группировка продаж, аналогично документу "Реализация товаров")
И написав алгоритм, получил такие данные в рекомендациях:
Это показывает что алгоритм работает. Эта демо база есть во вложении к статье по ней возможно будет проще разобраться с алгоритмом так как в базе простая структура и мало данных.
Также я сделал расширение для УТ11. Что оно делает:
1) там есть расчет рекомендаций по алгоритму написанному выше. Это длительная операция. Можно повесить на регл задание вызов этой функции в принципе. В результате у каждой номенклатуры вычисляются до 3-х рекомендованных товаров
2) изменена форма подбора: алгоритм смотрит на корзину, и по корзине заполняет табличная часть Рекомендации. Из рекомендаций также можно добавлять товары в корзину
На типовой тестовой базе работает несколько однобоко, так как там данных мало. А вот в рабочих базах уже интереснее. Внимание! В расширении в подборе, в рекомендациях не учитываются доступные остатки — я это не делал, в связи со спецификой задачи. Также расчет рекомендаций не работает по характеристикам — тут уже надо менять алгоритм, сейчас он только по товарам.
Круто!
(1) Спасиб)
Дима как всегда плюшки реализует 🙂 Спасибо. Попробуем использовать у себя.
за идеи спасибо.
на демках будет работать и можно «удивлять» заказчиков с целью раскошелиться.
правда, я бы предупреждал заказчика, что механизмы поиска ассоциаций, кластеризации и пр. в 1С то есть,
но на базах больше демки раз в 10 будут работать очень-очень-очень медленно и после нескольких
долгих попыток получить результат сведут на нет всю прелесть момента.
сила ума!
(4) начало положено — а оптимизацию придумаем, я думаю, это решаемо
(0) не получается скачать — выходит окно с тарифами
(7) Наверное, это после обновления инфорстарта. Я как обычно публиковал…
(4) Спасибо за коммент! Да расчет работает медленно, но результат расчета записывается и использование в подборе не может тормозить. Да, в 1С есть «поиск ассоциаций» и «кластеризация» я про это писал же.
(8) скачал, проблема в моем впн-канале была. отключился от впн — скачал нормально. Сорри за дезинформацию.
Как всегда супер!
(11) Спасибо!
Я правильно понимаю, что количество измерений вектора будет равно количеству товарных позиций в базе?
(13) Да, почти. Правильнее добавить «учавствующих в продажах»
(14)
Ну да, фильтровать номенклатуру логично )
Осталось дождаться, когда Ильдарович научит обсчитывать все это одним запросом %)
(15) Я кстати видел на нативном SQL запрос для этого
(15) я на скд считал разность векторов по Евклидову расстоянию, расчет вектора товара тоже, думаю, можно запилить
Здравствуйте. Подскажите пожалуйста,если у нас в базе есть номенклатура например телефон красный, но он идёт с серийным номером ,то есть с индивидуальной характеристикой, будет ли ваша обработка работать с такими товарами или нужно будет что-то менять? Если нужно будет то как долго и сложно будет это сделать? Например обычно с таким телефоном продаётся чехол и защитное стекло, плюс ещё всевозможные допы.
(18) Эта обраблтка работает только с номенклатурой не учитывая характеристики. Если надо учитывать характеристики то можно переделать алгоритм. Насколько я понимаю вам как раз не нужно их учитывать
(2) Добрый день! А правильно ли я понял, рекомендации работают только для «опта» по сути? Т.е. ТЧ ЧековККМ просматривается?
(20) Да для чеков не делал. Если надо чеки надо добавить в запрос по аналогии с реализациями