zoukankan      html  css  js  c++  java
  • 机器学习算法系列(2)Apriori关联分析详解

    一、 Apriori关联分析概述

    选择物品之间的关联规则也就是要找出物品之间的关系,要找到这种关系有两步

    1. 找出频繁一起出现的物品集的集合,我们称之为频繁项集,比如一个超市的频繁项集可能有{{啤酒,尿布}{鸡蛋,牛奶}{香蕉,苹果}}
    2. 在频繁项集的基础上,使用关联规则算法找出其中的关联结果
      也就是先找到频繁项集,再根据关联规则再找出关联物品

    二、 关联分析的几个概念

    这里有一份交易记录
    编号 0 1 2 3 4 5
    购买商品集合 {牛奶,洋葱,豆蔻, 芸豆,鸡蛋, 酸奶} ,{菠萝,洋葱,豆蔻,芸豆,鸡蛋,酸奶},{牛奶,独角兽,玉米,酸奶},{玉米,洋葱,洋葱,鸡蛋}

    2.1 关键概念

    支持度 :支持度可以理解为商品的流行程度

    支持度 = (包含物品A的记录数) / (总的记录数)

    用上面的例子举例,一共有5次交易,牛奶出现在3次交易中,故牛奶的支持度3/5

    置信度 置信度是指如果购买A,则有较大可能性购买B

    置信度 (A>B) = (包含物品A和B的记录数量)/(包含A的数量)

    举例:我们已经知道, (牛奶, 鸡蛋)一起购买的次数是两次, 鸡蛋购买次数是4次,那么confidence(牛奶> 鸡蛋)的记录就是2/4

    提升度:提升度指当销售一个物品时,另一个物品的销售率会增加多少,计算方式是:

    提升度(A>B) = 置信度 (A>B)/支持度A

    当提升度大于1的时候,表示A卖的越多,B也会卖的越多。提升度等于1表示产品A和B没有关联。最后提升度小于1则意味着购买A 反而会减少B的购买

    举例:上面我们说的牛奶和鸡蛋的置信度是2/4, 牛奶的支持度是3/5,那么就能计算出牛奶和鸡蛋的支持度0.83

    2.2 关联规则

    如果一个关联结果的置信度低,那么所有超集的置信度也低

    Apriori算法介绍

    支持度越高,物品越受欢迎,那么支持度是怎么决定的呢,这个是我们主观决定的,我们会给Apriori提供一个最小支持度参数,然后Apriori会返回比这个最小支持度高的那些频繁项集

    利用一个思想加速运算:如果一个项集子集是不频繁的,那么他的超集也都是不频繁的,例如如果发现项集{A,B}是非频繁的, 那么他所组成的超集也是非频繁的{A, B, C}, {A, B, D} 等等我们就可以去忽略不计了

    三、 Apriori算法流程

    要用Apriori算法,我们需要提供两个参数:数据集和最小支持度,Aprori算法会通过递归遍历所有的数据集组合,先遍历一个物品组合的情况,剔除掉支持度低于最小支持度的数据项,然后用剩下的物品进行组合,遍历两个物品组合的情况,再剔除不满足条件的组合。不断递归下去,直到不再有物品可以递归组合。

    # def apriori(df, min_support=0.5,use_colnames=False, max_len=None)
    # df 数据集
    # min_support 给定的最小支持度
    # use_colnames 默认为false,返回物品编号的组合显示,为True的话直接显示物品名称
    # max_len 最大物品组合数,默认为NOne,不做限制。如果只想返回两个物品组合的话,便将这个设置为2
    import pandas as pd
    from mlxtend.preprocessing import TransactionEncoder
    from mlxtend.frequent_patterns import apriori
    # 设置数据集
    dataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
            ['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
            ['牛奶','苹果','芸豆','鸡蛋'],
            ['牛奶','独角兽','玉米','芸豆','酸奶'],
            ['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']]
    te = TransactionEncoder()
    # 进行onehot编码
    te_any = te.fit(dataset).transform(dataset)
    df = pd.DataFrame(te_any, columns= te.columns_)
    df
    # 利用Aprori算法找出频繁项集
    freq = apriori(df, min_support=0.6, use_colnames=True)
    from mlxtend.frequent_patterns import association_rules
    result = association_rules(freq, metric='confidence',min_threshold=0.6)
    result.sort_values(by='confidence',ascending=False).head(10)
    
  • 相关阅读:
    解决"waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again."问题
    解决:“MediaPlayer error (1, -2147483648)”问题
    EasyUI 验证
    ANT简明教程[转载]
    [转]Android开源框架ImageLoader的完美例子
    [转]Android精品开源项目整理
    【转】25个非常实用的jQuery/CSS3应用组件
    [转]8款实用的jQuery/CSS3最新插件应用
    解决IE6下浮层遮盖select刺穿的问题
    jQuery AJAX中文乱码处理
  • 原文地址:https://www.cnblogs.com/yangjiez/p/12032596.html
Copyright © 2011-2022 走看看