python基于用户的协同过滤算法做推荐的代码
时间: 2023-09-16 12:09:14 浏览: 109
基于用户的协同过滤推荐算法代码
5星 · 资源好评率100%
基于用户的协同过滤算法是一种常见的推荐算法,可以根据用户的历史行为数据,找到和他们具有相似兴趣爱好的其他用户,并向他们推荐他们可能喜欢的物品。下面是一个简单的Python实现,假设我们已经有一个用户物品矩阵data,其中每一行代表一个用户,每一列代表一件物品,矩阵中的每个元素表示用户对物品的打分情况(如果用户没有对该物品进行评分,则为0)。
```python
import numpy as np
# 基于用户的协同过滤算法
class UserCF:
def __init__(self, data):
self.data = data
self.users_num, self.items_num = data.shape
# 计算用户相似度
def similarity(self):
self.sim_matrix = np.zeros((self.users_num, self.users_num))
for i in range(self.users_num):
for j in range(i+1, self.users_num):
mask = np.logical_and(self.data[i, :] > 0, self.data[j, :] > 0)
if np.sum(mask) > 0:
self.sim_matrix[i, j] = np.corrcoef(self.data[i, mask], self.data[j, mask])[0, 1]
self.sim_matrix[j, i] = self.sim_matrix[i, j]
# 预测用户对物品的评分
def predict(self, user_index, item_index):
if self.data[user_index, item_index] > 0:
return self.data[user_index, item_index]
sim_sum = 0
sim_weighted_sum = 0
for i in range(self.users_num):
if i == user_index or self.data[i, item_index] == 0:
continue
sim = self.sim_matrix[user_index, i]
if sim > 0:
sim_sum += sim
sim_weighted_sum += sim * self.data[i, item_index]
if sim_sum > 0:
return sim_weighted_sum / sim_sum
else:
return 0
```
在上面的代码中,我们首先定义了一个UserCF类,其中包含了计算用户相似度和预测用户评分的方法。在计算用户相似度时,我们使用皮尔逊相关系数来度量用户之间的相似度。在预测用户评分时,我们首先判断用户是否已经对该物品评分过,如果是,则直接返回该评分,否则,根据用户相似度和其他用户对该物品的评分来预测该用户对该物品的评分。
下面是一个简单的例子,演示如何使用上面的代码来预测用户对物品的评分:
```python
# 构造用户物品矩阵
data = np.array([
[5, 3, 0, 1],
[4, 0, 4, 1],
[1, 1, 0, 5],
[0, 0, 4, 4],
[0, 1, 5, 4],
])
# 初始化UserCF模型
model = UserCF(data)
# 计算用户相似度矩阵
model.similarity()
# 预测用户对物品的评分
print("用户1对物品3的评分预测值为:", model.predict(0, 2))
```
在上面的代码中,我们首先构造了一个5x4的用户物品矩阵,其中每个元素表示用户对物品的评分情况(如果用户没有对该物品进行评分,则为0)。然后,我们初始化了一个UserCF模型,并计算了用户相似度矩阵。最后,我们使用模型来预测用户1对物品3的评分预测值。
阅读全文