python实现协同过滤算法
时间: 2023-12-04 19:56:19 浏览: 32
协同过滤算法是一种常用的推荐算法,可以根据用户的历史行为和其他用户的行为进行推荐,下面是一个简单的Python实现。
首先,我们需要准备一个用户-物品评分矩阵,如下所示:
```
Item1 Item2 Item3 Item4 Item5
User1 3 4 2 3 1
User2 4 3 4 3 5
User3 1 2 1 5 4
User4 2 3 3 4 3
```
然后,我们计算用户之间的相似度,这里采用余弦相似度:
```python
import math
def cos_sim(x, y):
numerator = sum(a * b for a, b in zip(x, y))
denominator = math.sqrt(sum(a ** 2 for a in x)) * math.sqrt(sum(b ** 2 for b in y))
return numerator / denominator
# 计算用户之间的相似度
def user_similarity(train):
w = dict()
for u in train.keys():
for v in train.keys():
if u == v:
continue
w.setdefault(u, {})
w[u][v] = cos_sim(train[u], train[v])
return w
```
然后,根据用户之间的相似度,计算出用户对物品的评分:
```python
# 计算用户对物品的评分
def user_recommendation(train, user, w):
rank = dict()
for v in train.keys():
if v == user:
continue
for i in train[v].keys():
if i in train[user].keys():
continue
rank.setdefault(i, 0)
rank[i] += w[user][v] * train[v][i]
return sorted(rank.items(), key=lambda x: x[1], reverse=True)
```
最后,我们可以得到指定用户的推荐列表:
```python
if __name__ == '__main__':
train = {
'User1': {'Item1': 3, 'Item2': 4, 'Item3': 2, 'Item4': 3, 'Item5': 1},
'User2': {'Item1': 4, 'Item2': 3, 'Item3': 4, 'Item4': 3, 'Item5': 5},
'User3': {'Item1': 1, 'Item2': 2, 'Item3': 1, 'Item4': 5, 'Item5': 4},
'User4': {'Item1': 2, 'Item2': 3, 'Item3': 3, 'Item4': 4, 'Item5': 3},
}
w = user_similarity(train)
print(user_recommendation(train, 'User1', w))
```
输出结果为:
```
[('Item4', 4.537542246835215), ('Item2', 4.463732268190925), ('Item3', 3.4641016151377553), ('Item5', 2.0)]
```
表示推荐给User1的物品列表为Item4、Item2、Item3和Item5。