apriori 算法

来源:互联网 发布:lol训练软件 编辑:程序博客网 时间:2024/05/14 16:06

这个算法其实没什么特别,最近一直在有这种感觉,当 入门某一门学科的时候,多多少少会接触一些算法,而 这些算法并不是很难理解,相比于之前学的算法来说,只是放到特定的学科背景下,并能解决一些问题 ,这里我只的 这们学科的入门级算法 。

 

在计算机科学以及数据挖掘领域中, 先验算法[1]是关联式规则中的经典算法之一。先验算法的设计目的是为了处理包含交易信息内容的数据库(例如,顾客购买的商品清单,或者网页常访清单。)而其他的算法则是设计用来寻找无交易信息(如Winepi算法和Minepi算法)或无时间标记(如DNA测序)的数据之间的联系规则。

在关联式规则中,一般对于给定的项目集合(例如,零售交易集合,每个集合都列出的单个商品的购买信息),算法通常尝试在项目集合中找出至少有C个相同的子集。先验算法采用自底向上的处理方法,即频繁子集每次只扩展一个对象(该步骤被称为候选集产生),并且候选集由数据进行检验。当不再产生符合条件的扩展对象时,算法终止。  参考: http://zh.wikipedia.org/wiki/%E5%85%88%E9%AA%8C%E7%AE%97%E6%B3%95

就比如这个算法,我姑且认为这是一个解决某问题的暴力算法  。

我现在对这个算法的理解是 :  对于 数据表 如  : id :  value1  ,value1 2 ,value3   的数据库 ,算法要找出 至少出现K次的 value 的组合 。

如  数据挖掘课本 第151 页 所示

  1. T100   I1,I2,I5

T400  I1,I2,I4

T800   I1,I2,I3,I5

T900   I1,I2,I3    , 自己算 就知道  {I1,I2,I5} {I1,I2,I3}  出现两次 。

当然算法还不只是 做这个 ,这里要引出三个 概念 : 频繁项集 ,支持度,置信度。 上述说的条件 ,确切的说 是 用支持度 和置信度来限制。

那么 对于数据挖掘来说 ,应该如何做呢  ?

下面介绍暴力 即没有优化的算法:

集合 A = { I1,I2,I3 }  (wordpress  的编辑器不给力啊 ,运行也慢)

  1. 扫描数据库 ,可以得到 set1{ {I1}   {I2}  {I3} } 的计数  这里可以根据支持度 和 置信度删除一些集合
  2. 由set1 可以得到 set2{  {I1,I2}  {I1,I2}  {I1,I3}  { I2 ,I3}   }  ,扫描数据库  同样可以得到这个同时出现 subset 的计数,这里可以根据支持度 和 置信度删除一些集合  ,(这里因为只是简单的演示,就不删了)
  3. 这一步  自然就生成 set3{  { I1,I2,I3}}  ,再次扫描数据库  ,这个得到 同时出现 这个集合的计数 。
由上可以知道 :  有两步比较重要 ,1  只有 k-1 项的集合 生成 k 项的集合 (做连接操作) ,对生成新的K项集合 ;2 扫描数据库 对新的k项进行计数
可想而知 ,如果数据集很大的话,这个 复杂度是很高的  。
书上说的优化措施有:
  1. 在生成K 项集合的时候 ,如果 SETK {SUBSETK1  ,SUBSETK2 ······}  如果 SUBSETK1 的k-1项的子集  在生成k项集合 的那么子集中不存在,那么就删掉 这个SUBSETK1 。举例来说吧 (I1 ,I2) ,(I2,I3) ,(I3,I4)  —>  (I1,I2,I3)   (I2,I3,I4)    ; 这里(I2,I3,I4) 的子集 (I2,I3) (I3,I4) ,(I2,I4)   ,其中 (I2,I4) 是不存在的,那么 (I2,I3,I4)  这个应该删掉 。其实很好理解  (I2,I4) 不符合条件 , (I2,I3,I4) 怎么可能会符合条件 。
  2. FP-TREE ,这是改进的数据结构,可以值扫描两次 就可以得到最大频繁项集 ;这个树的生成理论还是很好理解的,第一遍扫描数据库 得到1项集 ,然后对于数据库中的每个事物 ,{I1,I2,I3} ,这个插入到树中, 那么 计数最大的作为根的子节点,次大的元素作为最大元素的子节点 , 比如
    (f:4, c:4, a:3, b:3, m:3, p:3 )  然后在书中 计数+1 ,
    那么生成
    那么这样就转换成对树的搜索   。 而对树的搜索 ,可以从叶子节点开始 ,可以找到满足条件的最大频繁项集
    我独立博客的地址  :http://www.fuxiang90.me/?p=609
原创粉丝点击