Что лучше всего использовать для нахождения похожих пользователей?

Есть множество пользователей и все они могут выполнять различные транзакции в любой день. Для каждого дня мы имеем некий одномерный вектор данных и собственно для юзера по всех его днях - матрицу данных. У каждого юзера имеем свою матрицу данных. Для того что бы делать предсказание будущих действий решил искать наиболее похожие истории. Например: имеем юзера который в системе уже 30 дней и нового (скажем первые 5 дней). Идея такова - брать у первого его 5 дней (векторов данных) и сравнивать его с таким же количеством дней юзера для которого делаем прогноз. Итого получается сравниваем матрицу с i = 5 (и естественно с фиксированным j, т.е. количеством признаков) с такой же матрицей i = 5 (j = const) остальных юзеров. Максимальное значение и будет указывать на нужного пользователя для прогноза. Подскажите, какой алгоритм лучше всего подойдет для сравнения двух матриц что бы давал ответ от 0 до 1. Нужно ли нормализовать данные?

Я смотрю в сторону матриц сходства. Насколько хорошо это поможет в моем случае? Какие есть реализации Python мб уже готовые?


Ответы (1 шт):

Автор решения: passant

Пока ваш вопрос находится в кашеобразном состоянии. И соответственно, ответить на него можно, но это будет малосьедобная каша. Поэтому давайте разбираться.

Вопрос первый. Что значит в вашем понимание "прогноз"? Что вы прогнозируете? Один конкретный показатель или вы хотите предсказать полный j-мерный вектор поведения пользователя в шестой день по его матрице поведения за пять предыдущих дней?

Вопрос второй. Если речь идет о первых пяти днях отслеживания истории пользователя, то вообще-то говоря, корректно его сравнивать только с первыми пятью днями истории других пользователей. Логично предположить что с увеличением времени использования вашего сервиса происходит самообучение пользователя и его поведение в дальнейшем может существенно меняться. Т.е. его последовательное поведение - например, между 120 и 125 днями пользования сервисом существенно отличается от первых пяти дней.

Вопрос третий. В каких шкалах измерены значения вашего вектора? От ответа на этот вопрос зависит и выбор метрик (см.далее), и нормализация, да и сам алгоритм решения вашей задачи.

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

Вопрос пятый. Если у вас строго пять дней в рассмотрении, то на самом деле вы - скорее всего - можете сравнивать не матицу с матрицей, а два 5*j-мерных векторов между собой, что несомненно проще. Разумеется, это справедливо, если ваши данные не имеют привязки к распределению в пространстве или поведение в следующий день не зависит от поведения в предыдущий.

Вопрос шестой. Нужно-ли делать нормализацию значений зависит от ответов на вопросы три и четыре.

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

Ну вот. Пока, думаю, достаточно. Когда станут ясны ответы на эти вопросы можно будет думать и за алгоритм, и за библиотеки, в которых они реализованы.

→ Ссылка