zoukankan      html  css  js  c++  java
  • 关联规则与Apriori算法

    摘自:我是康小小

    当我们去商店购物时,我们通常有一个标准的购物清单,每个购物的人都有一个独特的清单,取决于他们的需求和喜好,家庭主妇可能会为家庭晚餐购买健康的食材,而单身汉可能会购买啤酒和薯条。了解这些购物模式有助于通过多种方式提高销售额,如果有一对物品,X和Y经常被购买:

    • X和Y都可以放在同一个架子上,这样一个物品的买家会被提示购买另一个。
    • 促销折扣只适用于两个项目中的一个。
    • 对于X的广告可以针对购买Y的买家投放。
    • X和Y可以组合成一个新产品(比如套餐),比如X的套餐中包含有Y。

    虽然我们可能知道某些物品经常会一起购买,但问题是,我们如何去发现这些关联关系?(很典型的就是啤酒和尿布的问题)除了增加销售利润外,关联规则还可以用于其他领域。例如,在医学诊断中,了解哪些症状容易并存,有助于提高患者的护理水平和药物处方。

    关联规则定义

    关联规则分析是一种揭示项商品之间如何相互关联的技术,有三个常用的指数来衡量关联关系。

    指数一:支持度(Support)

    支持度表示一个项集的流行程度,用一个项集出现的事务的比例来衡量。在下面的表1中,apple的支持率是8个中的4个,即50%。项集还可以包含多个项,例如,苹果、啤酒、大米的支持率是8个中的2个,即25%。

    如果你发现超过一定比例的商品销售往往会对您的利润产生重大影响,你可以考虑将该比例作为支持度阈值,然后,可以将支持度的值高于此阈值的项集标识为重要项集。

    指数二:置信度(Confidence)

    置信度表示在X被购买的前提下,Y被购买的概率,表示为{X -> Y},这是通过X交易的比例来衡量的,其中项目Y也出现在交易中。在表1中,{苹果->啤酒} 的置信度为3/4,即75%。

    但是置信度指数的一个缺点是它可能会误导关联的重要性,因为它只说明了苹果有多受欢迎,而不是啤酒。如果啤酒在一般情况下也很受欢迎,那么包含了苹果的订单中同时包含啤酒的可能性将更高,从而提高了置信度指数。为了说明这两个组成项目的基础普及率,我们使用了第三个措施,称为提升度(Lift)。

    指数三:提升度(Lift)

    提升度表示在购买X时购买Y的可能性,同时控制Y项的流行程度。在表1中,{苹果->啤酒} 的提升度为1,表明了苹果和啤酒之间没有关联。提升度的值大于1意味着,购买X的情况下很有可能购买Y,反之,提升度的值小于1,表示用户购买X的时候不大可能购买Y。

    Apriori 算法

    (1)相关概念

    项集:“属性-值”对的集合,一般情况下在实际操作中会省略属性。 
    候选项集:用来获取频繁项集的候选项集,候选项集中满足支持度条件的项集保留,不满足条件的舍弃。 
    频繁项集:在所有训练元组中同时出现的次数超过人工定义的阈值的项集称为频繁项集。 
    极大频繁项集:不存在包含当前频繁项集的频繁超集,则当前频繁项集就是极大频繁项集。 
    支持度:项集在所有训练元组中同时出现的次数。 
    置信度:形如A->B,置信度为60%表示60%的A出现的同时也出现B。 
    k项集:项集中的每个项有k个“属性-值”对的组合。

    (2)两个定理

    i:连接定理

      若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个项相同,而最后一 个项不同,则证明它们是可连接的,即这个k-1项集可以联姻,即可连接生成k项集。

      例如有两个3项集:{a, b, c}{a, b, d},这两个3项集就是可连接的,它们可以连接生成4项集{a, b, c, d}。

      又如两个3项集{a, b, c}{a, d, e},这两个3项集显示是不能连接生成3项集的。要记住,强扭的瓜是不甜的,也结不了果的。 


    ii:频繁子集定理。

      若一个项集的子集不是频繁项集,则该项集肯定也不是频繁项集。

      这个很好理解,举一个例子,若存在3项集{a, b, c},如果它的2项子集{a, b}的支持度即同时出现的次数达不到阈值,则{a, b, c}同时出现的次数显然也是达不到阈值的。因此,若存在一个项集的子集不是频繁项集,那么该项集就应该被无情的舍弃。倘若你舍不得,那么这个项集就会无情 的影响你的效率以及处理器资源,所以在这时,你必须无情,斩立决! 

     

    (3)Apriori算法流程

        1. 扫描数据库,生成候选1项集和频繁1项集。
        2. 从2项集开始循环,由频繁k-1项集生成频繁频繁k项集。
               2.1  频繁k-1项集生成2项子集,这里的2项指的生成的子集中有两个k-1项集。

        例如有3个2项频繁集{a, b}{b, c}{c, f},则它所有的2项子集为{{a, b}{b, c}}{{a, b}{e, f}}{{b, c}{c, f}}
              2.2  对由2.1生成的2项子集中的两个项集根据上面所述的定理 i 进行连接,生成k项集。
              2.3  对k项集中的每个项集根据如上所述的定理 ii 进行计算,舍弃掉子集不是频繁项集即不在频繁k-1项集中的项集。
              2.4  扫描数据库,计算2.3步中过滤后的k项集的支持度,舍弃掉支持度小于阈值的项集,生成频繁k项集。
        3.  当当前生成的频繁k项集中只有一个项集时循环结束。

    (4)关联规则(Association Rules)

      反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术, 用于从大量数据中挖掘出有价值的数据项之间的相关关系。 其中关联规则挖掘的最经典的例子就是沃尔玛的啤酒与尿布的故事 ,通过对超市购物篮数据进行分析,即顾客放入购物篮中不同商品之间的关系来分析顾客的购物习惯,发现美国妇女们经常会叮嘱丈夫下班后为孩子买尿布,30%-40%的丈夫同时会顺便购买喜爱的啤酒,超市就把尿布和啤酒放在一起销售增加销售额。 

     

    先验(Apriori)原理可以减少我们要检验的项集的数量,简单的描述先验原则就是:如果一个项集不经常出现,那么它的所有超集也必须不经常出现。

    关联分析的目标包括两项:发现频繁项集和发现关联规则。首先需要找到频繁项集,然后才能获得关联规则。

    Apriori算法过程

     

    发现频繁项集的过程如上图所示:

    1. 由数据集生成候选项集C1(1表示每个候选项仅有一个数据项);再由C1通过支持度过滤,生成频繁项集L1(1表示每个频繁项仅有一个数据项)。
    2. 将L1的数据项两两拼接成C2。
    3. 从候选项集C2开始,通过支持度过滤生成L2。L2根据Apriori原理拼接成候选项集C3;C3通过支持度过滤生成L3……直到Lk中仅有一个或没有数据项为止。

    下面是一个超市的交易记录:

    Apriori算法发现频繁项集的过程如下:

    发现关联规则

    我们的目标是通过频繁项集挖掘到隐藏的关联规则。

    所谓关联规则,指通过某个元素集推导出另一个元素集。比如有一个频繁项集{底板,胶皮,胶水},那么一个可能的关联规则是{底板,胶皮}→{胶水},即如果客户购买了底板和胶皮,则该客户有较大概率购买胶水。这个频繁项集可以推导出6个关联规则:

    {底板,胶水}→{胶皮},

    {底板,胶皮}→{胶水},

    {胶皮,胶水}→{底板},

    {底板}→{胶水, 胶皮},

    {胶水}→{底板, 胶皮},

    {胶皮}→{底板, 胶水}

    还是以上篇的超市交易数据为例,我们发现了如下的频繁项集:

     

    对于寻找关联规则来说,频繁1项集L1没有用处,因为L1中的每个集合仅有一个数据项,至少有两个数据项才能生成A→B这样的关联规则。

    当最小置信度取0.5时,L2最终能够挖掘出9条关联规则:

     

    从频繁3项集开始,挖掘的过程就较为复杂。

  • 相关阅读:
    IIS无法加载字体文件(*.woff,*.svg)的解决办法
    windows server 2012 r2 安装IIS失败
    ASP.NET Core文件上传、下载与删除
    VS2015打开特定项目就崩溃
    sql server优化思路
    Asp.net Core中使用Session
    ABP之动态WebAPI
    web.xml和@WebServlet
    同一个页面 andriod和ios设备上的按钮颜色不一致
    地址中如果含有"+",发给服务器时"+"变成了空格问题解析
  • 原文地址:https://www.cnblogs.com/liyuewdsgame/p/13264724.html
Copyright © 2011-2022 走看看