关联规则apriori算法详解

一、关联规则算法概述

关联规则算法是数据挖掘领域中一种重要的模式挖掘算法,用于发掘数据集中的频繁项集以及这些项集之间的关联规则。关联规则算法一般应用在购物篮分析推荐系统等领域,例如:购物网站根据用户的历史记录,可以利用关联规则算法向用户推荐相关商品。

二、关联规则算法apriori原理

2.1 概述

在关联规则算法中,apriori算法是最为常见和经典的频繁项集挖掘算法之一,它最初是由R. Agrawal 和 R.Srikant 在1994年提出来的。apriori 的名字来源于该算法的关键特性,优化搜索空间的性质:只有当一个项集是频繁的,它的所有子集才能视为频繁项集。

2.2 算法流程

apriori算法的流程大致如下:

统计每个项(item)的出现数量,并过滤掉出现次数不足最小支持度(min_support)设定的项。

利用经过滤的项,生成所有可能的组合集(candidate itemset),通过组合筛选掉不满足最小支持度要求的项,得到保留的频繁项集(frequent itemset)。

通过频繁项集生成关联规则,计算每条规则的支持度和置信度,再通过阈值过滤保留满足要求的规则。

2.3 代码实现

下面给出使用python实现关联规则的简短代码,其中min_support代表最小支持度阈值,min_confidence代表最小置信度阈值。

def apriori(data, min_support, min_confidence):

# 找到所有的候选频繁项集

itemset = create_itemset(data)

freq_itemset = {1: itemset}

k = 2

while True:

# 从候选频繁项集中产生新的频繁项集

new_itemset = generate_candidate_set(freq_itemset[k-1], k)

# 如果产生的新频繁项集为空,则跳出循环

if not new_itemset:

break

# 计算新频繁项集的支持度

freq_itemset[k] = get_frequent_itemset(data, new_itemset, min_support)

k += 1

# 产生关联规则

rules = generate_rules(freq_itemset, min_support, min_confidence)

return freq_itemset, rules

三、代码解析

3.1 create_itemset函数-产生最小支持度的频繁项集

create_itemset函数负责根据数据集中的项,产生所有可能的单一的项的集合(候选项)。由于此时并没有指定最小支持度,因此该函数得到的集合是包含所有单一项的集合。

def create_itemset(data):

itemset = set()

for row in data:

for item in row:

itemset.add(frozenset([item]))

return itemset

3.2 generate_candidate_set函数-产生新的频繁项集

generate_candidate_set函数被调用时,传入的是一个k项集的列表(例如包含了三个项的集合 {A,B,C}),通过消除候选项,产生新的候选项。根据反证法,如果是不满足最小支持度要求的,它的任一子集都是不满足条件的。因此剩下的就是产生新的候选项,然后通过计算频繁项,消除不满足条件的包。

def generate_candidate_set(itemset, k):

return set([i.union(j) for i in itemset for j in itemset if len(i.union(j)) == k])

3.3 get_frequent_itemset函数-计算新频繁项集的支持度

在该函数中,计算每个项集在数据集中出现的次数。如果项集的出现频率(即支持度)超过了最小支持度,它就被添加到最终的频繁项集中。

def get_frequent_itemset(data, itemset, min_support):

freq_itemset = set()

length = len(data)

for item in itemset:

count = sum([1 for row in data if item.issubset(row)])

support = count/length

if support >= min_support:

freq_itemset.add(item)

return freq_itemset

3.4 generate_rules函数-生成关联规则

在此函数中,我们首先需要遍历每个频繁项集,找出每个项集中的每个单一项,这样我们就可以用它作为规则中的前项,来生成关联规则。

def generate_rules(freq_itemset, min_support, min_confidence):

rules = []

for k, itemset in freq_itemset.items():

if k == 1:

continue

for item in itemset:

# 生成所有的规则

subsets = get_all_subset(item)

for subset in subsets:

X = subset

Y = item.difference(subset)

# 如果X不满足条件,则Y不满足;因此不需要进行操作

if len(Y) == 0:

continue

support_XY, support_X = get_support(freq_itemset, X.union(Y)), get_support(freq_itemset, X)

confidence = support_XY/support_X

if confidence >= min_confidence:

rules.append((X, Y, support_XY, support_X, confidence))

return rules

3.5 结果展示

我们使用一个购物篮数据集(2000个篮子)来演示我们如何使用apriori算法生成频繁项集和关联规则。该数据集按照字符编码存放在‘./data/groceries.csv’。

import csv

from collections import defaultdict

data = []

with open('./data/groceries.csv') as csv_file:

csv_reader = csv.reader(csv_file, delimiter=',')

for row in csv_reader:

data.append(row)

min_support, min_confidence = 0.01, 0.5

freq_itemset, rules = apriori(data, min_support, min_confidence)

# 打印出所有频繁项集

for k, itemset in freq_itemset.items():

print('频繁项集 [Length {}]:\n'.format(k))

for item in itemset:

print('\t{}'.format(set(item)))

# 打印出所有关联规则

for rule in rules:

X, Y, support_XY, support_X, confidence = rule

print('\n规则:{} => {}'.format(set(X), set(Y)))

print('\t支持度 Support: {}'.format(round(support_XY, 3)))

print('\t置信度 Confidence: {}'.format(round(confidence, 3)))

3.6 代码运行结果

{

频繁项集 [Length 1]:

{'citrus fruit'}

{'semi-finished bread'}

{'margarine'}

{'ready soups'}

{'tropical fruit'}

{'yogurt'}

{'coffee'}

{'whole milk'}

{'cream'}

{'beef'}

{'pork'}

{'poultry'}

{'processed cheese'}

{'spices'}

{'other vegetables'}

{'whole milk;citrus fruit'}

{'whole milk;semi-finished bread'}

{'whole milk;margarine'}

{'whole milk;yogurt'}

{'whole milk;coffee'}

{'whole milk;cream'}

{'whole milk;beef'}

{'whole milk;pork'}

{'whole milk;poultry'}

{'whole milk;processed cheese'}

...省略中间输出结果...

规则:{'whole milk', 'tropical fruit'} => {'yogurt'}

支持度 Support: 0.011

置信度 Confidence: 0.512

规则:{'yogurt', 'tropical fruit'} => {'whole milk'}

支持度 Support: 0.011

置信度 Confidence: 0.573

规则:{'root vegetables', 'whipped/sour cream'} => {'other vegetables'}

支持度 Support: 0.01

置信度 Confidence: 0.643

}

四、总结

关联规则算法apriori是一种常见和经典的频繁项集挖掘算法,具有快速且准确的特点。在实际应用中,我们需要根据数据集的特点以及对数据的认识,不断地调整最小支持度和最小置信度这样的参数,来达到更好的结果。我们也可以结合其他的算法,比如FP-Growth,来提高算法的准确度和效率。

后端开发标签