apriori算法python实现

apriori算法python实现

源于一次课程实验,下面的代码只是负责给出频繁模式,没有进行关联规则提取

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

@Time        : 2022/10/30 11:46
@Author      : ZORO
@File        : Apriori_byself.py
@Description : apriori算法实现,最后得出频繁模式

"""

import numpy as np
from itertools import combinations
minsup = 3/14

f = open("事务数据.txt",'r',encoding='utf-8')
text = f.read()

textlines = text.splitlines()
c1 = []
c2 = []
for line in textlines:
    for word in line.split(' '):
        if word not in c1:
            c1.append(word)
c2.extend(list(map(lambda x:{x},c1)))

def throw_away(set1,set2):                    #在set2中剔除子集包含set1中元素的元素
    for subset1 in set1:
        for subset2 in set2:
            if subset1.issubset(subset2):
                set2.remove(subset2)
def cal_sup(can):                             #计算支持度
    sup_n = 0
    for line in textlines:
            num = 0
            for sub_can in can:
                if sub_can in line:
                    num +=1
            if num == len(can):
                sup_n += 1
    return sup_n/len(textlines)
def union_tuple(tuple):    #将元组中包含的所有集合合成并集
    result = {''}
    for sub in tuple:
        result.update(sub)
    result.discard('')
    return  result
def combine(can_set):     #对can_set候选集中的所有事务两两排列组合
    new_set = []
    com_list = []
    com_list.extend(list(combinations(can_set, 2)))
    for s in com_list:
        s = union_tuple(s)
        if len(s) == k+2:   #防止出现大于k的频繁模式
            new_set.append(s)
    return new_set
k = 0
mode = []
mode.append(c2)
while(1):
    infre_set = []                            #定义非频繁模式空列表
    for cell in mode[k]:                      #遍历候选k模式中的每一条事务
        support =  cal_sup(cell)              #计算事务支持度
        if support < minsup:                  #如果支持度小于最小支持度,则将其添加至非频繁模式,同时在原来的候选模式中删掉
            # infre_set.extend(list(map(lambda x:{x},cell)))  #添加
            infre_set.append(cell)
    for cell in infre_set:
        mode[k].remove(cell)              #删掉
    tempnew = []
    tempnew.extend(combine(mode[k]))                #将频繁模式重新组合,生成候选k+1模式
    throw_away(infre_set, tempnew)            #剔除包含非频繁模式的候选k+1模式

    if (len(tempnew) == 0):                   #如果候选k+1模式为空集
        print('k=',k+1)
        print('频繁模式为:',mode[k])           #打印频繁模式
        break                                 #跳出循环
    else:                                     #否则
        mode.append(tempnew)                  #将候选k+1模式添加进模式列表中
        k = k + 1                             #k+1进入下一次循环

事务数据可以是文本数据,希望有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值