《机器学习实战》11.Apriori算法进行关联分析

news2024/10/7 12:24:51

目录

使用Apriori算法进行关联分析

1 关联分析

2 Apriori原理

3 使用Apriori算法来发现频繁集

3.1 生成候选项集

3.2 组织完整的Apriori算法

4 从频繁项集中挖掘关联规则

5 示例:发现国会投票中的模式

6 示例:发现毒蘑菇的相似特征

7 本章小结


本章涉及到的相关代码和数据

使用Apriori算法进行关联分析

本章内容:

①Apriori算法

②频繁项集生成

③关联规则生成

④投票中的关联规则发现

从大规模数据集中寻找物品间的隐含关系被称为关联分析或是关联规则学习

1 关联分析

Apriori算法:

优点:易编码实现

缺点:在大数据集上可能较慢

使用数据类型:数值型或标称型数据

关联分析是一种在大规模数据集中寻找有趣关系的任务,这些关系可以有两种形式:频繁项集或关联规则

频繁项集是经常出现在一块的物品的集合,关联规则暗示两种物品之间可能存在很强的关系。

支持度和可信度可以来说明频繁的定义是啥,支持度是指数据集中包含该数据像的记录所占比例,可信度是针对一个关联规则所定义的,关联的物品的支持度/其中一个物品的支持度

2 Apriori原理

Apriori算法的一般过程

①收集数据:使用任意方法

②准备数据:任意数据类型都可以,因为我们只保存集合

③分析数据:任意方法

④训练算法:使用Apriori算法来找到频繁项集

⑤测试算法:不需要测试过程

⑥使用算法:用于发现频繁项集以及物品之间的关联规则

Apriori算法原理:如果某个项集是频繁的,那么他的所有子集也是频繁的

3 使用Apriori算法来发现频繁集

Apriori算法的两个输入参数分别是最小支持度和数据集。该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看那些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的几何进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录没去掉不满足最小支持度的项集。该过程重复到所有项集都被去掉。

3.1 生成候选项集

数据集扫描的伪代码:

对数据集中的每条交易记录tran:

对每个候选项集can:

    检查一下can是否是tran的子集

    如果是,则增加can的计数值

对每个候选项集:

    如果其支持度不低于最小值,则保留该项集

返回所有频繁项集列表

# 创建一个用于测试的简单数据集
def loadDataSet():
    return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]

# 构建集合C1
            #  数据集
def createC1(dataSet):
    # C1是大小为1的所有候选项集的集合
    C1=[]
    # 遍历所有交易记录
    for transaction in dataSet:
        # 遍历所有交易记录中的每一个项
        for item in transaction:
            if not [item] in C1:
                # 添加一个列表,为每个物品构建一个集合
                C1.append([item])
    C1.sort()
    # frozenset时不可变集合,将C1中的每一个物品变程不可变集合
    return list(map(frozenset,C1))


def scanD(D,Ck,minSupport):
    ssCnt={}
     #统计项集在数据中的出现次数
    for tid in D:
        for can in Ck:
            # issubset函数用于判断集合的所有元素是否都包含在指定集合中
            if can.issubset(tid):
                ssCnt[can] = ssCnt.get(can,0) + 1
                # if can not in ssCnt:
                # if not ssCnt.has_key(can):   python3中已经废除了has_key函数
                    # ssCnt[can]=1
                # else:
                    # ssCnt[can]+=1
    # print(list(D))
    numItems=float(len(D))
    # print(numItems)
    retList=[]
    supportData={}
    for key in ssCnt:
        support=ssCnt[key]/numItems
        if support>=minSupport:
            retList.insert(0,key)
        supportData[key]=support
    return retList,supportData

3.2 组织完整的Apriori算法

伪代码如下:

当集合中项的个数大于0时:

    构建一个k个项组成的候选项集的列表

    检查数据已确认每个项集都是频繁的

    保留频繁项集并构建k+1项组成的候选项集的列表

 

# 创建候选集Ck
def aprioriGen(Lk ,k):
    retList=[]
    lenLk=len(Lk)
    for i in range(lenLk):
        for j in range(i+1,lenLk):
            L1=list(Lk[i])[:k-2]
            L2=list(Lk[j])[:k-2]
            L1.sort()
            L2.sort()
            if L1==L2:
                # 集合的合并操作:|
                retList.append(Lk[i]|Lk[j])
    return retList

# 主函数
def apriori(dataSet,minSupport=0.5):
    C1=createC1(dataSet)
    D=list(map(set,dataSet))
    # print(list(D))
    L1,supportData=scanD(D,C1,minSupport)
    L=[L1]
    k=2
    while len(L[k-2])>0:
        Ck=aprioriGen(L[k-2],k)
        Lk,supK=scanD(D,Ck,minSupport)
        supportData.update(supK)
        L.append(Lk)
        k+=1
    return L,supportData

我们来测试一下这个算法:

# 测试函数
dataSet=loadDataSet()
print(dataSet)
C1=createC1(dataSet)
# print(C1)
L,suppData=apriori(dataSet)
L,suppData

得到的输出结果为:

4 从频繁项集中挖掘关联规则

对于关联规则,我们也有类似的量化方法,这种量化指标称为可信度。

关联规则的性质:如果某条规则并不满足最小可信度要求,那马尔该规则的所有自己也不会满足最小可信度要求

减少测试的规则数目:首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部只包含一个规则元素,然后对这些规则进行测试。接下来合并所有剩余规则来创建一个新的规则列表,其中规则右部包含两个元素。这种方法也叫做分级法。

# 主函数:
# 频繁项集列表 包含那些频繁项集支持数据的字典 最小可信度阙值
def generateRules(L,supportData,minConf=0.7):
    bigRuleList=[]
    for i in range(1,len(L)):
        for freqSet in L[i]:
            H1=[frozenset([item]) for item in freqSet]
            if(i>1):
                rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
            else:
                calcConf(freqSet,H1,supportData,bigRuleList,minConf)
    # 包含可信度的规则列表
    return bigRuleList

# 生成候选规则集合
def calcConf(freqSet,H,supportData,br1,minConf=0.7):
    prunedH=[]
    for conseq in H:
        conf=supportData[freqSet]/supportData[freqSet-conseq]
        if conf>=minConf:
            print(freqSet-conseq,'-->',conseq,'conf:',conf)
            br1.append((freqSet-conseq,conseq,conf))
            prunedH.append(conseq)
    return prunedH

# 对规则进行评估
def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.7):
    m=len(H[0])
    if(len(freqSet)>(m+1)):
        Hmp1=aprioriGen(H,m+1)
        Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)
        if(len(Hmp1)>1):
            rulesFromConseq(freqSet,Hmp1,supportData,br1,minConf)

测试一下算法

rules=generateRules(L,suppData)
rules

得到的输出结果为:

 

5 示例:发现国会投票中的模式

①收集数据:使用votesmart模块来访问投票纪录

②准备数据:构造一个函数来将投票转化为遗传交易记录

③分析数据:再python提示符下查看准备的数据以确保数据的准确性

④训练算法:使用之前写的apriori函数和generateRules函数来发现投票纪录中的有趣信息

⑤测试算法:没有测试过程

⑥使用算法:这里知识出于娱乐的目的,不过也可以使用分析结果来为政治竞选活动服务,或者预测官员会如何投票

该部分API已经不再进行使用,因此跳过

6 示例:发现毒蘑菇的相似特征

mushDatSet=[line.split() for line in open('mushroom.dat').readlines()]
L,suppData=apriori(mushDatSet,minSupport=0.3)
# print(L)
for item in L[1]:
    if item.intersection('2'):
        print (item)

得到的输出结果为:

7 本章小结

关联分析是用于发大数据集中元素间有趣关系的一个工具集,可以采用两种方式来量化这种有趣的关系。频繁项集和关联规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线上服务Java进程假死快速排查、分析

线上服务Java进程假死快速排查、分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响应请求了;该…

React18 基础入门API、JSX语法糖

文章目录一、react的一次使用react.development.jsreact-dom.development.jsReact.createElement()二、三个APIReact.createElement()ReactDOM.createRoot()root.render() 渲染页面三、JSX(JavaScript Syntax Extension)、babelbabelJSX使用注意事项一、…

mysql与磁盘的关系

1.如今一直在说mysql存储方式和磁盘的关系,但是现在都是硬盘存储啊 磁盘分为硬盘和软盘 硬盘结构(机械硬盘和固态硬盘)详解 硬盘的大小是使用"磁头数 x 柱面数 x 扇区数 x 每个扇区的大小 如下: 每个扇区的大小是固定的…

javaEE高阶---Spring MVC

一 : 什么是Spring MVC ? 1.1 概述 Spring MVC全称Spring Web MVC,又称为Spring Web,它是一个原始的基于Servlet API 的 web 框架.Q : 经典问题 : Spring/Spring Boot/Spring MVC 有什么区别 ? A : Spring,一般指代的是Spring Framework,它是一个开源…

业务数据分析-常见业务指标

目录 1、什么是指标? 2、以互联网电商数据为例分析常用的指标 3、如何选择指标 4、电商指标体系详细介绍 1、什么是指标? 我们说过分析的最终目的就是为了通过客观的数据去发现公司业务存在的问题,那怎么通过什么数据呢?业务…

连接MySQL问题的错题小集

目录 一. 连接不上数据库 踩坑 解决过程 二. Can‘t connect to MySQL server on ‘localhost:3306‘ (10061) 排查1:数据库没有启动 排查2:判断数据库是否存在 排查3:数据库没有启动 ​编辑 过程: 报错了,排…

12.Java 技术栈中间件优雅停机方案设计与实现全景图

Java 技术栈中间件优雅停机方案设计与实现全景图 本系列 Netty 源码解析文章基于 4.1.56.Final 版本 本文概要 在上篇文章 中笔者为大家详细介绍了 Netty 在处理连接关闭时的完整过程,并详细介绍了 Netty 如何应对 TCP 连接在关闭时会遇到的各种场景。 在连接关闭…

软件压力测试有哪些测试流程?软件测试报告收费情况

软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。通过给软件系统不断施压,强制其在极限条件下运行,以观察软件系统可运行到哪种程度,从而发现系统性能缺陷。测试人员根据测试过程进行总结和分析&#xf…

[附源码]Python计算机毕业设计Django个性化产品服务管理系统论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

电脑重装系统后序列号怎么查

最近很多网友都在问怎么看桌面操作系统序列号,我们安装系统的时候是需要知道,其实想要知道自己电脑的序列号非常简单的,网友们看看下面操作就知道了。 工具/原料: 系统版本:win10 型号:联想小新Air 13 Pro…

【矩阵论】4. 矩阵运算——广义逆——减号逆

4.5 减号逆 若 AAmnAA_{m\times n}AAmn​ 与 XXnmXX_{n\times m}XXnm​ ,有 AXAAAXAAAXAA ,则称 XXnmXX_{n\times m}XXnm​ 为A的减号逆(一号逆),记为 XA−A(1)XA^{-}A^{(1)}XA−A(1) 全体 A−A^{-}A− 的集合记为 A{1}{X∣AXAA}A^{\{1\}}\…

【自然语言处理概述】百度百科数据爬取

【自然语言处理概述】百度百科数据爬取 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设…

氮化镓(GaN)功率半导体之预测

前言 氮化镓(GaN)是一种非常坚硬且在机械方面非常稳定的宽带隙半导体材料。由于具有更高的击穿强度、更快的开关速度,更高的热导率和更低的导通电阻,氮化镓基功率器件明显比硅基器件更优越。 氮化镓晶体可以在各种衬底上生长&…

充分利用自动化测试的 10 个最佳实践

你试过吃带壳的坚果吗?如果是,我想这不是一次非常成功的经历。 虽然大家都知道坚果是非常健康和有营养的。矛盾的是,许多公司在实施测试自动化时没有考虑细微差别。每个人都知道它对身体有好处(就像吃坚果对我们健康有益一样&…

线上环境不要使用console.log,会导致页面卡顿,内存泄漏的原因

在我的这篇文章中分享了一个经验,就是vite打包之后会自动屏蔽所有的console.log打印的日志。 那么,在线上环境中不要使用 console.log 打印日志,已经成为共识,你知道是为什么么? 原因当然在于这个罪魁祸首 console 方…

深拷贝、浅拷贝的方法

目录 浅拷贝 深拷贝 与浅拷贝概念: 深浅拷贝出现的前提: 应用类型的数据(对象和数组) 深拷贝就是把目标对象里面的数据一个一个都复制下来,创建出一个一模一样的,存放地 址不一样,互不影响。…

【白嫖】如何底价续费服务器

目录 背景 问题 缓解方案 背景 现在各大云服务商的学生价服务器都已经关闭了,华为云、阿里云、百度云,以前都有学生价服务器,一年只要99。现在我找半天都没找到入口,而原价的一年得500块起步。。。 但是!&#xff0…

MySQL事务详解

目录 引例 什么是事务 一个完整事务所具有的四大属性 为什么会出现事务 事务常见操作方式 事务隔离级别 为什么要存在隔离级别 一致性 引例 如下图,是一个火车售票系统,当客户端A发现还有一张票时,将票卖掉,还没执行更新…

C++实现UDP可靠传输(二)

声明:禁止以任何形式转载本文章。本文章仅供个人学习记录与交流探讨,文章中提供的思路只是一种解决方案,代码也并非完整代码,如有需要,请自行设计协议并完成编程任务。 食用本文章之前,推荐阅读&#xff…

RKMEDIA--VENC/VDEC使用

前面两篇已经介绍了VI和VO的使用,本章节来介绍rkmedia且也是瑞芯微平台重点部分:编解码。 目录 一、简介 二、编解码能力 三、编码 编码初始化: 在初始化VENC时需要注意几点: venc编码帧率控制: 编码添加osd位图…