FP-Growth算法实践

关联规则挖掘就是从大量的数据中挖掘出有价值描述数据项之间相互联系
的有关知识。

关联规则挖掘

挖掘关联规则(知识)就是从给定的数据集中搜索数据项(items
)之间所存在的有价值联系。

基本概念:

项集itemset:
一个数据项的集合

K−项集:
一个包含 K 个数据项的项集就称为K−项集

支持度:
一个项集的出现频度就是整个交易数据集 中包含该项集的交易记录数
在这里插入图片描述

置信度:
在这里插入图片描述

繁项集:
若一个项集的出现频度大于最小支持度阈值乘以交易记录集 中记录数,那么就称该项集满足最小支持度阈值;而满足最小支持度阈值所对应的交易记录数就称为最小支持频度。满足最小支持阈值的项集就称为频繁项集。

挖掘关联规则主要包含以下二个步骤:
步骤一:
发现所有的频繁项集,根据定义,这些项集的频度至少应等于(预 先设置的)最小支持频度;
步骤二:
根据所获得的频繁项集,产生相应的强关联规则。根据定义这些规
则必须满足最小信任度阈值。

关联规则挖掘分类

1.根据关联规则所处理的具体值来进行分类划分

  • 若一个规则仅描述数据项是否在出现这种情况间的联系,那这种关联规则就
    是一个布尔关联规则,如:
    在这里插入图片描述

  • 若一个规则描述的是定量数据项(或属性)之间的关系,那它就是一个定量
    关联规则。如:
    在这里插入图片描述

  • 根据规则描述内容所涉及的抽象层次来进行分类划分
    在这里插入图片描述

  • 根据关联规则所涉及的关联特性来进行分类划分

单维布尔关联规则挖掘

Apriori算法

思想:
一个频繁项集中任一子集也是频繁项集
在这里插入图片描述
具体操作过程:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关联规则生成

计算关联规则的信任度
在这里插入图片描述
在这里插入图片描述

apriori实践

数据:
excel列:
djbh单据编号
spid商品id

思路:同次购买的商品单据编号相同,通过获取每次购买的商品列表利用mxltend包apriror计算频繁项和关联规则
参考:
Apriori算法l
mxltend使用方法

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
import json
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori as ap
def ***()
 	data = pd.read_excl('***.xlsx')
    items_list = []
    for k,v in dict(data['djbh'].value_counts()).items():
        items_list.append(list(data[data['djbh']==k]['spid'].values))
    te = TransactionEncoder()
    te_ary = te.fit(items_list).transform(items_list)
    df = pd.DataFrame(te_ary, columns=te.columns_)
    frequent_itemsets = ap(df, min_support=0.005, use_colnames=True)
    frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)
     
    #关联规则
    association_rule = association_rules(frequent_itemsets, metric='confidence',
                                         min_threshold=0.7)
    # metric可以有很多的度量选项,返回的表列名都可以作为参数
    association_rule.sort_values(by='leverage', ascending=False, inplace=True)
    #提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少
    result_list =list(map(lambda x :x[0]+x[1] ,zip([list(x) for x in association_rule['antecedents']],[list(x) for x in association_rule['consequents']])))

    #存储频繁项
    save_list = []#去除重复频繁项集合
    def save_file(fname='频繁项.txt'):
        for ip in result_list:
            ip.sort()
            if ip not in save_list:
                save_list.append(ip)

        sored_save_list = sorted(save_list, key=lambda item: item[1], reverse=True)
        fileObject = open(fname, 'a+', encoding='UTF-8')
        json.dump({wldwid:sored_save_list},fileObject,ensure_ascii=False)

    save_file()

pfgrowth原理

FP-growth 算法是一种用于发现数据集中频繁模式的有效方法,利用Apriori 原理,只对数据集扫描两次,运行更快。在算法中,数据集存储在 FP 树中,构建完树后,通过查找元素项的条件基及构建条件 FP 树来发现频繁项集。重复进行直到FP树只包含一个元素为止。执行速度要快于Apriori,通常性能要好两个数量级以上.

对比Apriori:

  • 减少扫描数据库的次数
  • 减少候选项集的数量
  • 简化候选项集的支持度计算

算法原理可参考:pfgrowth原理和实践(python2 fpGrowth)

pfgrowth实践

参考:python3 pyfpgrwoth实践

import pyfpgrowth
    def get_itemsets_fp_growth(items_list):
        # 调包演示
        patterns = pyfpgrowth.find_frequent_patterns(items_list, 2)  # 频数删选  频数大于N
        rules = pyfpgrowth.generate_association_rules(patterns, 0.8)  #{(left): ((right), confidence)} 置信度(条件概率)删选
        rules_list = list( map(lambda x: x[0] + x[1], zip([list(x) for x in list(rules.keys())],[list(x[0]) for x in list(rules.values())])))
        return rules_list
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值