Top-N推荐

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)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值