Майнор по Анализу Данных, Группа ИАД-2

24/05/2017 Рекомендательные системы

In [ ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (12,5)

# Для кириллицы на графиках
font = {'family': 'Verdana',
        'weight': 'normal'}
plt.rc('font', **font)

Коллаборативная фильтрация

Метод коллаборативной фильтрации работает по принципу похожести пользователей (User-based collaborative filtering) или похожести товаров (Item-based collaborative filtering).

Введем обозначения:

  • $R_{ui}$ - оценка, которую дал пользователь $u$ товару $i$
  • $\hat{R}_{ui}$ - прогноз оценки
  • $s_{uv}$ - похожесть между пользователями $u$ и $v$
  • $s_{ij}$ - похожесть между товарами $i$ и $j$
  • $N(u)$ - Множество пользователей, наиболее похожих на $u$
  • $N(i)$ - Множество товаров, наиболее похожих на $i$

Прогноз user-based collaborative filtering вычисляется по следующей формуле $$ \hat{R}_{ui} = \frac{\sum_{v \in N(u)} s_{uv} R_{vi}}{\sum_{v \in N(u)} s_{uv}} $$

Походесть между пользователями можно вычислить разными способами, например с помощью корреляции или косинусной меры $$ s_{uv} = \frac{R_u^T R_v}{\lVert R_u \rVert_2 \lVert R_v \rVert_2}$$ Стоит отметить, что при подсчете похожести должны учитываться только те товары, для которых и у $u$ и у $v$ есть какая-то оценка

Похожим образом делается оценка с помощью item-based collaborative filtering:

$$\hat{R}_{u i} = \frac{\sum_{j \in N(i)} s_{ij} R_{u j}}{\sum_{j \in N(i)} s_{ij}}$$

Рейтинги фильмов

  • Загрузите данные о рейтингах и фильмах
  • Разбейте данные на обучение и контроль в пропорции 80/20
  • Реализуйте функцию расчета попарных схожестей между пользователями
  • Реализуйте метод расчета рекомендаций на основе $K$ наиболее похожих пользователей. Постройте график зафисимости ошибки MAE от $K$ (1-10)
  • Выполните нормализацию рейтингов с помощью вычитания средней оценки $\bar{R}_u$ каждого из пользователей и повторите предыдущий 2 шага. В этом случае предсказание выполняется следующим образом $$ \hat{R}_{ui} = \bar{R}_u + \frac{\sum_{v \in N(u)} s_{uv} (R_{vi} - \bar{R}_v)}{\sum_{v \in N(u)} s_{uv}} $$
  • Перейдите к Item-Based подходу и повторите предыдущие шаги
In [ ]:
filepath = './data/user_ratedmovies.dat'
df_rates = pd.read_csv(filepath, sep='\t')
In [ ]:
filepath = './data/movies.dat'
df_movies = pd.read_csv(filepath, sep='\t')
In [ ]:
## Your Code Here
In [ ]: