Python数据挖掘入门与实践(四)——亲和性分析

来源:互联网 发布:js获取客户端端口号 编辑:程序博客网 时间:2024/06/08 19:08

亲和性分析用来找出两个对象共同出现的情况。

亲和性分析所用的数据通常为类似于交易信息的数据。

亲和性分析比分类更具探索性,因为通常我们无法拿到像在很多分类任务中所用的那样完整的数据集。

Apriori算法是经典的亲和性分析算法。它只从数据集中频繁出现的商品中选取共同出现的商品组成频繁项集,避免复杂度呈指数级增长。

一旦找到频繁项集,生成关联规则就很容易了。

Aprori算法背后的原理简单却不失巧妙。首先,确保了规则在数据集中有足够的支持度。Apriori算法的一个重要参数就是最小支持度。

挖掘亲和性分析所用的关联规则之前,我们先用Apriori算法生成频繁项集。接着,通过检测频繁项集中前提和结论的组合,生成关联规则。

第一阶段,需要为Apriori算法指定一个项集要成为频繁项集所需要的最小支持度。任何小于最小支持度的项集将不再考虑。

找出频繁项集后,在第二阶段,根据置信度选取关联规则。可以设定最小置信度,返回一部分规则,或者返回所有规则,让用户自己选。

Apriori算法是亲和性分析的一部分,专门用于查找从前一步找到的频繁项集找到新的备选集合,基本流程是从前一步找到的频繁项集中找到新的备选集合,接着检测备选集合的频繁程度是否够高,然后算法像下面这样进行迭代。

1、把各项放到只包含自己的项集中,生成最初的频繁项集。只使用到最小支持度的项目。

2、查找现有频繁项集的超集,发现新的频繁项集,并用其生成新的备选项集。

3、测试新生成的备选项集的频繁程度,如果不够频繁,则舍弃。如果没有新的频繁项集,就跳到最后一步。

4、存储新发现的频繁项集,调到步骤2。

5、返回发现的所有频繁项集。

实现:Apriori算法第一次迭代时,新发现的项集长度为2,它们是步骤1中创建的项集的超集。第二次迭代(经过步骤4)中,新发现的项集长度为3。这有助于我们快速识别步骤2所需的项集。把发现的频繁项集保存到以项集长度为键的字典中,便于根据长度查找,这样就可以找到最新发现的频繁项集。我们还需要确定频繁项集所需要的最小支持度。这个值根据数据集的具体情况来设定,可自行尝试其他值,建议每次只改动10个百分点。

先实现Apriori算法的第一步,为每一步电影生成只包含它自己的项集,检测它是否够频繁。电影编号使用frozenset,后面要用到集合操作。此外,它们也可以用作字典的键(普通集合不可以)。代码如下:frequent_itemsets[1]=dict(frozenset((movie_id,)),row['favorable'] for movie_id,row num_favorable_by_movie.iterrows() if row['favorzble']>min_support)。

接着用一个函数来实现步骤2和3,它接收新发现的频繁项集,创建超集,检测频繁程度。

from collections import defaultdict

def find_frequent_itemsets(favorable_reviews_by_users,k_1_itemsets,min_support):

counts=defaultdict(int)

for user,reviews in favoable_reviews_by_users.items():

for itemset in k_1_itemsets:

if itemset.issubsett(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])

创建循环,运行Apriori算法,存储算法运行过程中发现的新项集。循环体中,k表示即将发现的频繁项集的长度,用键k-1可以从frequent_itemsets字典中获取刚发现的频繁项集。新发现的频繁项集以长度为键,将其保存到字典中。代码如下:

for k in range(2,20):

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

frequent_itemsets[k]=cur_frequent_itemsets

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))

最后,循环结束,我们对只有一个元素的项集不再感兴趣,它们对生成关联规则没有用处,生成关联规则至少需要两个项目,删除长度为1的项集。

del frequent_itemsets[1]

阅读全文
0 0