不到40行代码用Python实现一个简单的推荐系统

  • Post category:Python

不到40行代码用Python实现一个简单的推荐系统

推荐系统是一种常见的人工智能应用,它可以根据用户的历史行为和偏好,向用户推荐可能感兴趣的品。本文将介绍如何使用Python实现一个简单的推荐系统,该系统基于用户-物品评分矩阵,使用协同滤算法进行推荐。

1. 数据集

我们将使用MovieLens数据集来演示如何使用协同过滤算法进行推荐。数据集包含多个用户对多个电影的评分,评分范围为1到5。以下是数据集的示例:

用户ID 电影ID 评分
1 1 5
1 2 3
1 3 4
2 1 3
2 2 4
2 3 5
3 1 4
3 2 2
3 3 1

2. 协同过滤算法

协同过滤算法是一种基于用户或物品的推荐算法,它通过分析用户-物品评分矩阵,找到相似的用户或物品,并向用户推荐相似物品。具体实现步骤如下:

  1. 构建用户-物品评分矩阵。
  2. 计算用户之间或物品之间的相似度。
  3. 根据相似度,找到与目标用户或物品最相似的K个用户或物品。
  4. 根据K个用户或物品的评分,预测目标用户对目标物品的评分。

以下是协同过滤算法的Python实现:

import numpy as np

class CollaborativeFiltering:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X):
        self.X = X
        self.similarity = np.zeros((len(X), len(X)))
        for i in range(len(X)):
            for j in range(i+1, len(X)):
                mask = np.logical_and(X[i] > 0, X[j] > 0)
                if np.sum(mask) > 0:
                    self.similarity[i, j] = np.sum((X[i][mask] - X[j][mask])**2)
                    self.similarity[j, i] = self.similarity[i, j]
        self.neighbors = np.argsort(-self.similarity, axis=1)[:, :self.k]

    def predict(self, user_id, item_id):
        mask = self.X[:, item_id] > 0
        if np.sum(mask) == 0:
            return 0
        similarities = self.similarity[user_id, mask]
        indices = np.argsort(-similarities)[:self.k]
        weights = similarities[indices]
        ratings = self.X[indices, item_id]
        return np.sum(weights * ratings) / np.sum(weights)

这个代码实现了一个名为CollaborativeFiltering的类,它包含两个方法:

  • fit(X):用于训练协同过滤推荐器,其中X是一个二维数组,表示用户-物品评分矩阵。
  • predict(user_id, item_id):用于预测目标用户对目标物品的评分,其中user_id是目标用户的ID,item_id是目标物品的ID。

3. 示例

示例1

在示例1中,我们使用了MovieLens数据集,使用CollaborativeFiltering类对数据集进行推荐,并输出推荐结果。

import pandas as pd

ratings = pd.read_csv('ratings.csv')
X = ratings.pivot(index='userId', columns='movieId', values='rating').fillna(0).values

cf = CollaborativeFiltering(k=3)
cf.fit(X)

user_id = 1
item_id = 1
rating = cf.predict(user_id-1, item_id-1)
print(f'User {user_id} is likely to rate item {item_id} with a rating of {rating:.2f}')

这个示例将使用上述代码对MovieLens数据集进行推荐,并输出推荐结果。

示例2

在示例2中,我们使用了一个包含5个用户和5个物品的评分矩阵,使用CollaborativeFiltering类对评分矩阵进行推荐,并输出推荐结果。

X = np.array([
    [5, 3, 0, 1, 4],
    [1, 0, 5, 4, 2],
    [4, 2, 1, 3, 0],
    [0, 0, 4, 5, 1],
    [2, 4, 0, 0, 5],
])

cf = CollaborativeFiltering(k=2)
cf.fit(X)

user_id = 0
item_id = 2
rating = cf.predict(user_id, item_id)
print(f'User {user_id} is likely to rate item {item_id} with a rating of {rating:.2f}')

这个示例将使用上述代码对评分矩阵进行推荐,并推荐结果。