数据挖掘实验——Apriori算法实现

这篇具有很好参考价值的文章主要介绍了数据挖掘实验——Apriori算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的

关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找出各项之间的关联关系,而这种关系并没有在数据中直接表示出来。本实验主要目的是培养学生能够运用Apriori算法数据挖掘方法进行数据挖掘。

二、实验要求

学习掌握数据挖掘方法中的Apriori算法。

三、实验内容

就餐饮企业而言,经常会碰到这样的问题:客户在餐厅点餐时,面对菜单中大量的菜品信息,往往无法迅速找到满意的菜品,既增加了点菜的时间,也降低了客户的就餐体验。实际上,菜品的合理搭配是有规律可循的:顾客的饮食习惯、菜品的荤素和口味,有些菜品之间是相互关联的,而有些菜品之间是对立或竞争关系(负关联)。这些规律都隐藏在大量的历史菜单数据中,如果能够通过数据挖掘发现客户点餐的规则,就可以快速识别客户的口味,当他下了某个菜品的订单时推荐相关联的菜品,引导客户消费,提高顾客的就餐体验和餐饮企业的业绩水平。

根据下表给定的餐饮订单数据,使用下图Apriori算法挖掘其中的所有频繁项集和支持度,以及所有强关联规则和相应的支持度。

表1 餐饮订单数据

订单ID

菜品ID

001

健康麦香包,三丝炒河粉,翡翠蒸香茜饺

002

菜心粒咸骨粥,养颜红枣糕

003

菜心粒咸骨粥,三丝炒河粉

004

健康麦香包,菜心粒咸骨粥,三丝炒河粉,养颜红枣糕

005

健康麦香包,菜心粒咸骨粥

006

菜心粒咸骨粥,三丝炒河粉

007

健康麦香包,菜心粒咸骨粥

008

健康麦香包,菜心粒咸骨粥,三丝炒河粉,翡翠蒸香茜饺

009

健康麦香包,菜心粒咸骨粥,三丝炒河粉

010

健康麦香包,三丝炒河粉,翡翠蒸香茜饺

数据挖掘实验——Apriori算法实现
数据挖掘实验——Apriori算法实现

四、实验结果及分析

重新编辑菜品ID:1代表健康麦香包,2代表三丝炒河粉,3代表翡翠蒸香茜饺,4代表菜心粒咸骨粥,5代表养颜红枣糕,将原表格化为:

订单ID

菜品ID

001

1,2,3

002

4,5

003

4,2

004

1,4,2,5

005

1,4

006

4,2

007

1,4

008

1,4,2,3

009

1,4,2

010

1,2,3

  1. 代码部分

'''
Apriori算法,频繁项集算法
1代表健康麦香包,2代表三丝炒河粉,3代表翡翠蒸香茜饺,
4代表菜心粒咸骨粥,5代表养颜红枣糕
1,2,3
4,5
4,2
1,4,2,5
1,4
4,2
1,4
1,4,2,3
1,4,2
1,2,3
min_support = 2
'''


def item(dataset):  # 求第一次扫描数据库后的候选集
    c1 = []  # 存放候选集元素

    for x in dataset:  # 求这个数据库中出现了几个元素,然后返回
        for y in x:
            if [y] not in c1:
                c1.append([y])
    c1.sort()
    # print(c1)
    return c1


def get_frequent_item(dataset, c, min_support):
    cut_branch = {}  # 用来存放所有项集的支持度的字典
    for x in c:
        for y in dataset:
            if set(x).issubset(set(y)):  # 如果x不在y中,就把对应元素后面加 1
                cut_branch[tuple(x)] = \
                    cut_branch.get(tuple(x), 0) + 1
                # cut_branch[y] = new_cand.get(y, 0)表示如果字典里面没有想要的关键词,就返回0
    # print(cut_branch)

    Fk = []  # 支持度大于最小支持度的项集,即频繁项集
    sup_dataK = {}  #用来存放所有频繁项集的支持度的字典
    for i in cut_branch:
        if cut_branch[i] >= min_support:  # Apriori定律1  小于支持度,则就将它舍去,它的超集必然不是频繁项集
            Fk.append(list(i))
            sup_dataK[i] = cut_branch[i]
    # print(Fk)
    return Fk, sup_dataK


def get_candidate(Fk, K):  # 求第k次候选集
    ck = []  # 存放产生候选集

    for i in range(len(Fk)):
        for j in range(i + 1, len(Fk)):
            L1 = list(Fk[i])[:K - 2]
            L2 = list(Fk[j])[:K - 2]
            L1.sort()
            L2.sort()  # 先排序,在进行组合

            if L1 == L2:
                if K > 2:  # 第二次求候选集,不需要进行减枝,因为第一次候选集都是单元素,且已经减枝了,组合为双元素肯定不会出现不满足支持度的元素
                    new = list(set(Fk[i]) ^ set(Fk[j]))  # 集合运算 对称差集(含义,集合的元素在t或s中,但不会同时出现在二者中)
                    # new表示,这两个记录中,不同的元素集合
                    # 为什么要用new? 比如 1,2和1,3  两个合并成 1,2,3   我们知道1,2 和 1,3 一定是频繁项集,但 2,3呢,我们要判断2,3是否为频繁项集
                    # Apriori定律1 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集
                else:
                    new = set()
                for x in Fk:
                    if set(new).issubset(set(x)) and list(
                            set(Fk[i]) | set(Fk[j])) not in ck:  # 减枝 new是 x 的子集,并且 还没有加入 ck 中
                        ck.append(list(set(Fk[i]) | set(Fk[j])))
    # print(ck)
    return ck


def Apriori(dataset, min_support=2):
    c1 = item(dataset)  # 返回一个二维列表,里面的每一个一维列表,都是第一次候选集的元素
    f1, sup_1 = get_frequent_item(dataset, c1, min_support)  # 求第一次候选集

    F = [f1]  # 将第一次候选集产生的频繁项集放入 F ,以后每次扫描产生的所有频繁项集都放入里面
    sup_data = sup_1  # 一个字典,里面存放所有产生的候选集,及其支持度

    K = 2  # 从第二个开始循环求解,先求候选集,在求频繁项集

    while (len(F[K - 2]) > 1):  # k-2是因为F是从0开始数的     #前一个的频繁项集个数在2个或2个以上,才继续循环,否则退出
        ck = get_candidate(F[K - 2], K)  # 求第k次候选集
        fk, sup_k = get_frequent_item(dataset, ck, min_support)  # 求第k次频繁项集

        F.append(fk)  # 把新产生的候选集加入F
        sup_data.update(sup_k)  # 字典更新,加入新得出的数据
        K += 1
    return F, sup_data  # 返回所有频繁项集, 以及存放频繁项集支持度的字典


if __name__ == '__main__':
    dataset = [[1,2,3],
               [4,5],
               [4,2],
               [1,4,2,5],
               [1,4],
               [4,2],
               [1,4],
               [1,4,2,3],
               [1,4,2],
               [1,2,3]]  # 装入数据 二维列表
    F, sup_data = Apriori(dataset, min_support=2)  # 最小支持度设置为2

    print("具有关联的菜品是{}".format(F))  # 带变量的字符串输出,必须为字典符号表示
    print('------------------')
    print("对应的支持度为{}".format(sup_data))
  1. 运行结果

运行结果:

具有关联的菜品是[[[1], [2], [3],[4], [5]], [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [4, 5]], [[1, 2, 3], [1, 2,4]]]

------------------

对应的支持度为{(1,): 7, (2,): 7,(3,): 3, (4,): 8, (5,): 2, (1, 2): 5, (1, 3): 3, (1, 4): 5, (2, 3): 3, (2, 4):5, (4, 5): 2, (1, 2, 3): 3, (1, 2, 4): 3}

五、实验小结

1、Apriori算法的基本思路是采用层次搜索的迭代方法,由候选(k-1)-项集来寻找候选k-项集,并逐一判断产生的候选k-项集是否是频繁的。

  设C k 是长度为k的候选项集的集合,Lk 是长度为k的频繁项集的集合。为了简单,设最小支持度阈值min_sup为最小元组数,即采用最小支持度计数。

通过扫描D得到1-频繁项集L1;

for(k=2;Lk-1!=Ф;k++)

{ Ck=由Lk-1通过连接运算产生的候选k-项集;

for (事务数据库D中的事务t)

{ 求Ck中包含在t中的所有候选k-项集的计数;

Lk={c | c∈Ckand c.sup_count≥min_sup};

//求Ck中满足min_sup的候选k-项集

}

}

returnL=∪kLk;

2、支持度(support):support(A=>B)= P(A∪B),表示A和B同时出现的概率。支持度就是几个关联的数据在数据集中出现的次数占总数据集的比重

3、Apriori性质

Apriori定律1:如果某商品组合小于最小支持度,则就将它舍去,它的超集必然不是频繁项集。

Apriori定律2:如果一个集合是频繁项集,即这个商品组合支持度大于最小支持度,则它的所有子集都是频繁项集。

4、Apriori算法的频繁项集产生的部分有两个重要的特点:(1)逐层算法,从频繁1-项集到最长的项集,每次遍历项集格中的一层。(2)它使用产生-测试(generate-and-test)策略来发现频繁项集,每次迭代后的候选项集都由上一次迭代发现的频繁项集产生。算法总迭代次数为kmax+1,其中kmax为频繁项集最大长度。

5、置信度不像支持度那样具有任何单调性。但是具有以下定理

定理:如果规则X→Y−X不满足置信度阈值,则形如X′→Y−X′的规则也一定不满足置信度阈值,其中X'是X的子集。

6、Aprori算法利可以很好的找出关联关系,但是每一次求候选集都需要扫描一次所有数据记录,那么在面临千万级别的数据记录就显得有点无力了。文章来源地址https://www.toymoban.com/news/detail-461547.html

到了这里,关于数据挖掘实验——Apriori算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据挖掘-关联规则学习-Apriori算法原理

    比如你女朋友,低头玩手指+沉默,那大概率生气了,那这就是你总结出来的规则。啤酒与尿布的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起,但这一奇怪的举措居然使尿布

    2024年02月11日
    浏览(78)
  • 数据挖掘(一)使用 Apriori 算法进行关联分析

    关联分析是一种在大规模数据集中寻找有趣关系的任务。 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出现在一块的物品的集合。 关联规则(associational rules): 暗示两种物品之间可能存在很强的关系。 关联分析(关联规则学习): 从大规模数据集中寻找物品间的

    2024年02月09日
    浏览(53)
  • 利用weka进行数据挖掘——基于Apriori算法的关联规则挖掘实例

    首先,如果不熟悉weka的使用的话,可以从我的git仓库里面拉取一下weka的相关教程,仓库里面还有包含此次实例的所有资源 我们可以在weka的官网上下载weka软件:weka官网 如果下载速度慢的话也可以直接从我的git仓库里面拉取这个软件,软件是win64位的weka-3-8-6 然后找到对应版

    2024年02月06日
    浏览(53)
  • 大数据关联规则挖掘:Apriori算法的深度探讨

    在本文中,我们深入探讨了Apriori算法的理论基础、核心概念及其在实际问题中的应用。文章不仅全面解析了算法的工作机制,还通过Python代码段展示了具体的实战应用。此外,我们还针对算法在大数据环境下的性能局限提出了优化方案和扩展方法,最终以独到的技术洞见进行

    2024年01月24日
    浏览(264)
  • 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度)

    目录 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度) 一、 关联规则挖掘简介 二、 数据集 与 事务 ( Transaction ) 概念 三、项 ( Item ) 概念 四、项集 ( Item Set ) 概念 五、频繁项集 六、数据集、事物、项、项集

    2024年02月05日
    浏览(69)
  • 《数据挖掘基础》实验:Weka平台实现分类算法

    进一步理解分类算法(决策树、贝叶斯),利用weka实现数据集的分类处理,学会调整模型参数,以图或树的形式给出挖掘结果,并解释规则的含义。 随机选取数据集(UCI或data文件夹),完成以下内容:(用三种方法:KNN、C4.5算法、贝叶斯算法) 文件导入与编辑 参数设置说

    2024年02月05日
    浏览(61)
  • 《数据挖掘基础》实验:Weka平台实现关联规则挖掘

    进一步理解关联规则算法(Apriori算法、FP-tree算法),利用weka实现数据集的挖掘处理,学会调整模型参数,读懂挖掘规则,解释规则的含义 (1)随机选取数据集为对象,完成以下内容:(用两种方法:Apriori算法、FP-tree算法) 文件导入与编辑; 参数设置说明; 结果截图;

    2024年02月02日
    浏览(58)
  • 数据挖掘实验:使用 Hadoop 实现 WordCount 应用

    使用 Hadoop 实现WordCount 应用。 WordCount 是一个最简单的分布式应用实例,主要功能是统计输入目录中所有单词出现的总次数,如文本文件中有如下内容: Hello world 则统计结果应为: Hello 1 world 1 WordCount 可以使用多种方式实现,本次实验内容选择使用 Hadoop 实现 WordCount 程序,并

    2023年04月17日
    浏览(54)
  • 数据挖掘|序列模式挖掘及其算法的python实现

    序列(sequence)模式挖掘也称为序列分析。 序列模式发现(Sequential Patterns Discovery)是由R.Agrawal于1995年首先提出的。 序列模式寻找的是事件之间在顺序上的相关性。 例如,“凡是买了喷墨打印机的顾客中,80%的人在三个月之后又买了墨盒”,就是一个序列关联规则。对于保险

    2024年04月09日
    浏览(60)
  • 数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘、图算法,搜索算法等

    【机器学习入门与实践】入门必看系列,含数据挖掘项目实战:模型融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战:数据融合、特征优化、特征降维、探索性分析

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包