,,数据挖掘之Apriori算法详解和Python实现代码分享

,,数据挖掘之Apriori算法详解和Python实现代码分享

本文主要介绍了数据挖掘Apriori算法的详细说明和Python实现代码的分享。本文首先详细介绍Apriori算法,然后给出Python实现代码,有需要的朋友可以参考一下。

关联规则挖掘是数据挖掘中最活跃的研究方法之一,可以用来发现事物之间的关系。最早的目的是发现超市交易数据库中不同商品之间的关系。(啤酒和尿布)

基本概念

1.支持度的定义:support (x-y)=| x cross Y|/N=集合x和集合Y中的项目同时出现在一条记录中的次数/数据记录数。比如:support({ beer}-{diapers})=啤酒和尿布同时出现的次数/数据记录数=3/5=60%。

2.置信度的定义:置信度(x-y)=| x交叉Y|/|X|=集合X和集合Y中的项目同时出现在一条记录中的次数/集合X的出现次数例如:置信度({ beer}-{diapers})=啤酒和尿布同时出现的次数/啤酒出现的次数=3/3=100%;置信度({尿布}-{啤酒})=啤酒和尿布同时出现的次数/尿布出现的次数=3/4=75%

同时满足最小支持度阈值(min_sup)和最小置信度阈值(min_conf)的规则称为强规则,如果项集满足最小支持度,则称为频繁项集。

"如何从大型数据库中挖掘关联规则?"挖掘关联规则是一个两步过程:

1.找出所有频繁项集:根据定义,这些项集的频率至少与预定义的最小支持计数一样高。

2.从频繁项集生成强关联规则:根据定义,这些规则必须满足最小支持度和最小置信度。

Apriori定律

为了减少频繁项集的生成时间,我们应该尽快消除一些完全不可能成为频繁项集的集合。先验两定律做到了这一点。

Apriori定律1:如果一个集合是频繁项集,那么它的所有子集都是频繁项集。例如,假设集合{A,B}是一个频繁项集,即A和B在一条记录中同时出现的次数大于等于min_support,那么它的子集{a}和{b}出现的次数一定大于等于min_support,即它的所有子集都是频繁项集。

Apriori定律2:如果一个集合不是频繁项集,那么它的所有超集都不是频繁项集。例如,如果集合{A}不是频繁项集,即A的出现次数小于min_support,则它的任何超集(如{A,B})都必须小于min_support,因此它的超集也不能是频繁项集。

上图演示了Apriori算法的流程。注意,从二级频繁项集生成三级候选项集时,没有{牛奶,面包,啤酒}。那是因为{面包,啤酒}不是两级频繁项集。这里使用了先验定理。最后,生成三级频繁项集后,没有更高级别的候选项集,整个算法结束,{牛奶,面包,尿布}为最大频繁子集。

Python实现代码:

复制代码如下:

跳到内容

注册在此存储库中注册

探索

特征

企业

博客

Star 0 Fork 0太子龙旭/datamining

分支:主数据挖掘/apriori/apriori.py

hackerxutaizilongxu 20天前的备份

1名投稿人

156行(140 sloc) 6.302 kb原始故障历史记录

#-*-编码:UTF-8 -*-

# -导入-

# -

类先验(对象):

def __init__(self,filename,min_support,item_start,item_end):

self.filename=文件名

Self.min_support=min_support #最小支持

self.min_confidence=50

Self.line _ num=0 #项目的行数

Self.item_start=item_start #取哪一行物品?

self.item_end=item_end

self . location=[[I]for I in range(self . item _ end-self . item _ start 1)]

self.support=self.sut(自我定位)

Self.num=list(已排序(set ([j for I in self。I])) #记录项中j的位置

Self.pre_support=[] #保存以前的支持,位置,编号

self.pre_location=[]

self.pre_num=[]

Self.item_name=[] # item name

self.find_item_name()

self.loop()

self.confidence_sup()

定义交易行(自身,行):

'提取出需要的项'

返回[I . strip()for I in line。分裂(“”)如果我][自我。item _ start-1:自我。item _ end]

定义查找项目名称(自身):

'根据第一行抽取'项目名称'

用打开(self.filename,' r ')作为女:

对于索引,枚举(F.readlines())中的行:

如果索引==0:

自我。item _ name=self。交易_行(行)

破裂

定义sut(自身,位置):

'''

输入[[1,2,3],[2,3,4],[1,3,5].]

输出每个位置集的支持[123435234.]

'''

用打开(self.filename,' r ')作为女:

support=[0] * len(位置)

对于索引,枚举(F.readlines())中的行:

如果索引==0:继续

# 提取每信息

item_line=self.deal_line(line)

对于index_num我在枚举(位置):

标志=0

对于我中的j:

if item_line[j]!='T ':

标志=1

破裂

如果没有标记:

support[index_num]=1

self.line_num=index #一共多少行,出去第一行的项目名称

返回支持

定义选择(自身,c):

'返回位置'

stack=[]

对于自我定位中的我:

对于自我编号中的j:

如果j在我中:

如果len(i)==c:

堆栈。追加

否则:

stack.append([j] i)

# 多重列表去重

导入itertools

s=已排序([在堆栈中为我排序(一))

location=list(s for s,_ in itertools.groupby(s))

返回位置

定义删除位置(自身、支持、位置):

'清除不满足条件的候选集'

# 小于最小支持度的剔除

对于索引,我在列举(支持):

如果我自我。line _ num * self。min _ support/100:

support[index]=0

#先验第二条规则,剔除

对于索引,j在列举(位置):

sub _ location=[j[:index _ loc]j[index _ loc 1:]for index _ loc in range(len(j))]

标志=0

对于子位置中的k:

如果k不在自己的位置:

标志=1

破裂

如果标志:

support[index]=0

# 删除没用的位置

location=[i for i,j in zip(location,support) if j!=0]

支持=[我为我在支持如果我!=0]

返回支持,位置

定义循环(自身):

s级频繁项级的迭代'

s=2

虽然正确:

打印'-'*80

打印“那个”,s - 1,”循环"

打印"位置",自身位置

打印"支持",自助

打印"编号",自身编号

打印'-'*80

# 生成下一级候选集

位置=自我选择

support=self.sut(位置)

支持,位置=self.del_location(支持,位置)

num=列表(已排序(set([j for i in location for j in i]))

s=1

如果位置和支持以及编号:

self.pre_num=self.num

自我。pre _ location=自身。位置

self.pre_support=自我支持

自我编号=数字

自我定位=位置

自我支持=支持

否则:

破裂

def置信度_sup(自我):

'计算"信心"

如果sum(self.pre_support)==0:

打印"最小支持错误"#第一次迭代即失败

否则:

对于索引位置,枚举中的每个位置(自我定位):

del _ num=[each _ location[:index]each _ location[index 1:]for index in range(len(each _ location))]#生成上一级频繁项级

del _ num=[I for I in del _ num if I in self。前置_位置]#删除不存在上一级频繁项级子集

del _ support=[self。pre _ support【自己。前置_位置。index(I)]for I in del _ num if I in self。前置_位置]#从上一级支持度查找

#打印删除编号

#打印自助服务[索引_位置]

# print del_support

对于索引,我在枚举(del_num): #计算每个关联规则支持度和自信度

index_support=0

如果len(自养)!=1:

index_support=索引

支持=浮动(自我。支持[index _ location])/self。行编号* 100 #支持度

s=[j for index_item,j in enumerate(self。item _ name)if index _ item in I]

if del_support[index]:

置信度=float(self。support[index _ location])/del _ support[index]* 100

如果自信self.min _自信:

打印','。加入,'-',自我。item _ name[each _ location[index]],' min_support:',str(support) '% ',' min_confidence:',str(confidence) '% '

def main():

c=Apriori('basket.txt ',14,3,13)

d=先验(' simple.txt ',50,2,6)

if __name__=='__main__ ':

主()

############################################################################

状态应用程序接口培训商店博客关于

2014 GitHub公司。条款隐私安全联系人

Apriori算法

先验(文件名,最小支持,项目开始,项目结束)

参数说明

文件名:(路径)文件名

min_support:最小支持度

项目_开始:项目起始位置

项目_结束:项目结束位置

使用例子:

复制代码代码如下:

导入先验

c=先验. Apriori('basket.txt ',11,3,13)

输出:

复制代码代码如下:

-

一环路

位置[[0]、[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]]

支持[299,183,177,303,204,302,293,287,184,292,276]

数字[0,1,2,3,4,5,6,7,8,9,10]

-

-

二环路

位置[[0,9],[3,5],[3,6],[5,6],[7,10]]

支持[145,173,167,170,144]

数字[0,3,5,6,7,9,10]

-

-

三环路

位置[[3,5,6]]

支持[146]

数字[3,5,6]

-

冷冻餐、啤酒、罐装饮料最低支持度:14.6%最低信任度:0.253863863867

罐装啤酒、啤酒和冷冻餐最低支持度:14.6%最低信心度:0.253863863867

罐装啤酒、冷冻餐、啤酒最低支持度:14.6%最低信任度:0.253863863837

-

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: