Вместо совместной фильтрации я бы использовал подход матричной факторизации, при котором пользователи и фильмы одинаково представлены векторами скрытых признаков, точечные продукты которых дают оценки. Обычно просто выбирают ранг (число признаков), независимо от того, что представляют признаки, а алгоритм делает все остальное. Как и в случае с PCA, результат не сразу интерпретируется, но дает хорошие результаты. Что вы хотите сделать, так это расширить матрицу фильма, чтобы включить в нее упомянутые вами дополнительные функции, и убедиться, что они остаются фиксированными, поскольку алгоритм оценивает две матрицы с помощью регуляризации. Соответствующие записи в пользовательской матрице будут инициализированы случайным образом, а затем оценены алгоритмом факторизации матрицы. Это универсальный и эффективный подход, но он требует некоторого понимания машинного обучения,
Некоторое время назад я видел хороший блокнот на ipython, но сейчас не могу его найти, поэтому я отсылаю вас к другому, который, хотя и не так хорош, все же проясняет некоторые математические вопросы.