基于协同过滤的推荐算法代码
时间: 2023-10-04 21:14:14 浏览: 103
这里提供一个基于协同过滤的推荐算法的伪代码:
1. 加载数据集,并对数据进行处理,如去重、转换等。
2. 选取一个评价指标,如RMSE、MAE等。
3. 将数据集分为训练集和测试集。
4. 根据训练集,计算用户之间的相似度,可以使用余弦相似度、皮尔逊相关系数等方法。
5. 对于每个用户,找出其相似度最高的K个用户,构建K个邻居集合。
6. 针对每个用户,预测其未评分的物品的评分值,可以使用加权平均、加权和等方法。
7. 将预测值与测试集中的真实值进行比较,计算评价指标。
8. 不断调整参数K和评价指标,直到得到最佳的预测结果。
下面是一个Python实现的协同过滤推荐算法的代码示例:
```python
import numpy as np
# 加载数据集,返回用户-物品评分矩阵
def load_data(filename):
data = []
with open(filename, 'r') as f:
for line in f:
user, item, rating = line.strip().split(',')
data.append((int(user), int(item), float(rating)))
# 转换成矩阵形式
data = np.array(data)
row = np.max(data[:, 0]) + 1
col = np.max(data[:, 1]) + 1
mat = np.zeros((row, col))
for user, item, rating in data:
mat[user][item] = rating
return mat
# 计算余弦相似度
def cosine_sim(vec1, vec2):
return np.dot(vec1, vec2) / (np.sqrt(np.sum(vec1 ** 2)) * np.sqrt(np.sum(vec2 ** 2)))
# 计算皮尔逊相关系数
def pearson_sim(vec1, vec2):
vec1 = vec1 - np.mean(vec1)
vec2 = vec2 - np.mean(vec2)
return np.dot(vec1, vec2) / (np.sqrt(np.sum(vec1 ** 2)) * np.sqrt(np.sum(vec2 ** 2)))
# 找出相似度最高的K个用户
def find_k_nearest_neighbors(mat, user_id, k, sim_func):
sims = []
for i in range(mat.shape[0]):
if i != user_id:
sim = sim_func(mat[user_id], mat[i])
sims.append((i, sim))
sims.sort(key=lambda x: x[1], reverse=True)
return sims[:k]
# 预测用户对物品的评分值
def predict(mat, user_id, item_id, k, sim_func):
neighbors = find_k_nearest_neighbors(mat, user_id, k, sim_func)
numerator, denominator = 0.0, 0.0
for neighbor_id, sim in neighbors:
if mat[neighbor_id][item_id] != 0:
numerator += sim * mat[neighbor_id][item_id]
denominator += sim
if denominator == 0:
return 0
else:
return numerator / denominator
# 计算RMSE
def rmse(pred, actual):
return np.sqrt(np.mean((pred - actual) ** 2))
# 主函数
if __name__ == '__main__':
# 加载数据集
mat = load_data('ratings.csv')
# 将数据集分为训练集和测试集
train_mask = np.random.choice([True, False], size=mat.shape, p=[0.8, 0.2])
train_data = np.zeros(mat.shape)
test_data = np.zeros(mat.shape)
train_data[train_mask] = mat[train_mask]
test_data[~train_mask] = mat[~train_mask]
# 计算RMSE
k = 10
sim_func = cosine_sim
pred_data = np.zeros(mat.shape)
for user in range(mat.shape[0]):
for item in range(mat.shape[1]):
if train_data[user][item] == 0:
pred_data[user][item] = predict(train_data, user, item, k, sim_func)
rmse_value = rmse(pred_data[test_data != 0], test_data[test_data != 0])
print('RMSE:', rmse_value)
```
上述代码中使用的数据集为MovieLens数据集中的ratings.csv文件,包含用户对电影的评分数据。代码中将数据集分为训练集和测试集,使用余弦相似度计算用户之间的相似度,对于每个用户,预测其未评分的电影的评分值,最后计算RMSE评价指标。
阅读全文