协同过滤推荐算法python
时间: 2023-06-22 19:31:14 浏览: 63
协同过滤推荐算法是一种常用的推荐算法,它基于用户历史行为数据或物品属性数据,计算出用户对物品的偏好度或者物品之间的相似度,从而实现推荐。在Python中,可以使用Surprise库来实现协同过滤推荐算法。下面是一个简单的例子:
首先,安装Surprise库:
```python
!pip install surprise
```
然后,导入库并加载数据:
```python
from surprise import Dataset
from surprise import KNNBasic
from surprise.model_selection import cross_validate
# 加载数据
data = Dataset.load_builtin('ml-100k')
```
接下来,使用KNN基础算法来训练模型并进行预测:
```python
# 使用KNN基础算法
algo = KNNBasic()
# 交叉验证
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
# 训练模型并进行预测
trainset = data.build_full_trainset()
algo.fit(trainset)
# 预测用户对物品的评分
uid = str(196)
iid = str(302)
pred = algo.predict(uid, iid, verbose=True)
```
以上就是一个简单的协同过滤推荐算法的Python实现。
相关问题
协同过滤推荐算法python实现
以下是基于物品的协同过滤推荐算法的Python实现:
```python
import numpy as np
# 创建一个用户-物品评分矩阵
ratings = np.array([[4, 0, 2, 0, 1],
[0, 2, 3, 0, 0],
[1, 0, 2, 4, 0],
[5, 0, 0, 3, 1],
[0, 0, 1, 5, 1]])
# 计算物品之间的相似度
def item_similarity(ratings):
# 计算物品之间的余弦相似度
sim = ratings.T.dot(ratings) / (np.sqrt(np.sum(ratings.T ** 2, axis=1)).reshape(-1, 1) * np.sqrt(np.sum(ratings ** 2, axis=1)))
return sim
# 预测目标用户对物品的评分
def predict(ratings, sim):
# 计算每个物品的平均评分
mean_ratings = np.sum(ratings, axis=0) / np.sum(ratings != 0, axis=0)
# 计算预测评分
pred = np.zeros(ratings.shape)
for i in range(ratings.shape[0]):
for j in range(ratings.shape[1]):
if ratings[i, j] == 0:
pred[i, j] = np.sum(sim[j, :] * (ratings[i, :] - mean_ratings) * (ratings[:, j] != 0)) / np.sum(np.abs(sim[j, :] * (ratings[:, j] != 0)))
return pred
# 测试
sim = item_similarity(ratings)
pred = predict(ratings, sim)
print(pred)
```
以上代码实现了一个简单的基于物品的协同过滤推荐算法,其中`ratings`是一个用户-物品评分矩阵,每行代表一个用户,每列代表一个物品,矩阵中的元素是用户对物品的评分。`item_similarity`函数计算物品之间的相似度,这里使用的是余弦相似度。`predict`函数预测目标用户对物品的评分,其中使用了加权平均的方法,权重是物品之间的相似度。
基于物品协同过滤推荐算法python
物品协同过滤推荐算法是一种基于物品相似度的推荐算法,它通过计算物品之间的相似度来为用户提供个性化推荐。下面是一个基于Python的物品协同过滤推荐算法的示例代码:
```python
import numpy as np
# 创建数据集
data = np.array([
[5, 3, 0, 1],
[4, 0, 4, 1],
[1, 1, 0, 5],
[1, 0, 1, 4],
[0, 1, 5, 4]
])
# 计算物品相似度
def similarity(item1, item2):
# 余弦相似度
return np.dot(item1, item2) / (np.linalg.norm(item1) * np.linalg.norm(item2))
n_items = data.shape[1] # 物品数量
item_sim = np.zeros((n_items, n_items)) # 物品相似度矩阵
for i in range(n_items):
for j in range(i+1, n_items):
item_sim[i][j] = similarity(data[:,i], data[:,j])
item_sim[j][i] = item_sim[i][j]
# 根据相似度为用户推荐物品
def recommend(user_id, data, item_sim):
user_items = data[user_id] # 用户已经评分的物品
scores = np.zeros(n_items) # 所有物品的得分
for i in range(n_items):
if user_items[i] == 0: # 如果用户没有评分该物品
for j in range(n_items):
if data[j][i] != 0: # 如果物品被其他用户评分过
scores[i] += data[j][i] * item_sim[i][j]
return np.argsort(-scores) # 按得分降序排序
# 测试推荐算法
user_id = 0
recommendations = recommend(user_id, data, item_sim)
print("为用户 %d 推荐的物品:" % user_id)
print(recommendations)
```
上面的代码中,我们首先创建了一个包含5个用户对4个物品评分的数据集,然后计算了物品之间的相似度。接着,我们定义了一个`recommend`函数来为用户推荐物品,该函数的实现是:对于用户没有评分过的每个物品,计算它与已经评分过的物品的相似度加权得分,最后按得分降序排序并返回。最后,我们测试了推荐算法,并输出了为用户0推荐的物品列表。
需要注意的是,这只是一个简单的示例代码,实际应用中需要考虑更多的因素,例如:如何处理缺失值、如何处理稀疏矩阵、如何优化计算等等。