关联规则(理论及实例)

news2024/11/19 16:25:18

目录

一、啤酒和尿布的故事

二、理论

三、实例

1. 自定义数据集

2. 数据需转换成one-hot编码

3.电影题材关联分析


一、啤酒和尿布的故事

        在美国,一些年轻的父亲下班后经常要到超市去购买婴儿尿布,超市因此发现一个规律,在购买婴儿尿布的年轻父亲们中,有30%~40%的人同时要买一些啤酒。超市随后调整了货架的摆放,把尿布和啤酒放在一起,明显增加了销售额。

        若两个或多个变量的取值之间存在某种规律性,就称为关联

        关联规则是寻找在同一个事件中出现的不同项的相关性,比如在一次购买活动中所买的不同商品的相关性。

        "在购买计算机的顾客中,有30%的人也同时购买了打印机”

二、理论

编号牛奶果冻啤酒面包花生酱
T111001
T201011

        一个样本称为一个“事务” 

        每个事务由多个属性来确定,这里的属性称为“项”

        多个项组成的集合称为“项集”

        由K个项构成的集合

        {牛奶},{啤酒}....称为1项集

        {牛奶,啤酒}....称为2项集

        ......3项集,4项集,5项集

         x-->y的含义:x和y是项集,x称为规则前项,y称为规则后项。

        有必要说明一下:事务包含其涉及到的项目,而不包含项目的具体信息。在超市的关联规则挖掘问题中事务是顾客一次购物所购买的商品,但事务并不包括这些商品的具体信息,如商品的数量,价格,用途等等。
         

      支持度(support):一个项集或者规则在所有事务中出现的频率,\sigma(x):表示项集X的支持度计数

       项集X的支持度S(x) = \sigma(x)/N

        规则x-->y表示物品集x对物品集y的支持度,也就是x和y同时出现的概率。某天共有100个顾客到商场购买物品,其中有30个顾客同时购买了啤酒和尿布,那么上述的关联规则的支持度就是30%。        

        置信度:确定y在包含x的事务中出现的频繁程度。C(x\rightarrow y)=\sigma(x\cup y)/\sigma(x)P(y|x)=p(xy)/p(x)

        置信度反应了关联规则的可信度-购买了项目集x的商品的顾客同时也购买了y中商品的可能性有多大。

        购买薯片的顾客中有50%的人购买了可乐,则置信度为50%。

        例:

交易ID购买的商品
1ABC
2AC
3AD
4BEF

         (x,y)--->z:支持度:交易中包含{x,y,z}的可能性

                        置信度:包含{x,y}的交易中也包含z的条件概率

        设最小支持度50%,最小可信度为50%,则可以得到:
        A-->C(50%,66.6%)        C-->A(50%,100%)

        若关联规则x-->y的支持度和置信度分别大于或等于用户指定的最小支持率minsupport,和最小置信度minconfidence,则称x-->y为强关联规则,否则为弱关联规则。

        提升度(lift):物品集A的出现对物品集B的出现概率发生了多大的变化。

        lift(A\rightarrow B)=confidence(A\rightarrow B)/support(B)=p(B|A)/p(B)

        现在有1000个消费者,有500人购买了茶叶,其中有450人同时购买了咖啡,另外50人没有。由于confidence(茶叶-->咖啡)=450/500=90%,由此可能会认为喜欢喝茶的人往往喜欢喝咖啡。但是如果另外没有购买茶叶的500人,其中同样也有450人购买了咖啡同样很高的置信度90%,由此得到不爱喝茶的人也爱喝咖啡。这样看来,其实是否购买咖啡,与有没有购买茶叶没有关联,两者是相互独立的,其提升度90\%/[(450+450)/1000]=1

        由此可见,lift正是弥补了confidence的这一缺陷,if lift = 1,x与y独立,x对于y的出现的可能性没有提升作用,其值越大(lift>1),则表明x对y的提升程度就越大,也表明关联性越强。

三、实例

        首先

        使用mlxtend工具包得出频繁项集与规则

        pip install mlxtend

1. 自定义数据集

import pandas as pd
from mlxtend.frequent_patterns import apriori  
from mlxtend.frequent_patterns import association_rules

### 自定义一份购物数据集
data = {'ID':[1,2,3,4,5,6],
        'Online':[1,0,0,1,1,1],
        'Potato':[1,1,0,1,1,1],
        'Burger':[1,1,0,0,1,1],
        'Milk':[0,1,1,1,0,1],
        'Beer':[0,0,1,0,1,0]}
df = pd.DataFrame(data)
df = df[['ID','Online','Potato','Burger','Milk','Beer']]
print(df)

        

        设置支持度(support)来选择频繁集

            选择最小支持度为50%

            apriori(df,min_support=0.5,use_clonames=true)

frequent_itemsets = apriori(df[['Online','Potato','Burger','Milk','Beer']],min_support=0.50,use_colnames=True)
print(frequent_itemsets)

         计算规则

         association_rules(df,metric='lift,min_threshold=1)

            可以指定不同的衡量标准与最小阈值

rules = association_rules(frequent_itemsets,metric='lift',min_threshold=1)
print(rules)

        针对选择 

rules [(rules['lift'] > 1.125) & (rules['confidence'] > 0.8)]

这几条结果就比较有价值了

洋葱和马铃薯 汉堡和马铃薯 可以搭配着来卖

如果洋葱和汉堡在购物篮中,顾客买马铃薯的可能性也比较高,如果篮子里面没有,可以推荐一下

        2. 数据需转换成one-hot编码

        在实际的数据中,数据并不是Apriori工具包直接能使用的数据格式,需要先转换成数值的形式。

retail_shopping_basket = {'ID':[1,2,3,4,5,6],
                          'Basket':[
                                ['Beer','Diaper','Pretzels','Chips','Aspirin'],
                                ['Diaper','Beer','Chips','Lotion','Juice','BabyFood','Milk'],
                                ['Soda','Chips','Milk'],
                                ['Soup','Beer','Diaper','Milk','IceCream'],
                                ['Soda','Coffee','Milk','Breed'],
                                ['Beer','Chips']
                            ]
                        }
retail = pd.DataFrame(retail_shopping_basket)
retail = retail[['ID','Basket']]
pd.options.display.max_colwidth=100
print(retail)

         数据集中都是字符串组成的,需要转换成数值编码

#先把ID拿出来
retail_id = retail.drop('Basket',axis=1)
print(retail_id)
retail_Basket = retail.Basket.str.join(',')
print(retail_Basket)

retail_Basket = retail_Basket.str.get_dummies(',')
print(retail_Basket)

#将ID加入进去
retail = retail_id.join(retail_Basket)
print(retail)

frequent_itemsets_2 = apriori(retail.drop('ID',axis=1),use_colnames=True)
print(frequent_itemsets_2)

 

如果光考虑支持度support(X-->Y),[Beer,Chips]和[Beer,Diaper]都是很频繁的,哪一种组合更相关呢?

        看提升度

print(association_rules(frequent_itemsets_2,metric='lift'))

        3.电影题材关联分析

        moiveLen数据集,广泛用于推荐系统。读者可以自行下载。

        

uname = ['Movie_id', 'title', 'genres']
movies = pd.read_table(r'ml-1m\movies.dat', sep='::', header=None, names=uname,engine='python',encoding='ISO-8859-1')
print(movies.head(10))

 

        数据中包括电影名字与电影类型的标签,第一步还是先转换成one-hot格式 

movies_ohe = movies.drop('genres',axis=1).join(movies.genres.str.get_dummies())
print(movies_ohe.head(10))

        将ID和电影名字都作为索引

movies_ohe.set_index(['Movie_id','title'],inplace=True)
print(movies_ohe.head(10))

frequent_itemsets_movies = apriori(movies_ohe,use_colnames=True,min_support=0.025)
print(frequent_itemsets_movies)

 

rules_movies = association_rules(frequent_itemsets_movies,metric='lift',min_threshold=1.25)
print(rules_movies)

rules_movies[(rules_movies.lift>3)].sort_values(by=['lift'],ascending=False)

        Advebture 和 Action 这两个题材是最相关的了,常识也可以分辨出来 

#查看相关题材电影
movies[(movies.genres.str.contains('Adventure')) & (~movies.genres.str.contains('Action'))]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

        

                               

 

        

        

        

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

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

相关文章

scala实现通过Spark统计人均登录次数最终写入MySQL

谨以此博客作为记录 小编这里用的版本是&#xff1a; <hadoop.version>2.7.7</hadoop.version> <spark.version>2.4.5</spark.version> <scala.version>2.12.10</scala.version> 如果没用到Hadoop可以忽略 步骤 准备数据&#xff0c;知道…

信息系统项目管理师——第18章项目绩效域管理(二)

项目工作绩效域 预期目标 高效且有数的项目绩效 2.适合项目和环境的项目过程 3.干系人适当的沟通和参与 4.对实物资源进行了有效管理 5.对采购进行了有效管理 6.有效处理了变更 7.通过持续学习和过程改进提高了团队能力 绩效要点 1.项目过程 2.项目制约因素 3.专注于工作过…

[调度算法]

目录 一. 先到先服务(FCFS)二. 短作业优先(SJF)三. 高响应比优先(HRRN)四. 时间片轮转调度算法(RR)五. 优先级调度算法六. 多级反馈队列调度算法七. 多级队列调度算法 \quad 一. 先到先服务(FCFS) \quad 比如你要买一杯奶茶, 在你前面的要买20杯奶茶, 那么你就要等很久 \quad …

pwn学习笔记(7)--堆相关源码

相关源码&#xff1a; 1. chunk 相关源码&#xff1a; ​ 对于用户来说&#xff0c;只需要确保malloc()函数返回的内存不会发生溢出&#xff0c;并且在不用的时候使用free() 函数将其释放&#xff0c;以后也不再做任何操作即可。而对于glibc来说’它要在用户第一次调用malloc…

【QT+QGIS跨平台编译】056:【pdal-dimbuilder+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal介绍二、dimbuilder介绍三、pdal下载四、文件分析五、pro文件六、编译实践七、生成Dimension.hpp八、生成pdal_features.hpp一、pdal介绍 PDAL(Point Data Abstraction Library)是一个开源库,用于处理点云数据的获取、过滤、转换、分析和…

【opencv】示例 3calibration.cpp 利用OpenCV库进行三路相机校准

此代码是一个利用OpenCV库进行三路相机校准的C程序。这个示例程序主要用于校准水平摆放的三台相机。 以下是关键函数及其功能的简要总结&#xff1a; help(char** argv): 显示程序的使用方法。calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>&…

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…

07-app端文章搜索

app端文章搜索 1) 今日内容介绍 1.1)App端搜索-效果图 1.2)今日内容 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联…

51单片机使用uart串口和助手简单调试

基础知识 参考 特殊功能寄存器PCON&#xff08;控制波特率是否加倍SMOD&#xff09;、TMOD&#xff08;T0,T1计时器的功能方式&#xff09;、TCON&#xff08;T0,T1计时器的控制&#xff09;、串口中断、SCON&#xff08;串口数据控制寄存器&#xff09; 关闭定时器1中断&…

Cisco交换机安全配置

Cisco交换机安全配置 前提 我们以下命令一般都要先进入Config模式 S1> enable S1# conf t S1(config)#端口安全保护 禁用未使用的端口 以关闭fa0/1到fa0/24的端口为例 S1(config)# interface range fa0/1-24 S1(config-if-range)# shutdown缓解MAC地址表攻击 防止CAM…

快递费用一目了然:taobao.item_fee API在电商中的应用

taobao.item_fee API在电商中的应用主要体现在精准计算快递费用&#xff0c;从而为用户提供一个更加透明和便捷的购物体验。这一接口允许淘宝或天猫的开发者根据商品ID、收货地址等信息&#xff0c;精确计算商品的快递费用。对于用户而言&#xff0c;这意味着在购物过程中能够实…

【考研数学】如何做题,做什么题,才能打好基础?

还是建议做经验贴推荐的练习册去巩固基础&#xff01;毕竟目的是考研&#xff0c;考研习题册出的题目更加有针对性&#xff0c;如果拿课后习题练手的话还是差一些强度的&#xff01; 看到网上说1800适合零基础&#xff0c;兴致勃勃下单&#xff0c;买回来发现自己练零基础的题…

学习 Git 基础知识 - 日常开发任务手册

欢迎来到我关于 Git 的综合指南&#xff0c;Git 是一种分布式版本控制系统&#xff0c;已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手&#xff0c;理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

Docker Desktop 不支持 host 网络模式

先把这个结论的放在前面&#xff0c;直接访问链接就能看到官方文档中已经明确说了不支持。 参考链接&#xff1a;docker desktop for windows 不支持 host 网络模式 以前对于 docker 的网络模式&#xff0c;一直只是了解&#xff0c;没有亲自尝试过。结果今天在尝试 docker 的 …

06 - RS 触发器

---- 整理自B站UP主 踌躇月光 的视频 1. R-S 触发器电路电路 RSQQ’00QQ’011010011100 刚上电时&#xff0c;输出的状态是不确定的&#xff0c;只确定两个输出是相反的。 S0&#xff0c;R0 时候&#xff0c;Q 状态保持不变 S1&#xff0c;R0 时候&#xff0c;Q 状态被设置为 1…

X.509数字证书的结构与解析

1、什么叫数字签名 数字签名&#xff1a; 将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证&#xff1a;只要改动报文中任何一位&#xff0c;重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。 将该报文摘要值用发送者的私…

关于Idea无法正常启动

编辑这个文件 最后一行 加上 pause 双击文件 会显示报错信息

4.4学习总结

一.线段树概念 一.定义: 线段树是一种二叉搜索树&#xff0c;而二叉搜索树&#xff0c;首先满足二叉树&#xff0c;即每个结点最多有两颗子树&#xff0c;并且是一颗搜索树&#xff0c;我们要知道&#xff0c;线段树的每个结点都存储了一个区间&#xff0c;也可以理解成一个线…

使用git 和 github协作开发

文章目录 github浏览器汉化插件github新建仓库git安装以及ssh配置团队创建及基本命令的使用创建团队基本命令 分支管理快速切换远程仓库地址 如何使用git && github进行协作开发&#xff0c;包括git常见基础命令 github浏览器汉化插件 在刚开始使用github的时候&#…