Pull to refresh

Comments 3

UFO just landed and posted this here

Складывается ощущение, что библиотека создана для одного конкретного примера. Сама статья просто перевод странички Getting Started из документации. Как адаптировать библиотеку под свой пример не понятно. Конечно можно заглянуть в исходники на GitHub, но зачем тогда такая библиотека нужна?

Теперь мы можем получить персонализированные рекомендации для конкретного пользователя. Для этого выберем случайного пользователя и получим рекомендации.

# Получаем топ N рекомендаций для пользователя
top_n = model.get_top_n(predictions, n=10, user=user_id)

Вы если и копируете из официального мануала, то делайте это нормально. Впечатление о вашей "образовательной" организации портится после таких моментов.

Если воспользоваться вашим приведенным фрагментом кода, то можно сперва не понять откуда у вас вообще берется метод "get_top_n", а затем еще и обнаружить, что такого "метода" не существует у модели.

Ответ кроется в том, что это не метод, а дополнительно прописанная функция.

Вот верный вариант кода из того же мануала:

from collections import defaultdict

from surprise import Dataset, SVD


def get_top_n(predictions, n=10):
    """Return the top-N recommendation for each user from a set of predictions.

    Args:
        predictions(list of Prediction objects): The list of predictions, as
            returned by the test method of an algorithm.
        n(int): The number of recommendation to output for each user. Default
            is 10.

    Returns:
    A dict where keys are user (raw) ids and values are lists of tuples:
        [(raw item id, rating estimation), ...] of size n.
    """

    # First map the predictions to each user.
    top_n = defaultdict(list)
    for uid, iid, true_r, est, _ in predictions:
        top_n[uid].append((iid, est))

    # Then sort the predictions for each user and retrieve the k highest ones.
    for uid, user_ratings in top_n.items():
        user_ratings.sort(key=lambda x: x[1], reverse=True)
        top_n[uid] = user_ratings[:n]

    return top_n

и только затем можно вызвать функцию:

top_n = get_top_n(predictions, n=10)

Sign up to leave a comment.