从大规模数据集中寻找物品间的隐含关系被称作关联分析或者关联学习。本章将主要介绍Apriori算法来解决问题。
Apriori算法
优点:易编码实现
缺点:在大数据集上可能较慢
适用数据类型:数值型或者标称型数据
关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集或者关联规则。频繁项集(frequent item sets)是经常出现在一块的物品的集合,关联规则(association rules)暗示两种物品之间可能存在很强的关系。
一个项集的支持度(support)被定义为数据集中包含该数据集的记录所占的比例。
可信度和置信度(confidence)是针对一条诸如{尿布}→{葡萄酒}的关联规则来定义的。
支持度和可信度是用来量化关联分析是否成功的方法。下一节会详细分析这种情况并讨论Apriori原理,该原理会减少关联规则学习时所需的计算量。
Apriori原理是说如果某个项技术频繁的,那么他的所有子集也是频繁的。这个原理直观上并没有什么帮助,但是如果反过来看就有用了,也就是说一个项集非频繁集,那么他的所有超集也是非频繁的。
下面会创建一个用于创建初始集合的函数,也会创建一个通过数据集以寻找交易记录子集的函数,伪代码大致如下:
对数据集中的每条交易记录tran
对每个候选项集can
检查一下can是否是tran的子集:
如果是,则增加can的计数值
对每个候选项集:
如果其支持度不低于最小值,则保留该项集,返回所有频繁项集列表
from numpy import *
def loadDataSet():
return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
def createC1(dataSet):#构建集合C1,存放大小为1的所有候选键的集合
C1 = []#空列表
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset, C1)#构建不变集合,能作为字典中的key
def scanD(D, Ck, minSupport):#数据集,候选项集Ck,最小支持度
ssCnt = {}#空字典
for tid in D:
for can in Ck:
if can.issubset(tid):#s.issubset(t) 如果s是t的子集,则返回True,否则返回False
if not ssCnt.has_key(can): ssCnt[can]=1#has_key:如果键在字典里返回true,否则返回false。
else: ssCnt[can] += 1
numItems = float(len(D))
retList = []#满足最小支持度的集合
supportData = {}#最频繁项集的支持度
for key in ssCnt:
support = ssCnt[key]/numItems
if support >= minSupport:#不满足最小支持度要求的不会输出
retList.insert(0,key)
supportData[key] = support
return retList, supportData
下面看看实际运行效果:
In [20]: import apriori
...: dataSet = apriori.loadDataSet()
...: dataSet
...:
Out[20]: [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
In [21]: C1 = apriori.createC1(dataSet)#构建第一个候选集
...: C1
...:
Out[21]:
[frozenset({
1}),
frozenset({
2}),
frozenset({
3}),
frozenset({
4}),
frozenset({
5})]
In [22]: D = map(set,dataSet)
...: D
...:
Out[22]: [{
1, 3, 4}, {
2, 3, 5}, {
1, 2, 3, 5}, {
2, 5}]
In [23]: L1,suppData0 = apriori.scanD(D,C1,0.5)
...: L1
...:
Out[23]: [frozenset({
1}), frozenset({
3}), frozenset({
2}), frozenset({
5})]
上面4个项集构成了L1列表,该列表中的每个物品至少出现在50%以上的记录中。
下面开始组织完整的Apriori算法,伪代码如下:
当集合中项的个数大于0时
构建一个k个项组成的候选项集的列表
检查数据以确认每个项集都是频繁的
保留频繁项集并构建k+1项组成的候选项集的列表
既然可以过滤集合,那么就能构建完整的Apriori算法了。
def aprioriGen(Lk, k): #创建候选集Ck,Lk频繁项集列表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: #如果前k-2个元素相等
retList.append(Lk[i] | Lk[j])
return retList
def apriori(dataSet, minSupport = 0.5):
C1 = createC1(dataSet)
D = map(set, dataSet)
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
下面来看看实际效果:
In [27]: L,suppData = apriori.apriori(dataSet)
...: L
...:
Out[27]:
[[frozenset({1}), frozenset({3}), frozenset({2}), frozenset({5})],
[frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 3}), frozenset({3, 5})],
[frozenset({2, 3, 5})],
[]]
In [28]: L[0]
Out[28]: [frozenset({1}), frozenset({3}), frozenset({2}), frozenset({5})]
In [29]: L[1]
Out[29]: [frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 3}), frozenset({3, 5})]
In [30]: L[2]
Out[30]: [frozenset({2, 3, 5})]
In [31]: L[3]
Out[31]: []
每个项集都是在函数apriori()中调用函数aprioriGen()来生成的,下面看看aprioriGen()函数的工作流程:
apriori.aprioriGen(L[0],2)
Out[32]:
[frozenset({1, 3}),
frozenset({1, 2}),
frozenset({1, 5}),
frozenset({2, 3}),
frozenset({3, 5}),
frozenset({2, 5})]
这里的6个集合是候选项集Ck中的元素。其中4个在L[1]中,剩下2个集合被函数scanD()过滤掉。
下面尝试70%的支持度:
In [33]: L,supportData = apriori.apriori(dataSet,minSupport=0.7)
In [34]: L
Out[34]: [[frozenset({3}), frozenset({2}), frozenset({5})], [frozenset({2, 5})], []]
可以利用关联规则来减少需要测试的规则数目。下面看看实际效果:
def generateRules(L, supportData, minConf=0.7): #频繁项集列表,包含哪些频繁项集支持数据的字典,最小可信度阈值
bigRuleList = []
for i in range(1, len(L)):#遍历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, brl, minConf=0.7):#对规则进行评估
prunedH = []
for conseq in H:#遍历,计算可信度
conf = supportData[freqSet]/supportData[freqSet-conseq]
if conf >= minConf:
print freqSet-conseq,'-->',conseq,'conf:',conf
brl.append((freqSet-conseq, conseq, conf))#填充bigRuleList
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):#从最初的项集生成候选规则
m = len(H[0])
if (len(freqSet) > (m + 1)): #是否够移除m大小的子集
Hmp1 = aprioriGen(H, m+1)
Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
if (len(Hmp1) > 1):
rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
下面我们来尝试生成一个最小支持度为0.5的频繁项集:
In [38]: L,suppData = apriori.apriori(dataSet,minSupport = 0.5)
...: rules = apriori.generateRules(L,suppData, minConf=0.7)
...: rules
...:
frozenset([1]) --> frozenset([3]) conf: 1.0
frozenset([5]) --> frozenset([2]) conf: 1.0
frozenset([2]) --> frozenset([5]) conf: 1.0
给出了三条规则:{1}→{3}、{5}→{2}和{2}→{5}。可以看到,1和3的规则不行,下面降低可信度阈值之后看一下结果:
In [39]: rules = apriori.generateRules(L,suppData, minConf=0.5)
...: rules
...:
frozenset([3]) --> frozenset([1]) conf: 0.666666666667
frozenset([1]) --> frozenset([3]) conf: 1.0
frozenset([5]) --> frozenset([2]) conf: 1.0
frozenset([2]) --> frozenset([5]) conf: 1.0
frozenset([3]) --> frozenset([2]) conf: 0.666666666667
frozenset([2]) --> frozenset([3]) conf: 0.666666666667
frozenset([5]) --> frozenset([3]) conf: 0.666666666667
frozenset([3]) --> frozenset([5]) conf: 0.666666666667
frozenset([5]) --> frozenset([2, 3]) conf: 0.666666666667
frozenset([3]) --> frozenset([2, 5]) conf: 0.666666666667
frozenset([2]) --> frozenset([3, 5]) conf: 0.666666666667
一旦降低可信度阈值,就可以获得更多的规则。
未完待续
在职场上,单身的大龄男女是越来越多,至于原因有很多种,比如说岗位的原因,类似程序员这样的;还有就是员工圈子太小,根本没有机会认识异性;最后就是很多人其实是比较内向的,根本就不知道怎么谈恋爱。最近在职场论坛上看到这样一个帖子:女生和程序员相亲,看到对方工作状态后:分手吧,年薪再高也愿意和你谈恋爱!这是怎么回事呢?原来这位女生今年28岁了,这次通过朋友的介绍和一个在企业写代码的程序员相亲,这..._相亲招聘程序员
需要掌握的知识点操作系统的类型和结构操作系统的基本原理网络操作系统及网络管理嵌入式操作系统与实时操作系统1.1 操作系统的类型与结构操作系统是计算机系统中的核心系统软件,负责管理和控制计算机系统中硬件和软件资源,合理地组织计算机工作流程和有效利用资源,在计算机与用户之间起接口的作用。1.1.1 操作系统的类型根据使用环境和对作业的处理方式,操作系统可分为批处理操作系统、分时..._信号量胡初值为0 含义
控制鼠标输出坐标我猜很多人都在一些游戏的需要上出了一点小问题那就是文字要在隔着很多空格,或者前面已经有文字时该怎么输出?没关系,看下面void gotoxy(int x,int y) { COORD pos; pos.X = y - 1; pos.Y = x - 1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}注意第一个数是控制行第二个数是控制列如果觉得不习惯可以调换下gotoxy(2,10),
删了点右键的东西搞出来的问题其实就是关联出错了,解决:(新建一个temp.reg,内容如下,然后双击导入注册表即可)Windows Registry Editor Version 5.00[[HKEY_CLASSES_ROOT\Folder\shell\explore\command]"DelegateExecute"="{11dbb47c-a525-400b-9e80-a..._explorer.exe该文件没有与之关联的程序来执行该操作
大家好,欢迎大家学习优品课堂出品的Python完全零基础入我们精讲的系列教程这节课我们来看第一个,我们先了解一下计算机常识,这节课我们来介绍。计算机的概念和组成,那不仅是开发人员作为普通用户电脑的使用者我们应该了解的。我们看一下计算机的构成,计算机从概念上来讲他主要是能够完成数学运算或者逻辑运算的一些计算设备它是存储功能,也就是我们平时所说的PC或者是电脑,它的组成我们可以从大的方面来讲,分为两块..._"优品课堂 \"flask python web 网站开发"
解决向MySQL中插入中文显示乱码和报错的问题MySQL中文乱码产生的原因首先查看数据库中与字符集相关参数修改MySQL数据库中的客户端如何更改MySQL数据库服务器中客户端部分的字符集重新启动MySQL数据库服务器重新记录MySQL数据库MySQL中文乱码产生的原因 因为我们使用的系统中(客户端命令)默认为gbk编译,而MySQL数据库默认为utf8编译.也就是说MySQL数据库听不懂我们对..._为什么finebi连接mysql数据库中文乱码
前言此处代码值得挖掘可以放到编译器中调试,学习模板、const、引用、、、、好好思考代码#include <iostream>#include <cstdlib>#include <cstring>using namespace std;class Element {private: int number;public: Element() :number(0) { cout << "ctor" << endl;_c++ 对 vector> move
浪潮 英信NF5280M5传承浪潮服务器一贯的高品质与高性能,采用浪潮小型机的可靠性技术,精选军工级原料,保证人工智能应用的稳定可靠。浪潮 英信NF5280M5服务器定位部门级用户,整机设计做工堪称精良,在耐用性和稳定性方面都具备不错的表现。在性能方面该机标配一颗Xeon Silver 4110处理器提供运算支持,16GB的内存和300G高速硬盘也基本能够满足系统配置的使用需要。浪潮 英信NF52..._浪潮5280m5改成传统模式
目录内存分配释放函数内存分配释放函数:1. malloc函数2.函数名: calloc3.free()函数4.函数realloc本文转载于:http://blog.sina.com.cn/s/blog_4718dd930100lva6.html内存分配释放函数内存分配释放函数:1. malloc函数向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C/C++规定,void* 类型可以强制转换为任何其它类型的指针。原型:extern _虚幻 c++ tarray 内存释放
一、使用以下命令查看当前安装mysql情况,查找以前是否装有mysqlrpm -qa|grep -i mysql可以看到如下图的所示:显示之前安装了:MySQL-client-5.5.25a-1.rhel5MySQL-server-5.5.25a-1.rhel52、停止mysql服务、删除之前安装的mysql删除命令:rpm -e –nodeps 包名rpm -ev MySQL-client-5...._怎么删除卸载inux 的 mysql
很多情境下,我们都会遇到收集的多维度的时序性的数据,比如运维中的主机各项指标数据,网页中的各项埋点数据等等。通常情况下通过某一指标上的时序预测结果与真实值的比较来判断这一指标是否稳定,这个常用方法的缺陷是只利用起了一个维度的数据(使得模型单薄)。然而既然我们收集到了时序上多维度的数据,如何综合整合多维时序数据为该指标综合判定得出指标是否稳定的结果,是本片文章探讨的一个方向。_多维时序数据的预警
高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构高性能可扩展MySQL数据库设计及架构优化——电商实例数据库结构设计电商实例数据库结构设计[var1]1、用户模型设计(1) 主要作用:管理和维护用户信息。2、用户实体思考:如何把用户的属性存到表中?优点:易于数据存取问题:(1) 数据插入异常PK:用户登录名用户表:{登录名 ... ... 会员级别,级别积分上限,级别积分下限}in..._电商数据库设计案例 扩展性高