Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Алогритм рекомендаций

1. Пользовательские параметры предпочтений по годам

Для вычисления центра и разброса года используются накопленные суммы:

$$ \mu = \frac{\sum_{R > 0} (R \cdot Y)}{\sum_{R > 0} R} $$

$$ \sigma_{user}^2 = \frac{\sum_{R > 0} (R \cdot Y^2)}{\sum_{R > 0} R} - \mu^2 $$

$$ \sigma^2 = \frac{N \cdot \sigma^2_{user} + m \cdot \sigma^2_{prior}}{N + m} $$

где:

  • $R$ — оценка пользователя.
  • $Y$ — год выпуска оцененного аниме.
  • $\mu$ — центр предпочтений по годам (взвешенное среднее).
  • $\sigma_{user}^2$ — дисперсия предпочтений пользователя («гибкость» вкуса по годам).
  • $N$ — количество положительных оценок.
  • $m$ — константа сглаживания (рекомендуется m = 5)
  • $\sigma^2_{prior}$ — априорная дисперсия годов (рекомендуемое значение: $9-25$, соответствует разбросу 3-5 лет).
  • $\sigma^2$ — итоговая дисперсия, используемая в формулах.

2. Вес жанра для пользователя

Чтобы учесть уверенность пользователя, общая сумма оценок умножается на логарифмический коэффициент количества оценок:

$$ W_g = \log_2(N_g + 1) \cdot \sum R_g $$

где:

  • $\sum R_g = S_g$ — простая сумма всех оценок, поставленных аниме этого жанра.
  • $N_g$ — количество оценок в этом жанре.
  • $W_g$ — итоговый вес жанра.

3. Годовой коэффициент для конкретного тайтла

$$ w_{year} = \exp\left(-\frac{(Y - \mu)^2}{2\sigma^2}\right) $$

где:

  • $Y$ — год выпуска рассматриваемого аниме.
  • $w_{year}$ — коэффициент близости года к предпочтениям.

4. Вектор предпочтений по студиям

$$ P_s = \sum_{a \in \text{Rated}, s \in \text{Studios}(a)} \frac{R_a}{|\text{Studios}(a)|}, $$

где:

  • $s$ $\in$ $Studios(a)$.
  • $P_s$ — накопленный вес предпочтения к студии $s$ (может быть отрицательным).
  • $R_a$ — оценка пользователя за аниме $a$.
  • $Studios(a)$ — студии, участвовавшие в создании аниме $a$.

5. Итоговый скор аниме

$$ \text{sim}(U, A) = \frac{U \cdot A}{\lVert U \rVert \lVert A \rVert} $$

$$ Score(a) = \text{sim}(U, A) \cdot w_{year} $$

где:

  • $U$ — пользовательский вектор жанров и студий.

  • $A$ — вектор аниме жарнов и студий.

  • $Score$ — финальная метрика релевантности аниме.


Если у вас есть идеи по улучшению этого алгоритма / сомнения в его работоспособности, я буду рад видеть вас в Discussions

Запуск проекта

  1. Установите зависимости для сервера и фронтенда:
npm install
npm --prefix server install
npm --prefix client install
  1. Настройте Yandex OAuth в server/.env на основе server/.env.example.

  2. Запустите сервис:

npm run dev
  1. Откройте в браузере:
  • фронтенд: http://localhost:5173
  • сервер: http://localhost:4000

About

Сервис рекомендаций аниме на основе личных оценок anisage.ru

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages