响应式电影资讯网站,虚拟币挖矿网站开发,营销网站模板,vi设计 站酷目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示
import pandas as pd
import numpy as np# 读取CSV文… 目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示
import pandas as pd
import numpy as np# 读取CSV文件
data pd.read_csv(E:/recommended_s/Books.csv,headerNone,names[用户id,书籍id,rating ,timestamp])[:10000]
print(data.head(10))推荐算法的分类
基于相似度
Jaccard相似度通过计算两个用户喜好集合的交集元素数量与并集元素数量的比值来衡量相似度。余弦相似度将用户的喜好表示为向量通过计算两个向量的余弦值来衡量相似度。余弦相似度考虑了向量的方向和长度适用于处理偏好差异和权重差异的情况。皮尔逊相关系数通过计算两个用户喜好向量之间的协方差和标准差的比值来衡量相似度。皮尔逊相关系数可以衡量线性相关性适用于处理用户评分的情况。欧氏距离将用户的喜好表示为向量通过计算两个向量之间的欧氏距离来衡量相似度。欧氏距离衡量了向量之间的距离数值越小表示越相似。曼哈顿距离将用户的喜好表示为向量通过计算两个向量之间的曼哈顿距离来衡量相似度。曼哈顿距离衡量了向量之间的距离数值越小表示越相似。
基于流行度/上下文/社交网络
基于流行度的推荐推荐热门、流行的物品给用户。这种方法假设用户可能对热门物品感兴趣适用于新用户或缺乏个性化信息的情况。基于上下文的推荐考虑用户的上下文信息如时间、地点、设备等来进行推荐。根据用户当前的上下文环境推荐适合的物品。例如在早晨推荐早餐食谱在晚上推荐电影。基于社交网络的推荐利用用户在社交网络中的关系和交互信息进行推荐。例如根据用户的好友喜好进行推荐或者利用社交网络中的社区结构进行推荐。
Jaccard相似度
Jaccard相似度是一种用于比较两个集合相似程度的度量方法。它通过计算两个集合的交集元素数量与并集元素数量的比值来衡量它们的相似性。具体地给定两个集合A和BJaccard相似度可以通过以下公式计算J(A, B) |A ∩ B| / |A ∪ B|其中|A ∩ B|表示集合A和B的交集元素数量|A ∪ B|表示集合A和B的并集元素数量。Jaccard相似度的取值范围在0到1之间数值越接近1表示两个集合越相似数值越接近0表示两个集合越不相似。
分析数据的特点
低维对于产品只有书籍id没有关于书籍的其他内容比如内容属性等等。【当然也可以将书籍id进行拆解但是因为时间原因并没有细化】存在一对一和一对100的情况每个用户所看过的书籍数目不同且有较大差异。
可以考虑的方法
基于用户的协同过滤推荐算法由于数据中包含了用户对不同物品的评分记录可以基于用户之间的评分行为相似性来进行推荐。通过计算用户之间的相似度找到与目标用户兴趣相似的其他用户然后根据这些用户的评分记录推荐给目标用户可能感兴趣的物品。基于内容的推荐算法数据中的物品ID可以用于表示物品的内容特征如关键词、标签等。可以根据物品之间的内容相似性来进行推荐。通过计算物品之间的相似度找到与目标物品相似的其他物品然后推荐给用户。基于时间的推荐算法数据中的时间戳可以用于表示用户对物品的评分时间。可以根据时间的先后顺序推荐最近或最热门的物品给用户。例如可以推荐用户最近一段时间内热门的物品或者根据用户的历史评分记录预测用户未来可能感兴趣的物品。
计算方法优缺点
简单直观Jaccard相似度的计算方法简单明了易于理解和实现。【选择该算法的主要原因】不受数据规模影响Jaccard相似度只关注集合的共同元素数量而不考虑集合的大小因此不受数据规模的影响。适用于稀疏数据对于稀疏的用户-物品矩阵Jaccard相似度可以有效地衡量用户之间的喜好相似度。但Jaccard相似度只考虑了集合的共同元素而没有考虑元素之间的权重差异。
计算用户之间的Jaccard相似度
# 计算用户之间的Jaccard相似度
def Jaccard_similarity(user_id, data):user_data data[data[用户id] user_id]other_users data[data[用户id] ! user_id]# print(user_data)# print(other_users[用户id])other_users_idslist(set(other_users[用户id]))# print(other_users_ids)user_books set(user_data[书籍id])other_users_books other_users.groupby(用户id)[书籍id].apply(set).tolist()# print(###)# print(user_books)# print(other_users_books)i0similarities []for other_user_book in other_users_books:intersection user_books.intersection(other_user_book)union user_books.union(other_user_book)#print(len(intersection))Jaccard float(len(intersection)) / (len(union) 1e-8)user_id other_users_ids[i]ii1# if(Jaccard ! 0):# print(Jaccard)similarities.append((user_id, Jaccard))return similarities获取与给定最相似的10个用户
def get_similar_users(user_id, data, top_n10):similar_users Jaccard_similarity(user_id, data)# 根据相似度对similar_users列表进行降序排序找到最相似的用户similar_users.sort(keylambda x: x[1], reverseTrue)# print(similar_users)# 获取给定用户已经看过的书籍ID并将其存储在user_books集合中user_books set(data[data[用户id] user_id][书籍id])# print(%%%)# print(user_books)# 创建一个空列表用于存储推荐的书籍IDrecommended_books []# 遍历与给定用户最相似的前top_n个用户for other_user, _ in similar_users[:top_n]:# 获取当前相似用户喜欢的书籍ID并将其存储在other_user_books集合中other_user_books set(data[data[用户id] other_user][书籍id])# print(data[data[用户id] other_user])# 使用列表推导式从相似用户喜欢的书籍中筛选出给定用户没有看过的书籍将筛选出的书籍ID添加到recommended_books列表中recommended_books.extend([book for book in other_user_books if book not in user_books])# 返回前10个推荐的书籍ID列表return recommended_books[:10]对1713353的用户推荐10本书
# 对于用户id为1713353的用户推荐10本书
user_id 1713353
recommended_books get_similar_users(user_id, data)
# 输出推荐的书
for book in recommended_books:print(book)