python亲和性分析法推荐电影论文_亲和性分析——推荐电影

这段代码实现了一个基于用户评价的推荐系统。首先,从数据集中选择了前200位用户的偏好评价,然后计算每部电影被多少人喜欢。接着,使用Apriori算法找到频繁项集,即共同被多个用户喜欢的电影组合,并逐步增加项集的长度。最终,生成了不同长度的频繁项集,并用于生成推荐规则。
摘要由CSDN通过智能技术生成

#选择训练集200

ratings = all_ratings[all_ratings[‘UserID‘].isin(range(200))]#选出喜欢的数据

favorable_ratings = ratings[ratings[‘Favorable‘]]#将数记录成 一个用户对应多部 喜欢的电影

favorable_reviews_by_users = dict((k, frozenset(v.values)) for k, v in favorable_ratings.groupby("UserID")["MovieID"])#print(favorable_reviews_by_users)

len(favorable_reviews_by_users)#得到最后训练集的人数 199

#生成一个电影有多少人喜欢

num_favorable_by_movie = ratings[["MovieID", "Favorable"]].groupby("MovieID").sum()#print(num_favorable_by_movie)

num_favorable_by_movie.sort_values("Favorable", ascending=False)[:5]from collections importdefaultdictdeffind_frequent_itemsets(favorable_reviews_by_users, k_1_itemsets, min_support):

counts=defaultdict(int)for user, reviews infavorable_reviews_by_users.items():for itemset ink_1_itemsets.keys():ifitemset.issubset(reviews):for other_reviewed_movie in reviews -itemset:#用到了集合的特性 | 表示取与 解决了重复的问题(集合有去重的功能)

current_superset = itemset |frozenset((other_reviewed_movie,))

counts[current_superset]+= 1

return dict([(itemset, frequency) for itemset, frequency in counts.items() if frequency >=min_support])importsys

frequent_itemsets={}

min_support= 50

#print(type(frequent_itemsets)) dict#k=1

frequent_itemsets[1] = dict((frozenset((movie_id,)), row["Favorable"])for movie_id, row innum_favorable_by_movie.iterrows()if row["Favorable"] >min_support)#print(frequent_itemsets)#exit()

print("There are {} movies with more than {} favorable reviews".format(len(frequent_itemsets[1]), min_support))

sys.stdout.flush()

# 通过循环,求出了所有情况for k in range(2, 20):#k代表每个数据集中 值得推荐电影总共得个数,看看结果就懂了

#得到结果

cur_frequent_itemsets = find_frequent_itemsets(favorable_reviews_by_users, frequent_itemsets[k-1],

min_support)if len(cur_frequent_itemsets) ==0:print("Did not find any frequent itemsets of length {}".format(k))

sys.stdout.flush()break

else:print("I found {} frequent itemsets of length {}".format(len(cur_frequent_itemsets), k))#print(cur_frequent_itemsets)

sys.stdout.flush()

frequent_itemsets[k]=cur_frequent_itemsets#去除个数为1 的,这样的数据没办法推荐

del frequent_itemsets[1]print(frequent_itemsets[9])

There are 20 movies with more than 50 favorable reviews

I found 145 frequent itemsets of length 2

I found 508 frequent itemsets of length 3

I found 989 frequent itemsets of length 4

I found 1146 frequent itemsets of length 5

I found 811 frequent itemsets of length 6

I found 338 frequent itemsets of length 7

I found 73 frequent itemsets of length 8

I found 5 frequent itemsets of length 9

Did not find any frequent itemsets of length 10

{frozenset({260, 356, 2571, 2028, 1196, 1198, 593, 1210, 858}): 72, frozenset({260, 356, 296, 2571, 1198, 47, 527, 593, 318}): 72, frozenset

({260, 296, 2571, 2028, 1196, 1198, 593, 1210, 858}): 72, frozenset({260, 356, 296, 2571, 1198, 527, 593, 858, 318}): 81, frozenset({260, 356

, 296, 2571, 1196, 593, 1210, 858, 318}): 72}

--------------------------

上面得到了频繁项集,下面来生成规则。规则由前提和结论组成。

#现在创建一个列表,

candidate_rules =[]for itemset_length, itemset_counts infrequent_itemsets.items():for itemset initemset_counts.keys():for conclusion initemset:

premise= itemset -set((conclusion,)) # 减号为集合itemset除去conclusion之后得

candidate_rules.append((premise, conclusion))print("There are {} candidate rules".format(len(candidate_rules)))

创建规则成功,只是conclusion只有一个电影推荐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值