推荐算法python实现_【推荐系统】基于用户的协同过滤算法(UserCF)的python实现...
时间: 2023-10-20 21:36:49 浏览: 167
基于用户的协同过滤推荐算法实现
好的,下面是基于用户的协同过滤算法(UserCF)的Python实现。
首先,我们需要导入必要的库,包括pandas和numpy:
```python
import pandas as pd
import numpy as np
```
接着,我们需要加载数据集。这里我们使用MovieLens 100k数据集,可以从以下链接下载:
https://grouplens.org/datasets/movielens/100k/
下载后,将数据集解压到当前目录下,并使用以下代码来加载数据:
```python
# 加载用户评分数据
ratings = pd.read_csv('ml-100k/u.data', sep='\t', names=['user_id', 'item_id', 'rating', 'timestamp'])
# 加载电影标题数据
movies = pd.read_csv('ml-100k/u.item', sep='|', encoding='latin-1', usecols=[0, 1], names=['item_id', 'title'])
```
接下来,我们需要将数据集划分为训练集和测试集。这里我们使用80%的数据作为训练集,20%的数据作为测试集:
```python
# 将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(ratings, test_size=0.2)
```
然后,我们需要构建用户-电影评分矩阵。这里我们使用pandas的pivot_table函数:
```python
# 构建用户-电影评分矩阵
user_item_matrix = train_data.pivot_table(index='user_id', columns='item_id', values='rating')
```
接着,我们需要计算用户之间的相似度。这里我们使用余弦相似度来计算用户相似度:
```python
# 计算用户相似度
from sklearn.metrics.pairwise import cosine_similarity
user_similarity = cosine_similarity(user_item_matrix)
```
然后,我们可以使用用户相似度来预测用户对电影的评分。具体来说,我们需要先找到用户的k个最相似的用户,然后使用这k个用户的评分来预测当前用户对电影的评分。这里我们使用k=10:
```python
# 预测用户对电影的评分
def predict(user_id, item_id):
# 找到用户的k个最相似的用户
similar_users = user_similarity[user_id-1].argsort()[:-10:-1]
# 计算这k个用户对电影的评分的加权平均值
similar_ratings = user_item_matrix.iloc[similar_users][item_id].dropna()
weights = user_similarity[user_id-1][similar_users][:len(similar_ratings)]
return np.dot(weights, similar_ratings) / weights.sum() if len(similar_ratings) > 0 else 0
```
最后,我们可以使用测试集来评估推荐算法的性能。具体来说,我们需要计算预测评分和实际评分之间的均方根误差(RMSE):
```python
# 评估推荐算法的性能
from sklearn.metrics import mean_squared_error
test_data['predicted_rating'] = test_data.apply(lambda x: predict(x['user_id'], x['item_id']), axis=1)
rmse = np.sqrt(mean_squared_error(test_data['rating'], test_data['predicted_rating']))
print('RMSE:', rmse)
```
完整的代码如下所示:
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics import mean_squared_error
# 加载用户评分数据
ratings = pd.read_csv('ml-100k/u.data', sep='\t', names=['user_id', 'item_id', 'rating', 'timestamp'])
# 加载电影标题数据
movies = pd.read_csv('ml-100k/u.item', sep='|', encoding='latin-1', usecols=[0, 1], names=['item_id', 'title'])
# 将数据集划分为训练集和测试集
train_data, test_data = train_test_split(ratings, test_size=0.2)
# 构建用户-电影评分矩阵
user_item_matrix = train_data.pivot_table(index='user_id', columns='item_id', values='rating')
# 计算用户相似度
user_similarity = cosine_similarity(user_item_matrix)
# 预测用户对电影的评分
def predict(user_id, item_id):
# 找到用户的k个最相似的用户
similar_users = user_similarity[user_id-1].argsort()[:-10:-1]
# 计算这k个用户对电影的评分的加权平均值
similar_ratings = user_item_matrix.iloc[similar_users][item_id].dropna()
weights = user_similarity[user_id-1][similar_users][:len(similar_ratings)]
return np.dot(weights, similar_ratings) / weights.sum() if len(similar_ratings) > 0 else 0
# 评估推荐算法的性能
test_data['predicted_rating'] = test_data.apply(lambda x: predict(x['user_id'], x['item_id']), axis=1)
rmse = np.sqrt(mean_squared_error(test_data['rating'], test_data['predicted_rating']))
print('RMSE:', rmse)
```
希望这个实现对你有所帮助!
阅读全文