关联规则 Apriori算法

本文深入探讨了Apriori算法的实现原理,这是一种用于挖掘频繁项集和关联规则的算法。文章通过Python代码展示了如何从交易数据中找出频繁项集,并详细解释了可连接性规则及其应用。

非常简单的关联规则的基础算法,Apriori算法的python实现

判断可连接性的规则:

先判断两个频繁k?1k?1项集是否是可连接的,可连接的定义是这样:对于两个频繁k?1k?1项集l1,l2l1,l2,先将项集中的项排序(比如字典序),如果l1,l2l1,l2的前k?2k?2项都相等,则l1,l2l1,l2可连接
如果两个频繁k?1k?1项集l1,l2l1,l2可连接,则用它们生成一个新的kk项集:{l1[1],l1[2],…,l1[k?2],l1[k?1],l2[k?1]}{l1[1],l1[2],…,l1[k?2],l1[k?1],l2[k?1]},其实就是用他们相同的前k?2k?2项加上不同的各自末尾两项,这个过程由式子l1×l2l1×l2表示。这样,我们只需找到所有的C2nCn2个两两组合(nn为Lk?1Lk?1的长度),挑出其中可连接的,就能生成所有可能是频繁项集的kk项集,它们就是频繁kk项集的候选,这些候选构成的集合记为Ck

#Design by Zarkpx
#Email:zarkpx@gmail.com

import numpy as py
import pandas as pd
import random as rd
item = [[1],[2],[3],[4],[5]]
T = [[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[1,2,3],[2,4],[2,3,4],[2,3,4]]
one_num = []
freq_list=[]
min_sup = 2

for i in range(len(item)):
    one_num.append(0)
    
def count_one():
    for i in T:
        for j in i:
            for m in range(len(item)):
                if j == item[m][0]:
                    one_num[m]+=1
                else:
                    continue
def count_other(new_freq):
    num = []
    for i in range(len(new_freq)):
        num.append(0)
    for i in T:
        for j in range(len(new_freq)):
            if new_freq[j]==i:
                num[j]+=1
    return num
                    
def delete(sub_freq,num_list):
    sub_freq_swap = []
    sub_freq_swap.extend(sub_freq)
    for i in range(len(num_list)):
        if num_list[i] < min_sup:
            sub_freq_swap.remove(sub_freq[i])
    freq_list.append(sub_freq_swap)
    
def link(k):
    sub_freq = freq_list[k-1]
    new_freq=[]
    for i in range(len(sub_freq)):
        a = [] 
        a.extend(sub_freq[i])
        a.remove(a[-1])
        for j in range(i+1,len(sub_freq)):
            b = []
            b.extend(sub_freq[j])
            b.remove(b[-1])
            if a == b:
                c = []
                c.extend(sub_freq[i])
                #print(c)
                #print(sub_freq[j][-1])
                c.append(sub_freq[j][-1])
                new_freq.append(c)
    return new_freq
                
            
                    
count_one()
delete(item,one_num)
new = link(1)
two_num = count_other(new)
#print(two_num)
delete(new,two_num)
new = link(2)
three_num = count_other(new)
delete(new,three_num)
print("最小支持阈值:",min_sup)
print("频繁项集:",freq_list)
print("----------------")
print("频繁1-项集:",freq_list[0])
print("频繁1-项集对应元素出现次数:",one_num)
print("----------------")
print("频繁2-项集:",freq_list[1])
print("频繁2-项集对应元素出现次数:",two_num)
print("----------------")
print("频繁3-项集:",freq_list[2])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值