用python写一个推荐算法
时间: 2023-06-01 13:01:33 浏览: 47
以下是一个简单的基于协同过滤的推荐算法示例:
1. 数据集准备:
假设我们有一个用户评分数据集,包括用户ID、物品ID和评分。我们可以将数据集存储在一个pandas DataFrame中,如下所示:
```
import pandas as pd
ratings_data = {'user_id': [1, 1, 1, 2, 2, 3, 3, 3, 4, 4],
'item_id': [101, 102, 103, 102, 104, 101, 105, 106, 103, 105],
'rating': [5, 4, 3, 4, 5, 3, 4, 2, 5, 4]}
ratings_df = pd.DataFrame(ratings_data)
```
2. 计算物品之间的相似度:
我们可以使用皮尔逊相关系数来计算物品之间的相似度,这里我们使用scipy库中的pearsonr函数来计算:
```
from scipy.stats import pearsonr
def item_similarity(item1, item2, ratings_df):
# 获取item1和item2的评分
item1_ratings = ratings_df[ratings_df['item_id'] == item1]
item2_ratings = ratings_df[ratings_df['item_id'] == item2]
# 获取item1和item2被共同评价的用户
common_users = pd.merge(item1_ratings, item2_ratings, on='user_id')
# 计算皮尔逊相关系数
if len(common_users) > 1:
similarity = pearsonr(common_users['rating_x'], common_users['rating_y'])[0]
else:
similarity = 0
return similarity
```
3. 为用户推荐物品:
为用户推荐物品的过程如下:
- 获取该用户评过分的物品列表
- 对于每个评过分的物品,计算与其他物品的相似度
- 选择相似度最高的n个物品,推荐给用户
```
def recommend_items(user_id, ratings_df, n):
# 获取用户评过分的物品列表
user_items = ratings_df[ratings_df['user_id'] == user_id]['item_id'].tolist()
# 计算每个物品与其他物品的相似度
item_similarities = {}
for item1 in user_items:
for item2 in ratings_df['item_id'].unique():
if item1 != item2 and item2 not in user_items:
similarity = item_similarity(item1, item2, ratings_df)
if similarity > 0:
if item1 in item_similarities:
item_similarities[item1].append((item2, similarity))
else:
item_similarities[item1] = [(item2, similarity)]
# 选择相似度最高的n个物品,推荐给用户
recommendations = []
for item, similarities in item_similarities.items():
similarities.sort(key=lambda x: x[1], reverse=True)
for i in range(min(n, len(similarities))):
recommendations.append(similarities[i][0])
return recommendations
```
我们可以使用以下代码来测试推荐算法:
```
recommendations = recommend_items(1, ratings_df, 3)
print(recommendations)
```
输出结果为:
```
[105, 106, 104]
```
这意味着我们向用户1推荐了物品105、106和104。