简单易学的机器学习算法——Apriori算法

Apriori算法详解及手写案例 大家好,我是W 在数据挖掘中有一种关联分析算法叫做Apriori算法,大家可能都听说过啤酒尿布的故事,购买尿布的爸爸很可能会再去购买一份啤酒来犒劳自己,在大数据的背景下已经无法使用人工的方法去发现海量商品间的关联性,所以需要算法的支持。Apriori就是关联性分析算法的祖师级算法。接下来我们从下面几个内容来讲Apriori算法:1、相関概念 2、算法原理 3、Apriori算法实现 - 7500行购物清单案例 4、算法优劣分析。 1、 相关概念 在学习算法前需要了解一些特定名词,以及一些评估频繁项集的几个指 阅读详情

本文转自:http://blog.youkuaiyun.com/google19890102/article/details/41448979

一、关联分析

    最初接触到数据挖掘的朋友肯定都听说过这样的一个案例:啤酒和尿布。大意是将啤酒和尿布放在一起的销售会提高。其实这背后隐含的原理就是关联分析,简单来讲就是啤酒和尿布之间存在着某种关联关系。关联关系时指从大规模的数据集中寻找物品之间的隐含关系,有时关联分析也可以称为关联规则学习。

二、关联分析的重要概念

    关联分析主要要做的工作是在大规模数据集上找到某些关系。主要有两种形式:
  • 频繁项集
  • 关联关系
    对于一个具体的例子:

(摘自《机器学习实战》)

1、频繁项集

    频繁项集是指经常出现在一起的物品的集合。如上面的例子中的是一个项集,要使得这样的项集成为频繁项集,是指该项集在数据集中出现的次数大于某个阈值,便被称为频繁项集。

2、关联关系

    关联关系是指两种物品之间可能存在很强的关系。如上面的例子中的的规则。

3、支持度

    支持度是指数据集中包含某个项集的记录所占的比例。如项集的支持度为。

4、可信度

    可信度是针对一条关联规则的,如关联规则的可信度为“支持度/支持度”,即为。

三、Apriori算法

1、Apriori算法

        Apriori 算法是关联分析的重要算法, Apriori 算法主要是来寻找频繁项集,采用的方法是查找出所有的可能,如下图:

(摘自《机器学习实战》)
如上图所示,四种物品:0,1,2,3。列出所有的组合:、、...、。这里就会出现一个问题,如果物品的数目变大,这种组合是呈现指数级的增长的:,其中为物品的数目,如何避免这样的指数增长对于 Apriori 算法的成功具有很重要的意义。Apriori原理就解释了这样的事情。

2、Apriori原理

    如何避免指数级增长,我们应该尽量去减少一些不必要的结点, Apriori 原理是说如果某个项集是频繁的,那么他的所有子集也是频繁的。其逆否命题为:如果一个项集是非频繁的,那么他的所有超集也是非频繁的。使用这个原理就可以避免指数级增长,原理如下图所示:

(摘自《机器学习实战》)

四、使用Apriori算法发现频繁项集

     在理解了上面的过程后,我们不难发现计算过程就是不断查找项集。首先,定义一个被称为最小支持度的量,当成阈值使用。大于这个阈值便是频繁项集,否则不是。接下来就开始计算,首先生成只含有单项的项集,如上图所示:、、和,并计算每个项集的支持度,与阈值比对。如上图所示都为频繁项集;接着生成含有两个元素的项集,如:等等,结果发现不是频繁项集,则去除掉。继续下去,一直到没有项集为止。上述的过程可以抽象为:其中表示候选集,表示频繁项集。

(实现过程)
五、从频繁项集中挖掘关联规则

六、Matlab实现

1、频繁项集

主函数
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %% 主函数  
  2. clear all;  
  3. clc;  
  4.   
  5. %% 导入数据  
  6. % 数据集中的0表示无  
  7. dataSet = load('data.txt');  
  8.   
  9. % %构建第一个候选集C1  
  10. % C1 = createC1(dataSet);  
  11. %   
  12. % %构建第一个频繁项集L1  
  13. % [retList, supportData] = scanD(dataSet, C1, 0.7)  
  14.   
  15. % 调用产生频繁项集  
  16. [L, supportData] = apriori(dataSet, 0.5);  

查找候选集C1
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %% 查找候选集C1  
  2. function [ C1 ] = createC1( dataSet )  
  3.     C1 = unique(dataSet);%取得所有相异元素  
  4. end  

生成频繁项集
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %% 计算频繁项集L1  
  2. function [ retList, supportData ] = scanD( dataSet, Ck, minSupport )  
  3.     [m,n] = size(Ck);  
  4.     if m==0  
  5.         retList = [];  
  6.         supportData = 0;  
  7.     else  
  8.         if n==1  
  9.             Ck(Ck==0)=[];%将候选集中的0去掉  
  10.             [m,n] = size(Ck);%获得候选集的大小,注意候选集的大小  
  11.             [m_1,n_1] = size(dataSet);%获得整个数据集的大小  
  12.             %% 统计候选集中的元素在dataSet中出现的次数  
  13.             dataNum = zeros(m,1);  
  14.             for i = 1:m%行数为候选集中元素的个数  
  15.                 for j = 1:m_1  
  16.                     if all(ismember(Ck(i,:), dataSet(j,:)))==1  
  17.                         dataNum(i,1) = dataNum(i,1)+1;  
  18.                     end  
  19.                 end  
  20. %           if all(ismember(Ck(i,:), dataSet))==1  
  21. %               dataNum(i,1) = dataNum(i,1)+1;  
  22. %           end  
  23.             end  
  24.         else  
  25.             [m,n] = size(Ck);%获得候选集的大小,注意候选集的大小  
  26.             [m_1,n_1] = size(dataSet);%获得整个数据集的大小  
  27.             %% 统计候选集中的元素在dataSet中出现的次数  
  28.             dataNum = zeros(m,1);  
  29.             for i = 1:m%行数为候选集中元素的个数  
  30.                 tmp = Ck(i,:);  
  31.                 tmp(tmp==0)=[];%将候选集中的0去掉  
  32.                 for j = 1:m_1  
  33.                     if all(ismember(tmp, dataSet(j,:)))==1  
  34.                         dataNum(i,1) = dataNum(i,1)+1;  
  35.                     end  
  36.                 end  
  37. %           if all(ismember(Ck(i,:), dataSet))==1  
  38. %               dataNum(i,1) = dataNum(i,1)+1;  
  39. %           end  
  40.             end  
  41.         end  
  42.         %% 计算每个元素出现的比率  
  43.         numItems = length(dataSet);  
  44.         supportData = zeros(length(dataNum), 1);  
  45.         retListSize = 1;  
  46.         for i = 1:length(dataNum)  
  47.             supportData(i, 1) = dataNum(i, 1)/numItems;  
  48.             if supportData(i ,1) >= minSupport  
  49.                 retList(retListSize, :) = Ck(i, :);  
  50.                 retListSize = retListSize+1;  
  51.             end  
  52.         end  
  53.     end  
  54. end  

生成后续的候选集
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function [ retList ] = aprioriGen( Lk )  
  2.     [m,n] = size(Lk);%得到Lk矩阵的大小  
  3.     r = 1;  
  4.     for i = 1:m-1  
  5.         for j = i+1:m  
  6.             retListTmp_1(r,:) = [Lk(i,:),Lk(j,:)];  
  7.             tmp = unique(retListTmp_1(r,:));  
  8.             if length(tmp)<2*n  
  9.                 tmp(1,2*n) = 0;%补0  
  10.             end  
  11.             retListTmp_2(r,:) = tmp;  
  12.             r = r+1;  
  13.         end  
  14.     end  
  15.     if m~=1  
  16.         retList=unique(retListTmp_2,'rows');  
  17.     else  
  18.         retList=[];  
  19.     end  
  20. end  

总的生成频繁项集的模块
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %% 控制整个频繁项集的生成  
  2. function [ L, supportData ] = apriori( dataSet, minSupport )  
  3.     C1 = createC1(dataSet)%生成最初的候选集  
  4.     [L1, supportData] = scanD(dataSet, C1, minSupport)%生成最初的频繁项集  
  5.     L = L1;  
  6.     while ~isempty(L)  
  7.         Ck = aprioriGen(L)  
  8.         [Lk, supportData] = scanD(dataSet, Ck, minSupport)  
  9.         L = Lk;  
  10.     end  
  11. end  

实现
第一步:

第二步:

第三步:

第四步:




在维基百科中的图解例子,

假设有一个数据库D,其中有4个事务记录,分别表示为:

TID Items
T1I1,I3,I4
T2I2,I3,I5
T3I1,I2,I3,I5
T4I2,I5

这裡预定最小支持度minSupport=2,下面用图例说明算法运行的过程:

TID Items
T1I1,I3,I4
T2I2,I3,I5
T3I1,I2,I3,I5
T4I2,I5

扫描D,对每个候选项进行支持度计数得到表C1:

项集 支持度计数
{I1}2
{I2}3
{I3}3
{I4}1
{I5}3

比较候选项支持度计数与最小支持度minSupport,产生1维最大项目集L1:

项集 支持度计数
{I1}2
{I2}3
{I3}3
{I5}3

由L1产生候选项集C2:

项集
{I1,I2}
{I1,I3}
{I1,I5}
{I2,I3}
{I2,I5}
{I3,I5}

扫描D,对每个候选项集进行支持度计数:

项集 支持度计数
{I1,I2}1
{I1,I3}2
{I1,I5}1
{I2,I3}2
{I2,I5}3
{I3,I5}2

比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2:

项集 支持度计数
{I1,I3}2
{I2,I3}2
{I2,I5}3
{I3,I5}2

由L2产生候选项集C3:

项集
{I2,I3,I5}

扫描D,对每个候选项集进行支持度计数:

项集 支持度计数
{I2,I3,I5}2

比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:

项集 支持度计数
{I2,I3,I5}2

算法终止。


机器学习—关联规则分析之Apriori算法及其python实现 文章目录引言一、一些概念1.关联规则的一般形式2.最小支持度和最小置信度3.项集4.支持度计数二、Apriori算法:使用候选产生频繁项集1.Apriori的性质2.Apriori算法实现过程3.Apriori算法实现过程实例三.Apriori算法—python实现 引言   关联规则分析是数据挖掘中最活跃的研究方法之一,目的是在一个数据集中找到各项之间的关联关系,而这种关系并没有在数据中直接体现出来。以超市的销售数据为例,当存在很多商品时,可能的商品组合数量达到了令人望而却步的程度,这是提取关联规则的最大 阅读详情

相关推荐

机器学习9—关联分析之Apriori算法和FP-Growth算法

FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高。FP-Tree(频繁模式树):是一个树形结构,包括一个频繁项组成的头表,一个标记为null的根结点,它的子结点为一个项前缀子树的集合。频繁项:单个项目的支持度超过最小支持度则称其为频繁项(frequentitem)。频繁头表:频繁项头表的每个表项由两个域组成,一个是项目名称,一个是链表指针,指向下一个相同项目名称的结点。生成FP-Growth树。......

ex_6450的博客 7613

关联规则挖掘——Apriori算法的基本原理以及改进

问题引入关联规则挖掘发现大量数据中项集之间有趣的关联或者相互联系。关联规则挖掘的一个典型例子就是购物篮分析,该过程通过发现顾客放入其购物篮中不同商品之间的联系,分析出顾客的购买习惯,通过了解哪些商品频繁地被顾客同时买入,能够帮助零售商制定合理的营销策略。购物篮事务的例子如下图所示: 例如:在同一次去超级市场时,如果顾客购买牛奶,同时他也购买面包的可能性有多大? 通过帮助零售商有选择地经销

zhazhayaonuli的博客 6万+

【机器学习实战-python3】使用Apriori算法进行关联 分析

本篇的数据和代码参见:https://github.com/stonycat/ML-in-Action一、背景 从大规模数据集中寻找物品间的隐含关系被称作关联分析(association analysis)或者关联规则学习(association rule learning)。 关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项 集或者关联规则。频繁项集(freq

修行的猫ZQ 3万+

学习序列模式挖掘--Apriori算法

学习序列模式挖掘 1.1引言 已Apriori算法为例,此算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时,通常会使用先验知识或者假设,这被称作"一个先验"(a priori)。Apriori算法的名字正是基于这样的事实:算法使用频繁项集性质的先验性质,即频繁项集的所有非空子集也一定是频繁的。Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项

perfectzxiny的博客 2002

Apriori算法通俗讲解

一、Apriori算法简介 Apriori算法用于解决大规模数据集的关联分析问题。关联分析(association analysis)或关联规则学习(association rule learning)是从大规模数据集中寻找物品间的隐含关系。但是,寻找物品的不同组合是一项十分耗时的任务,计算代价高,蛮力搜索并不能解决问题,所以需要更智能的方法在合理时间范围内找到频繁项集。Apriori算法就是解决这个问题的。 二、关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务。...

u012494321的博客 1万+

【PHP-ML】使用Apriori算法挖掘用户购物习惯

title: 【PHP-ML】使用Apriori算法挖掘用户购物习惯 date: 2018-01-12 categories: 技术 tags: PHP PHP-ML 机器学习 学习笔记 &lt;?php require_once __DIR__ . '/vendor/autoload.php'; use Phpml\Association\Apriori; // 4位用户购买清单 $s...

水行云起 1362

Apriori(关联分析算法)

关联分析又称关联挖掘,就是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构。

weixin_44757834的博客 2万+

机器学习算法(一)——关联规则Apriori算法及R语言实现方法

关联规则算法算是一种十分常用的机器学习算法,无论是面试还是日后工作中都会经常出现,那么本篇小博就记录一下自己学习关联规则经典算法Apriori的笔记。 1、概述 Apriori算法是用一种称为逐层搜索的迭代方法,从项集长度k=1开始,选出频繁的k=1项集,根据先验性质:频繁项集的子集一定是频繁的(逆否命题:非频繁项集的超集一定是非频繁的,通俗的说就是某件事发生的概率很低,比这件事发生条件更严苛

AugustWind的专栏 1万+

数据挖掘十大算法--Apriori算法

Apriori 算法是一种用于关联规则挖掘的经典算法。它用于在大规模数据集中发现频繁项集,进而生成关联规则。关联规则揭示了数据集中项之间的关联关系,常被用于市场篮分析、推荐系统等应用。Apriori 算法的主要优点是它相对简单,并且易于理解和实现。然而,在处理大规模数据集时,它可能面临性能挑战。后续的改进算法,如 FP-Growth 等,通过不同的方式优化了频繁项集的发现过程,提高了算法的效率。

Wzideng@qq.com 1万+

《机器学习实战》笔记之十一——使用Apriori算法进行关联分析

第十一章 使用Apriori算法进行关联分析 11.1 关联分析 11.2 Apriori原理 11.3 使用Apriori算法来发现频繁集 11.4 从频繁项集中挖掘关联规则 11.5 示例:发现毒蘑菇的相似特征

无限大地NLP_空木的专栏 2万+

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

经典机器学习算法的Python实现

经典机器学习算法的Python实现 去发现同类优质开源项目:https://gitcode.com/ 简介 本资源库提供了机器学习领域中一系列经典算法的Python实现,旨在帮助初学者更好地理解并掌握这些核心算法的原理和应用。涵盖的分类算法、聚类算法以及关联规则挖掘算法等,都是机器学习中不可或缺的部分。 内容 分类算法:包括但不限于决策树、支持向量机(SVM)、朴素贝叶斯等。 聚类算法:如K均值...

gitblog_06710的博客 944

【LaTeX PPT模板集】Beamer主题与配色使用教程

【LaTeX PPT模板集】Beamer主题与配色使用教程

Xminyang的博客 1万+

python实现Apriori算法

★ 关联分析: 从大规模数据集中寻找物品间的隐含关系被称作关联分析。而寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高。Apriori算法正是来解决这一问题。 物品之间的关系一般可以有两种形式:频繁项集和关联规则。 频繁项集:数据集中经常出现在一块的物品的集合。 关联规则:两种物品之间可能存在很强的关系。 ...

weixin_42051109的博客 4万+

Windows BITS服务:后台智能文件传输技术详解

后台文件传输技术是现代IT基础设施中的关键组件,Windows BITS(Background Intelligent Transfer Service)作为微软原生解决方案,通过队列管理和智能调度实现高效数据传输。其核心技术原理包括分块传输、断点续传和带宽自适应,能够根据网络状况动态调整传输速率(默认占用空闲带宽的80%)。在工程实践中,BITS特别适用于企业软件分发和自动化数据采集场景,通过PowerShell命令即可实现高优先级传输和代理配置。相比传统FTP方案,BITS在跨国文件传输中将失败率从30

weixin_42116058的博客 273

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1823

机器学习实验报告——APRIORI算法

1.4.1关联规则关联规则是形如X=>Y的蕴含式,其中X、Y分别是一事务的真子集,且X∩Y=Φ。X称为规则的前提,Y称为规则的结果。关联规则反映出X中的项目在事务中出现时,Y中的项目也跟着出现的规律。本次实验主要探讨了关联规则挖掘领域中的经典算法——Apriori算法。首先介绍了Apriori算法的背景,该算法填补了关联规则挖掘领域的研究空白,并为大规模数据集中频繁项集和关联规则的发现提供了高效的解决方案。

m0_64198455的博客 3014

OV5640调试大坑,关于binning、RES分辨率与EV曝光

OV5640在使用binning模式时,必须考虑使用场景,分辨率下降叠加动态范围压缩,会使目标对象细节在高光环境下大量丢失,2x2的binning模式,分辨率会远低于感光面积的1/4。

chongyun_的专栏 1822

【ML】Apriori算法原理及代码实现

Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果我们找到了频繁出现的数据集,那么对于超市,我们可以优化产品的位置摆放,对于电商,我们可以优化商品所在的仓库位置,达到节约成本,增加经济效益的目的。下面我们就对Apriori算法做一个总结。Aprior算法是一个非常经典的频繁项集的挖掘算法,很多算法都是基于Aprior算法而产生的,包括FP-Tree,GSP, CBA等。

sikh_0529的博客 1236

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4606

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1054

Apriori算法

1 关联分析概述 1.1 关联分析 关联分析(association analysis)是一种在大规模数据集中寻找有趣关系的非监督学习算法。 这种关系可以有两种形式: 频繁项集或者关联规则。 频繁项集(frequent item sets)是经常出现在一块的物品的集合, 关联规则(association rules)暗示两种物品之间可能存在很强的关系。 关联分析的一个典型例子是购物篮分析。 交易号码 商品 001 豆奶,莴苣 002 莴苣,尿布,啤酒,甜菜 003 豆奶,尿布,啤酒,橙汁 004 莴苣,

积一时之步,臻千里之遥程 3952

【网络与爬虫 61】移动端App爬虫终极指南:Android-iOS应用数据提取黑科技全解析

本文全面解析移动端App爬虫技术,涵盖Android和iOS两大平台的数据提取方法。从基础的网络抓包到高级的代码注入,从自动化测试框架到反调试技术绕过,为开发者提供移动端数据采集的完整解决方案和实战经验。

熵数实验室 3022

从Apriori到MS-Apriori算法

前言 最近的几个月一直在研究和学习各种经典的DM,机器学习的相关算法,收获还是挺多的,另外还整了一个DM算法库,集成了很多数据挖掘算法,放在了我的github上,博友的热度超出我的想象,有很多人给我点了star,在此感谢各大博友们,我将会继续更新我的DM算法库。也许这些算法还不能直接拿来用,但是可以给你提供思路,或变变数据的输入格式就能用了。好,扯得有点远了,现在说正题,本篇文章重新回到讲述Ap

走在前往架构师的路上 5221

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关联规则Apriori算法

参考《【机器学习实战-python3】使用Apriori算法进行关联 分析》,《 使用Apriori进行关联分析(一)》,《使用Apriori进行关联分析(二)》,《关于apriori算法中置信度、支持度怎么理解的问题》 文章目录1. 频繁项集(frequent item sets)1.1 频繁项集的支持度(support)和阈值1.2 频繁项集的特点1.3 频繁项集计算方法 关联规则的目的在于分析出经常出现在一起的物品的集合之间的关系。Apriori算法本质由两部分组成,分别是 频繁项集(frequ.

UncleDong的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: ch9.3 过滤器和监听器
下一篇: ch10.表达式语言
thystar
博客等级 码龄17年 407粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值