不到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. 协同过滤算法
协同过滤算法是一种基于用户或物品的推荐算法,它通过分析用户-物品评分矩阵,找到相似的用户或物品,并向用户推荐相似物品。具体实现步骤如下:
- 构建用户-物品评分矩阵。
- 计算用户之间或物品之间的相似度。
- 根据相似度,找到与目标用户或物品最相似的K个用户或物品。
- 根据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}')
这个示例将使用上述代码对评分矩阵进行推荐,并推荐结果。