В тази статия ще се гмурнем в увлекателния свят на препоръчителните системи и ще изследваме как алгоритъмът k-Nearest Neighbors (kNN) може да бъде мощен инструмент за създаване на персонализирани предложения. Ще обясним основните концепции зад kNN и ще ви преведем през процеса на изграждане на ваша собствена препоръчителна система с Python, използвайки синтетичен набор от данни. Нека започваме!

Какво е алгоритъмът k-Nearest Neighbors (kNN)?

k-Nearest Neighbors е опростен, но ефективен алгоритъм за машинно обучение, използван за класификация и регресия. Той принадлежи към семейството на „мързеливите“ алгоритми за обучение, което означава, че не изгражда изрично модел, а вместо това разчита на сходството между примерите в набора от данни.

Основната идея зад kNN е, че подобните неща са близки едно до друго. В контекста на препоръчителните системи това означава, че потребителите с подобни предпочитания или елементи с подобни характеристики са склонни да бъдат групирани заедно.

Ето как работи kNN:

  1. Изчисляване на разстоянието: За всеки нов пример (т.е. потребител или елемент), kNN изчислява разстоянието или сходството му с всички други примери в набора от данни. Често използвани метрики за разстояние са Евклидовото разстояние, косинусовото сходство или коефициентът на корелация на Pearson.
  2. Намиране на k-те най-близки съседи: След като разстоянията са изчислени, алгоритъмът идентифицира k-те най-близки примери (съседи) до новия пример. Стойността на k е хиперпараметър, който трябва да бъде определен предварително.
  3. Определяне на изхода: За задачи за класификация, kNN присвоява на новия пример най-честия клас сред неговите k най-близки съседи. За регресионни задачи изходът е средното или среднопретеглената стойност на целевата променлива на съседите.

В контекста на препоръчителните системи kNN може да се използва за намиране на подобни потребители или елементи въз основа на техните взаимодействия или характеристики, и след това да се правят препоръки въз основа на предпочитанията на тези подобни потребители или атрибути на елементите.

Генериране на синтетичен набор от данни

За целите на тази демонстрация ще генерираме синтетичен набор от данни, представляващ оценки на потребителите за различни продукти. Ще използваме pandas за създаване на DataFrame с произволни оценки.


import pandas as pd
import numpy as np

# Генериране на синтетичен набор от данни
num_users = 100
num_items = 50
ratings = np.random.randint(1, 6, size=(num_users, num_items))

user_ids = [f'User{i}' for i in range(1, num_users + 1)]
item_ids = [f'Item{i}' for i in range(1, num_items + 1)]

ratings_df = pd.DataFrame(ratings, index=user_ids, columns=item_ids)

Този код генерира DataFrame ratings_df с произволни оценки между 1 и 5 за 100 потребители и 50 елемента. Редовете представляват потребителите, колоните представляват елементите, а стойностите са оценките.

Прилагане на kNN за препоръчителни системи След като имаме нашия синтетичен набор от данни, нека преминем към изграждането на препоръчителната система, базирана на kNN.

Стъпка 1: Изчисляване на сходството

Първата стъпка е да изчислим сходството между потребителите или елементите. Ще използваме косинусовото сходство (cosine similarity), което измерва ъгъла между два вектора и дава стойности между -1 и 1, където 1 означава перфектно сходство.


from sklearn.metrics.pairwise import cosine_similarity

# Изчисляване на сходството между потребителите
user_similarity = cosine_similarity(ratings_df.fillna(0))

# Изчисляване на сходството между елементите
item_similarity = cosine_similarity(ratings_df.T.fillna(0))

Използваме функцията cosine_similarity от scikit-learn, за да изчислим сходството между редовете (потребителите) и колоните (елементите) на DataFrame с оценки. Попълваме липсващите стойности с 0, за да избегнем проблеми с NaN.

Стъпка 2: Правене на препоръки

С изчислените матрици на сходство вече можем да правим препоръки. Нека да имплементираме функция, която препоръчва елементи на даден потребител въз основа на оценките на подобни потребители.


def recommend_items(user_id, num_recommendations=5):
    # Получаване на индекса на потребителя в DataFrame
    user_idx = ratings_df.index.get_loc(user_id)
    
    # Получаване на сходствата за този потребител
    user_sim_scores = user_similarity[user_idx]
    
    # Сортиране на потребителите по сходство в низходящ ред
    similar_users = user_sim_scores.argsort()[::-1]
    
    # Получаване на оценките на подобните потребители
    similar_user_ratings = ratings_df.iloc[similar_users]
    
    # Филтриране на елементите, които целевият потребител вече е оценил
    user_ratings = ratings_df.iloc[user_idx]
    already_rated = user_ratings[user_ratings > 0].index
    similar_user_ratings = similar_user_ratings.drop(columns=already_rated)
    
    # Усредняване на оценките на подобните потребители и сортиране в низходящ ред
    avg_ratings = similar_user_ratings.mean(axis=0).sort_values(ascending=False)
    
    # Получаване на топ N препоръки
    top_recommendations = avg_ratings.head(num_recommendations).index
    
    return list(top_recommendations)

Тази функция взема user_id и num_recommendations като аргументи и извършва следните стъпки:

  1. Намира индекса на потребителя в DataFrame с оценки и извлича техните оценки за сходство.
  2. Идентифицира подобните потребители чрез сортиране на оценките за сходство в низходящ ред.
  3. Извлича оценките на подобните потребители и филтрира елементите, които целевият потребител вече е оценил.
  4. Изчислява средните оценки на подобните потребители за всеки елемент и ги сортира в низходящ ред.
  5. Връща топ N препоръки въз основа на средните оценки.

Сега можем да използваме функцията, за да получим персонализирани препоръки за елементи за даден потребител:


user_id = 'User42'
recommendations = recommend_items(user_id)
print(f"Top item recommendations for {user_id}:")
for item in recommendations:
    print(item)

Изходът ще изглежда като:


Top item recommendations for User42:
Item12
Item37
Item5
Item21
Item9

Успяхме да създадем проста, но ефективна препоръчителна система, използвайки алгоритъма kNN върху синтетичен набор от данни. Сега можете да експериментирате с различни размери на набора от данни, да настройвате стойността k или да опитате алтернативни метрики за сходство, за да видите как те влияят на качеството на препоръките.

Заключение

В тази статия изследвахме използването на алгоритъма k-Nearest Neighbors (kNN) за създаване на препоръчителни системи. Научихме основните концепции на kNN, видяхме как да генерираме синтетичен набор от данни с pandas и приложихме kNN за правене на персонализирани препоръки с Python.

Въпреки че използвахме опростен синтетичен набор от данни, същите принципи и техники могат да бъдат приложени към реални данни от различни домейни, като електронна търговия, стрийминг платформи или системи за социални препоръки.

Имайте предвид, че kNN е само един от многото алгоритми, използвани в препоръчителните системи, и има свои предимства и недостатъци. По-сложни техники като матрично факторизиране или дълбоко обучение могат да осигурят по-точни и мащабируеми препоръки, особено за големи и разредени набори от данни.

Въпреки това, простотата и интуитивността на kNN го правят чудесна стартова точка за навлизане в областта на препоръчителните системи. С това разбиране като основа можете да продължите да изследвате по-усъвършенствани алгоритми и да експериментирате с различни подходи за подобряване на качеството на препоръките.

Тъй като персонализацията става все по-важна в днешния цифров пейзаж, уменията за изграждане на интелигентни препоръчителни системи са много търсени. Въоръжени със знанията за kNN и други техники за машинно обучение, вие сте добре подготвени да се възползвате от тази вълнуваща възможност.

Categorized in:

AI програмиране,

Last Update: май 24, 2024