十三、基于用户的产品推荐根据用户的特征找到相似的用户,并且把相似用户的喜爱产品推荐给当前用户,例如,客户A和客户B相似,则将客户A所购买过的产品推荐给客户B,反之亦然。本题中使用的数据存放在两个数据文件中。文件UserInfo.csv中存放的是用户的基本信息,根据用户的基本信息计算用户相似度;文件userFavorit.csv中存放的是用户喜爱的产品,可以推荐给相似的用户。 (1)正确导入模块 (2)欧氏距离相似度公式 (3)读取数据,并对数据预处理 (5)计算欧式距离相似度 (6)基于用户的推荐(7)获得推荐物品列表(8)将推荐结果保存到recommend.txt中
时间: 2024-02-01 19:13:39 浏览: 218
以下是代码实现:
(1)正确导入模块
```python
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
```
(2)欧氏距离相似度公式
```python
def sim_euclidean(x, y):
distance = euclidean_distances(x, y)
similarity = 1/(1+distance)
return similarity
```
(3)读取数据,并对数据预处理
```python
# 读取用户基本信息
user_info = pd.read_csv('UserInfo.csv')
# 将用户ID设为索引
user_info.set_index('UserID', inplace=True)
# 读取用户喜爱的产品
user_favorit = pd.read_csv('userFavorit.csv')
# 将用户ID设为索引
user_favorit.set_index('UserID', inplace=True)
# 数据预处理:填充缺失值,删除重复项
user_info.fillna(value=0, inplace=True)
user_info.drop_duplicates(inplace=True)
user_favorit.fillna(value=0, inplace=True)
user_favorit.drop_duplicates(inplace=True)
```
(5)计算欧式距离相似度
```python
# 计算欧式距离相似度
similarity_matrix = sim_euclidean(user_info.values, user_info.values)
```
(6)基于用户的推荐
```python
# 基于用户的推荐
def user_based_recommendation(user_id, k):
# 获取用户相似度
sim_scores = list(enumerate(similarity_matrix[user_id]))
# 根据相似度排序
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# 取出相似度最高的k个用户
top_k_users = [i[0] for i in sim_scores[1:k+1]]
# 获取这k个用户喜爱的产品
top_k_user_favorit = user_favorit.loc[top_k_users]
# 将这k个用户喜爱的产品合并起来
combined_products = top_k_user_favorit.sum(axis=0)
# 删除当前用户已经购买过的产品
user_products = user_favorit.loc[user_id]
for product in user_products.index:
if user_products.loc[product] > 0:
combined_products.drop(product, inplace=True)
# 根据得分排序,返回前n个推荐产品
recommended_products = combined_products.sort_values(ascending=False)[:n].index.tolist()
return recommended_products
```
(7)获得推荐物品列表
```python
# 获得推荐物品列表
user_id = 1
k = 5
n = 10
recommended_products = user_based_recommendation(user_id, k)
print('为用户%s推荐的产品有:' % user_id)
for i, product in enumerate(recommended_products):
print('%d. %s' % (i+1, product))
```
(8)将推荐结果保存到recommend.txt中
```python
# 将推荐结果保存到recommend.txt中
with open('recommend.txt', 'w') as f:
f.write('为用户%s推荐的产品有:\n' % user_id)
for i, product in enumerate(recommended_products):
f.write('%d. %s\n' % (i+1, product))
```