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