python apriori库_Apriori——python3实现

最近看了关联算法中的Apriori没看懂,这次看了一些论文总算看懂了,不过还是没能够自己实现。在github搜到一些代码看,看的不很懂,这里先贴上(当中有自己加的注释),有时间再补充研究。

# -*- coding: utf-8 -*-

"""

Created on Wed Nov 30 10:05:42 2016

@author: Administrator

"""

from numpy import *

import itertools

support_dic = {}

#生成原始数据,用于测试

def loadDataSet():

return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

#获取整个数据库中的一阶元素

# C1 = {1, 2, 3, 4, 5}

def createC1(dataSet):

C1 = set([])

for item in dataSet:

C1 = C1.union(set(item))

return [frozenset([i]) for i in C1]

#输入数据库(dataset) 和 由第K-1层数据融合后得到的第K层数据集(Ck),

#用最小支持度(minSupport)对 Ck 过滤,得到第k层剩下的数据集合(Lk)

def getLk(dataset, Ck, minSupport):

global support_dic

Lk = {}

#计算Ck中每个元素在数据库中出现次数

for item in dataset:

for Ci in Ck:

if Ci.issubset(item):

if not Ci in Lk:

Lk[Ci] = 1

else:

Lk[Ci] += 1

#用最小支持度过滤

Lk_return = []

for Li in Lk:

support_Li = Lk[Li] / float(len(dataSet))

if support_Li >= minSupport:

Lk_return.append(Li)

support_dic[Li] = support_Li

return Lk_return

#将经过支持度过滤后的第K层数据集合(Lk)融合

#得到第k+1层原始数据Ck1

'''连接步'''

def genLk1(Lk):

Ck1 = []

for i in range(len(Lk) - 1):

for j in range(i + 1, len(Lk)):

if sorted(list(Lk[i]))[0:-1] == sorted(list(Lk[j]))[0:-1]:

Ck1.append(Lk[i] | Lk[j])

return Ck1

#遍历所有二阶及以上的频繁项集合

def genItem(freqSet, support_dic):

for i in range(1, len(freqSet)):

for freItem in freqSet[i]:

genRule(freItem)

#输入一个频繁项,根据“置信度”生成规则

#采用了递归,对规则树进行剪枝

def genRule(Item, minConf=0.7):

if len(Item) >= 2:

for element in itertools.combinations(list(Item), 1):

if support_dic[Item] / float(support_dic[Item - frozenset(element)]) >= minConf:

print(str([Item - frozenset(element)]) + "----->" + str(element))

print (support_dic[Item] / float(support_dic[Item - frozenset(element)]))

genRule(Item - frozenset(element))

#输出结果

if __name__ == '__main__':

dataSet = loadDataSet()

result_list = []

Ck = createC1(dataSet)

#循环生成频繁项集合,直至产生空集

while True:

Lk = getLk(dataSet, Ck, 0.5)

if not Lk:

break

result_list.append(Lk)

Ck = genLk1(Lk)

if not Ck:

break

#输出频繁项及其“支持度”

print(support_dic)

#输出规则

genItem(result_list, support_dic)

输出:

980075-20161203174525881-1249940542.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值