Изменить: следующее работало для меня, потому что у меня были неявные оценки отзывов и было интересно только ранжировать продукты для нового пользователя. Подробнее здесь
Фактически вы можете получать прогнозы для новых пользователей с использованием обученной модели (без обновления):
Чтобы получить прогнозы для пользователь в модели, вы используете его скрытое представление (вектор u размера f (количество факторов)), который умножается на матрицу скрытого фактора произведения (матрица, сделанная из скрытых представлений всех продуктов, куча векторов размера f ) и дает вам оценку для каждого продукта. Для новых пользователей проблема заключается в том, что у вас нет доступа к их скрытому представлению (у вас есть только полное представление размера M (количество разных продуктов), но то, что вы можете сделать, это использовать функцию подобия для вычисления аналогичного скрытого представление для этого нового пользователя путем умножения его на транспонирование матрицы продукта.
, т. е. если пользовательская латентная матрица равна u, а ваша скрытая матрица продукта v, для пользователя i в модели, вы получаете оценки по do: u_i * v для нового пользователя, у вас нет скрытого представления, поэтому возьмите полное представление full_u и сделайте: full_u * v ^ t * v Это приблизит скрытые факторы для новых пользователей и даст разумные рекомендации (если модель уже дает разумные рекомендации для существующих пользователей)
Чтобы ответить на вопрос о обучении, это позволяет вам вычислять прогнозы для новых пользователей без необходимости выполнять тяжелое вычисление модели, которую вы теперь можете сделать только время от времени. Таким образом, у вас есть пакетный процесс в ночное время и все еще может сделать прогноз для нового пользователя в течение дня.
Примечание: MLLIB дает вам доступ к матрице u и v
РЕДАКТИРОВАТЬ: Используйте and_
из sqlalchemy
, чтобы объединить join
условия
from sqlalchemy import and_
skills = db.session.query(Skill, User_Skill.skill_id).\
outerjoin(User_Skill, and_(User_Skill.skill_id==Skill.id,
User_Skill.user_id==4)).\
order_by(Skill.name).all()
<час> Старый, неправильный ответ (разные результаты):
[ 118] Используйте.filter
, чтобы ограничить ваши результаты. Измените ваш запрос на:
skills = db.session.query(Skill, User_Skill.skill_id).\
outerjoin(User_Skill, User_Skill.skill_id==Skill.id).\
filter(User_Skill.user_id==4).\
order_by(Skill.name).all()