Задать вопрос
@karpo518

Как выбрать случайные элементы из БД, используя математическую вероятность на основе конверсии каждого элемента?

Мне нужно 2 формулы:
1-ая будет преобразовывать коэффициенты конверсии к коэффициентам вероятности.
2-ая будет определять элементы для выдачи при каждом запросе на основе коэффициентов вероятности

Не компетентен в теме расчёта вероятности и вряд ли осилю её, поэтому прошу совета. Кто что может подсказать? Задача решается для сайта с функционалом каталога на стеке PHP + MySQL. Подробности задачи засунул под спойлер.

spoiler
Пытаюсь повысить на сайте кликабельность элементов в блоке "Похожие товары/записи/элементы". Записываю связи между элементами и количество показов и кликов. Вывожу похожие элементы, отсортировав их по конверсии клики/показы. Дополнительно вывожу несколько позиций для дообучения блока.

В первую очередь для обучения подсовываются позиции, которые показали себя лучше без учета привязки к конкретным блокам, т.е. в целом высококонверсионные. Когда они набирают минимальное количество просмотров, то переходят в категорию обученных. Это означает, что при низкой конверсии они больше никогда не будут показаны.

Данный алгоритм имеет следующие недостатки:

1. Некоторые похожие элементы не успевают набирать минимальное количество просмотров, чтобы участвовать в выдаче. То есть система обучается слишком медленно, потому что связей много и достаточное количество показов всех связей невозможно набрать за адекватное время.
2. Позиции с высокой конверсией "железно закрепляются" в блоке. Если появится новая высоко-конверсионная связь, то обучение её может занять очень много времени.

Уменьшение минимального набора показов для обучения приводит к падению точности.

Я бы хотел изменить логику блока, которая замеряет конверсию новых связей. Элементы в этом блоке должны выводиться на основе математической вероятности появления. Тогда перспективные элементы будут "всплывать", а элементы с низкой конверсией будут исключаться из выдачи. Но все элементы, хоть и редко, но будут показываться в блоке.
  • Вопрос задан
  • 149 просмотров
Подписаться 3 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега PHP
Web developer
Вам шашечки или ехать? Если это для диплома, то одно. А если для решения конкретной задачи, то другое.

Допустим, у вас интернет-магазин одежды и нужно показать "похожие товары". В этом случае проще хранить связи не между сотнями тысяч товаров, а между десятком категорий. Например, при покупке любой куртки предложить шапку, шарф и перчатки.
Для десятка связей обучение произойдет достаточно быстро. Пока оно происходит - используйте обычный rand() для выбора сопутствующей категории и выбирайте самый продаваемый товар в этой категории.
Для ускорения используйте "обучение с учителем", то есть сами (или наймите фрилансера) подберите связанные категории.

Потом можно будет улучшать дальше. Например, если куртка из среднего ценового диапазона (среди курток), то и шапку предлагать тоже из среднего ценового диапазона (среди шапок).
Ответ написан
SELECT * FROM elements ORDER BY conversion*RAND() DESC LIMIT 10

например, у элементов такие конверсии:
0.1
0.3
0.2
0.5

Каждая будет домножена на рандомное число. В итоге вероятность элемента будет зависеть от его конверсии.
Т.е. в данном примере максимальная вероятность будет у последнего элемента (0.5), который в результате запроса окажется на первой позиции.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы