数据源
第一章我们介绍了最基础的亲和性分析,尝试了所有的规则计算了所有的置信度和支持度,但是这个方法效率不高而且我们使用的数据集只有5种商品,但是实际生活中即使是小商店的商品也会超过百种,而网店商品的种类则可能更多,依旧使用第一章的亲和性分析,那么随着商品数量的增加,计算量和计算的时间也会急剧增加,所以需要一个聪明的算法来解决这个问题
Apriori算法
Apriori算法诗一个景点的亲和性分析算法,他只从数据集中频繁出现的商品中选取共同出现的商品组成频繁项集,避免上述复杂度呈指数级增长的问题,一旦找到了频繁项集,生成关联规则就很容易了。
Apriori算法首先保证规则在数据集中有足够的支持度,最重要的一个参数就是最小支持度比如要生成商品A B的频繁项集(A,B)要求支持度至少为30,那么A,B都必须至少在数据集中出现30次,更大的频繁项集也要最受这个约定。
这一章我们通过电影推荐的问题来举例。
数据集地址在文章开头
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: all_ratings = pd.read_csv('/Users/gn/scikit--learn/ml-100k/u.data',delim
...: iter="\t", header=None, names = ["UserID", "MovieID", "Rating", "Datetim
...: e"])
In [4]: all_ratings.head()
Out[4]:
UserID MovieID Rating Datetime
0 196 242 3 881250949
1 186 302 3 891717742
2 22 377 1 878887116
3 244 51 2 880606923
4 166 346 1 886397596
In [5]: all_ratings["Datetime"] = pd.to_datetime(all_ratings['Datetime'],unit='s
...: ')
In [6]: all_ratings["Favorable"] = all_ratings['Rating'] > 3
In [7]: ratings = all_ratings[all_ratings['UserID'].isin(range(200))]
In [8]: ratings.head()
Out[8]:
UserID MovieID Rating Datetime Favorable
0 196 242 3 1997-12-04 15:55:49 False
1 186 302 3 1998-04-04 19:22:22 False
2 22 377 1 1997-11-07 07:18:36 False
4 166 346 1 1998-02-02 05:33:16 False
6 115 265 2 1997-12-03 17:51:28 False
In [9]: favorable_ratings = ratings[ratings["Favorable"]]
In [10]: favorable_ratings.groupby("UserID")["MovieID"]
Out[10]: <pandas.core.groupby.generic.SeriesGroupBy object at 0x11583d9b0>
In [11]: favorable_reviews_by_users = dict((k, frozenset(v.values)) for k, v in favorable_ratings.groupby("UserID")["MovieID"])
In [12]: num_favorable_by_movie = ratings[["MovieID", "Favorable"]].groupby("MovieID").sum()
In [13]: num_favorable_by_movie.sort_values('Favorable',ascending=False).head()
Out[13]:
Favorable
MovieID
50 100.0
100 89.0
258 83.0
181 79.0
174 74.0
In [14]: from collections import defaultdict
In [15]: frequent_itemsets = {}
In [16]: min_support = 50
In [17]: frequent_itemsets[1] = dict((frozenset((movie_id,)), row["Favorable"]) for movie_id,row in num_favorable_by_movie[num_favorable_by_movie['Favorable']>50].iterrows())
In [18]: import sys