Нашли ошибку?

Рекомендации книг по похожим читателям

СложнаяРеализацияГлава 10

#k ближайших соседей#косинусное сходство#хеш-таблицы#рекомендацииid: ga-book-recommend

Оценки читателей хранятся так: ratings[читатель][книга] = оценка (от 1 до 5). Напишите recommend(ratings, user, k): функция рекомендует читателю user книги по оценкам похожих на него читателей.

Правила

  1. Сходство двух читателей — косинусное сходство их оценок, но только по книгам, которые оценили оба: Σ aᵢ·bᵢ / (√Σ aᵢ² · √Σ bᵢ²). Если общих книг нет — 0.
  2. Соседи — k других читателей с наибольшим сходством. Читатели со сходством 0 соседями не считаются. При равном сходстве выбирается тот, чьё имя меньше по алфавиту.
  3. Кандидаты — книги, которые оценил хотя бы один сосед, но не оценил user. Оценка кандидата — среднее оценок соседей, которые его читали.
  4. Ответ — названия кандидатов по убыванию оценки, при равенстве — по алфавиту.
  5. Если user нет в ratings или рекомендовать нечего, ответ — [].

Пример

ratings = {
    "Аня":   {"Дюна": 5, "Солярис": 4, "Пикник": 1},
    "Боря":  {"Дюна": 5, "Солярис": 5, "Гиперион": 4},
    "Вика":  {"Дюна": 1, "Пикник": 5, "Мастер": 5},
    "Гоша":  {"Солярис": 4, "Гиперион": 2, "Мастер": 3},
}
recommend(ratings, "Аня", 2)   # ["Гиперион", "Мастер"]

Решение

def recommend(ratings: dict[str, dict[str, float]], user: str, k: int) -> list[str]:
    """Книги для user по оценкам k самых похожих читателей (косинусное сходство)."""
    # ваш код
    raise NotImplementedError

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 book_recommend.py — тесты те же, результат покажет ✓ / ✗ и итог.