购物篮模型&Apriori算法

一、频繁项集

	若I是一个项集,I的支持度指包含I的购物篮数目,若I的支持度>=S,则称I是频繁项集。其中,S是支持度阈值。
1、应用
  • “尿布和啤酒”
  • 关联概念:寻找多篇文章中共同的词汇集合。项->词,购物篮->文档
  • 文档抄袭:寻找多个购物篮中共同出现的项对,同一个项对出现在越多的购物篮中,其相似度越高。项->文档,购物篮->句子
2、关联规则
	 I->j 如果I中所有项出现在某个购物篮的话,那么j“有可能”也出现在这一购物篮中。     
	 I->j的可行度:集合I与{j}补集的支持度与I的支持度的比值。  
	在实际应用中,购物篮规模和频繁项集太大,故任何算法的主要开销时间都集中在将购物篮从磁盘读入内存这个过程。
  • 对n个项集组成的购物篮而言,大小为k的所有子集的生成时间约为n(k)/k!(最终该时间会超过数据从磁盘传输的时间).
  • 通常只需要较小的频繁项集,所以k永远不会超过2或者3。
  • 当确实需要一个更大的k的项集时,往往可以去掉每个购物篮中不太可能会成为频繁项的那些项,从而保证k增长的同时n却下降。
3、项集计数中内存使用
	若项集是字符串或其他,可以以从1到n的连续整数来表示,整数码与项一一对应:用一个哈希表将项的表现形式换成整数。即每次在文件中看到一个项,就对它进行哈希。若该项存在,则可以获得其整数码;若不存在,就将下一个可用的数字赋给它,并将项极其整数码放入哈希表中。
4、三角矩阵方法
	假设i<j,且仅使用二维数组a中的元素a[i,j]来存放计数结果,这种策略会使数组的一半元素都没有用,故使用一个一维的三角数组。此时,{i,j}对应元素a[k],其中1<=i<=j<=n,k=(i-1)(n-i/2)+j-i.
5、三元组方法
	将计数值以三元组[i,j,c]的方式来存储,即{i,j}对的计数值为c(其中i<j).可以采用类似哈希表的数据结构,其中i和j是搜索键值,以此确定对于给定的i和j是否存在对应的三元组。
  • 若某个项对的计数值为0,则三元组方式不一定需要存储某个值。
  • 三元组方式对每个出现在购物篮中的项对都会存储三个而不是一个整数。
	如果在所有可能出现的项对中至少有1/3出现在购物篮的情况下,三角矩阵方式更优;而若出现的比例显著小于1/3,就要考虑使用三元组方式。
		
6、项集的单调性
  • 如果项集I是频繁的,那么其所有的子集都是频繁的;
  • 如果一个项集的超集不再是频繁的,则称该项集最大(这里的最大频繁项集不是指所含项个数最多的频繁项集,不要弄错了,最大频繁项集不是唯一的,可能有很多个)。
    • 最大频繁项集的所有子集都是频繁的;
    • 除最大频繁项集的子集之外,其它集合都是不频繁的。

二、A-Priori算法

	A-Priori相关算法:避免对所有的三元组或更大的集合计数,集中考虑计算频繁二元组的算法。A-Priori算法通过对数据做两遍扫描来减少必须计数的项对数目。
1、第一遍扫描
  • 建立两张表:第一张表将项的名称转换为1到n之间的整数;另一张表则是一个计数数组,第i个数组元素是上述第i个项的出现次数,初始值为0.
  • 读取购物篮时,检查购物篮中的每个项并将其名称转换为一个整数,将改整数作为计数数组的下标找到对应的数组元素,最后,对该数组元素加1.
2、两遍扫描之间的处理
	只给频繁项重新编号,编号范围是1到m.此时的表格是一个下标为1到n的数组,如果第i项不频繁,则对应的第i个数组元素为0,否则为1到m之间一个唯一的整数。该表格称为频繁项集表格。
3、第二遍扫描
	在第二遍扫描之后,对两个频繁项组成的所有项对计数。
  • 第二遍扫描所需的空间是2m*m字节。
  • 如果要使用一个大小正确的三角矩阵,那要注意只对频繁项进行重新编号处理。

第二遍扫描具体细节如下:
1、对每个购物篮,在频繁项集表中检查哪些项是频繁的;
2、通过一个双重循环生成所有的频繁项对;
3、对某个频繁项对,在存储计数值的数据结构中相应的计数值上加1;
最后,在第二遍扫描结束时,检查计数值结构以确定哪些项对是频繁项对。

三、所有频繁项集上的A-Priori算法

从某个集合大小k到下一个大小k+1的转移模式:
对于每个集合大小k,存在两个频繁项集的集合:

  • Ck大小为k的候选项集集合,即必须要通过计算来确定到底是否真正频繁的项集组成的集合。
  • Lk大小为k的真正频繁的项集集合。

![image](/Users/wust_zxl/Desktop/屏幕快照 2016-10-31 下午9.44.11.png)

原文地址:https://www.cnblogs.com/wust-zxl/p/6022830.html