apriori

来源:互联网 发布:小学生沉迷网络的案例 编辑:程序博客网 时间:2024/06/06 07:05

关联分析:

百度百科定义:又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。或者说,关联分析是发现交易数据库中不同商品(项)之间的联系。

说白了,就是从大量数据中发现元素之间的关联和相关联系。

最典型的例子就是购物车分析,通过发现顾客放人其购物车中的不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商制定营销策略。其他的应用还包括价目表设计、商品促销、商品的排放和基于购买模式的顾客划分。

如“67%的顾客在购买啤酒的同时也会购买尿布”,因此通过合理的啤酒和尿布的货架摆放或捆绑销售可提高超市的服务质量和效益。又如“‘C语言’课程优秀的同学,在学习‘数据结构’时为优秀的可能性达88%”,那么就可以通过强化“C语言”的学习来提高教学效果。

关联分析的算法: 
Apriori算法,FP-growth算法。

=================================================

Apriori算法

简介:

Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。而且算法已经被广泛的应用到商业、网络安全等各个领域。

基本概念:对于A ⇒ B

(1)、支持度:P(A ∩ B),既有A又有B的概率 
(2)、置信度:P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A)

例如 购物车分析:牛奶 ⇒ 面包 
支持度:3% 意味着3%顾客同时购买牛奶和面包 
置信度:40% 意味着购买牛奶的顾客40%也购买面包

(3)、频繁项集:所有支持度大于最小支持度的项集称为频繁项集,简称频集 
(4)、如果事件A中包含k个元素,那么称这个事件A为K项集事件,A满足最小支持度發值的事件称为频繁K项集 
(5)、同时满足最小支持度阀值和最小置信度阀值的规则称为强规则。

实现步骤: 
Aprior使用一种称作逐层搜索的迭代方法,“K-1项集”用于搜索“K项集”。 
首先,找出频繁“1项集”的集合,该集合记作L1,L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描。

核心思想:连接步和剪枝步。 
连接步是自连接,原则就是保证前k-2项相同,并按照字典顺序连接。 
剪枝步是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果其中候选的非空子集不是频繁的,那么该候选肯定不是频繁的,这样就可以将其删除。

简单的讲:(1)扫描;(2)计数;(3)比较;(4)产生频繁项集;(5)连接、剪枝,产生候选项集;(6)重复步骤(1)~(5)直到不能发现更大的频集。

伪代码

 // 找出频繁 1 项集     L1 =find_frequent_1-itemsets(D);      For(k=2;Lk-1 !=null;k++){// 产生候选,并剪枝        Ck =apriori_gen(Lk-1 ); // 扫描 D 进行候选计数        Foreach transation t  in D{             Ct =subset(Ck,t); // 得到 t 的子集            Foreach candidate  c 属于 Ct                c.count++;        }        //返回候选项集中不小于最小支持度的项集        Lk ={c ∈ Ck | c.count>=min_sup}}Return L= 所有的频繁集;第一步:连接(joinProcedure apriori_gen (Lk-1 :frequent(k-1)-itemsets)      Foreach  l1Lk-1         Foreach  l2Lk-1            If( (l1 [1]=l2 [1])&&( l1 [2]=l2 [2])&& ……&& (l1 [k-2]=l2 [k-2])&&(l1 [k-1]<l2 [k-1]) ) then{                    c = l1 join l2    // 连接步:产生候选                  //若k-1项集中已经存在子集c则进行剪枝                   if has_infrequent_subset(c, Lk-1 ) then                       delete c; // 剪枝步:删除非频繁候选                   else add c to Ck;                   }          Return Ck;第二步:剪枝(prune) Procedure has_infrequent_sub (c:candidate k-itemset; Lk-1 :frequent(k-1)-itemsets)         Foreach (k-1)-subset s of c            If s 不属于 Lk-1 then               Return true;        Return false;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

算法例子:

这里写图片描述

缺点不足: 
(1)由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大。 
(2)在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。

网上提到的频集算法的几种优化方法: 
1.基于划分的方法。2. 基于hash的方法。3. 基于采样的方法。4. 减少交易的个数。

0 0
原创粉丝点击