import pandas as pd
from pandas import DataFrame
# from sklearn.metrics import jaccard_similarity_score
from sklearn.metrics.pairwise import pairwise_distances
import numpy as np
users = ["User1","User2","User3","User4","User5"]
items = ["Item1","Item2","Item3","Item4","Item5"]
#购买记录
dataset = [
[1,0,1,1,0],
[1,0,0,1,1],
[1,0,1,0,0],
[0,1,0,1,1],
[1,1,1,0,1]
]
df = pd.DataFrame(dataset,columns=items,index=users)
print(df)
#基于用户的协同过滤
#1.计算用户相似度
user_semilar = 1-pairwise_distances(df.values,metric="jaccard")
user_semilar = pd.DataFrame(user_semilar,columns=users,index=users)
# print(user_semilar)
#2.top_n排序
topN_users = {}
for i in user_semilar.index:
#取出每一行数据,删除自己,按照相似度排序
_df = user_semilar.loc[i].drop([i])
_df_sorted = _df.sort_values(ascending=False)
top2 = list(_df_sorted.index[:2])
topN_users[i] = top2
# print(topN_users)
#3.构建推荐结果
results = {}
for user,sim_users in topN_users.items():
# print(sim_users)
result = set()
for sim_user in sim_users:
# print(df.loc[sim_user])
result = result.union(set(df.loc[sim_user].replace(0,np.nan).dropna().index))
#过滤掉已经购买过的商品
result -= set(df.loc[user].replace(0,np.nan).dropna().index)
results[user] = result
print(results)
#基于物品的协同过滤
#1.计算物品相似度
items_similar = 1-pairwise_distances(df.T.values,metric="jaccard")
items_similar = pd.DataFrame(items_similar,index=items,columns=items)
# print(items_similar)
#2.top_n排序
topN_items = {}
for i in items_similar.index:
#取出每一行数据,删除自己,按照相似度排序
_df = items_similar.loc[i].drop([i])
_df_sorted = _df.sort_values(ascending=False)
top2 = list(_df_sorted.index[:2])
topN_items[i] = top2
# print(topN_items)
#3.推荐结果
results = {}
for user in df.index:
result = set()
u_items = set(df.loc[user].replace(0, np.nan).dropna().index)
# print(u_items)
for u_item in u_items:
result = result.union(set(topN_items[u_item]))
# print(result)
#过滤掉自己
result -= u_items
# print(result)
results[user] = result
print(results)
Top-N推荐
最新推荐文章于 2023-07-18 22:25:41 发布