面向目标的关联规则挖掘的一个FP增长算法
- 格式:pdf
- 大小:356.80 KB
- 文档页数:5
fp-growth算法例子FP-Growth(频繁模式增长)是一种在频繁项集挖掘中找出项集(itemsets)之间有趣的关联规则的算法。
其目的是寻找大型数据集中的频繁项集,并使用这些频繁项集来生成关联规则。
以下是一个简单的FP-Growth算法的Python实现示例:```pythonimport numpy as npfrom apriori import gen_候选项集, FPGrowth_Prefix_Frequent# 构造事务数据库data = [['苹果', '香蕉', '橙子'],['香蕉', '橙子', '葡萄'],['苹果', '香蕉', '葡萄'],['苹果', '橙子', '葡萄'],['橙子', '葡萄']]# 初始化FP-Growth算法参数min_support = 0.5 # 最小支持度阈值min_confidence = 0.7 # 最小置信度阈值num_transactions = len(data) # 事务数据库中事务数量database = data # 存储整个事务数据库num_patterns = 10 # 最大模式数量patterns = [] # 存储所有模式# 执行FP-Growth算法,找到频繁项集frequent_itemsets = FPGrowth_Prefix_Frequent(num_transactions, database, min_support)# 从频繁项集中生成关联规则,并过滤出满足最小置信度的规则rules = []for itemset in frequent_itemsets:for i in range(1, len(itemset)):left = [tuple(x) for x in zip(itemset[:i], itemset[i:])]right = itemset[i:]confidence = len(left) / num_transactionsif confidence >= min_confidence:rules.append((left, right, confidence))print('关联规则:', left, '->', right, '置信度:', confidence)print('支持度:', left + right, '/', num_transactions)print()```在这个例子中,我们首先定义了一个事务数据库,其中包含了一些水果的购买记录。
关联规则挖掘方法一、前言关联规则挖掘是数据挖掘中的一个重要领域,它可以帮助我们发现数据中隐藏的规律和关系,从而为商业决策和市场营销提供支持。
本文将介绍关联规则挖掘的方法和步骤,包括数据预处理、频繁项集生成、关联规则生成和评估等。
二、数据预处理在进行关联规则挖掘之前,我们需要对原始数据进行预处理。
首先,我们需要去除无用的属性和记录,并对缺失值进行处理。
其次,我们需要将离散型数据转换为数值型数据,并对连续型数据进行离散化。
最后,我们需要对异常值进行检测和处理。
三、频繁项集生成频繁项集是指在数据集中经常出现的一组物品集合。
频繁项集生成是关联规则挖掘的第一步,其目的是找到所有满足最小支持度阈值的频繁项集。
1. Apriori算法Apriori算法是最常用的频繁项集生成算法之一。
它基于两个重要性质:单调性和自由子集性质。
Apriori算法分为两个阶段:候选项集生成和剪枝。
2. FP-growth算法FP-growth算法是一种基于树结构的频繁项集生成算法。
它通过构建一棵FP树来发现频繁项集。
FP-growth算法相对于Apriori算法具有更快的速度和更小的空间复杂度。
四、关联规则生成在找到所有频繁项集之后,我们需要从中挖掘出有意义的关联规则。
关联规则是指形如X->Y的规则,其中X和Y都是物品集合,且X∩Y=∅。
1. 关联规则挖掘关联规则挖掘是指从频繁项集中挖掘出满足最小置信度阈值的关联规则。
置信度是指在条件X下出现Y的概率。
2. 关联规则评估关联规则评估是指对挖掘出来的关联规则进行评估和选择。
常用的评价指标包括支持度、置信度、提升度和全置信度等。
五、总结本文介绍了关联规则挖掘的方法和步骤,包括数据预处理、频繁项集生成、关联规则生成和评估等。
在实际应用中,我们需要根据具体情况选择不同的算法和参数,并进行优化和调整。
数据挖掘中的关联规则算法使用方法教程数据挖掘是一门通过从大量数据中发现隐藏模式、关系和信息的技术。
关联规则算法是数据挖掘中的重要工具,用于发现数据集中的关联关系和规律。
本教程将介绍关联规则算法的基本概念、使用方法和常见问题。
一、关联规则算法概述关联规则算法主要用于发现数据集中的关联关系和规律,它可以帮助我们了解事物之间的相互关系,并通过这些关系进行预测和推断。
常见的应用场景包括购物篮分析、市场篮子分析、推荐系统等。
关联规则算法通过分析频繁项集和支持度,找到频繁项集之间的关联规则。
频繁项集是指在数据集中频繁出现的组合项集,支持度是指某个项集在数据集中出现的频率。
通过计算支持度和置信度,可以找到具有较高置信度的关联规则。
常用的关联规则算法包括Apriori算法、FP-Growth算法和Eclat算法。
接下来将逐一介绍这些算法的使用方法。
二、Apriori算法1. Apriori算法基本原理Apriori算法是关联规则算法中最常用的一种算法。
它通过迭代的方式逐步生成频繁项集,然后根据频繁项集生成关联规则。
Apriori算法的基本原理如下:- 生成频繁1项集;- 循环生成候选k项集,并计算支持度;- 剪枝:删除支持度低于阈值的项集,得到k频繁项集;- 生成关联规则,并计算置信度。
2. Apriori算法使用步骤使用Apriori算法进行关联规则挖掘的步骤如下:- 输入数据集:准备一份包含项集的数据集;- 设置支持度和置信度的阈值;- 生成频繁1项集;- 根据频繁1项集生成2频繁项集;- 通过剪枝操作得到k频繁项集;- 根据频繁项集生成关联规则,并计算置信度;- 输出频繁项集和关联规则。
三、FP-Growth算法1. FP-Growth算法基本原理FP-Growth算法是一种高效的关联规则挖掘算法,它通过构建频繁模式树来快速发现频繁项集和关联规则。
FP-Growth算法的基本原理如下:- 构建FP树:将数据集构造成FP树,每个节点表示一个项,每个路径表示一条事务;- 构建条件模式基:从FP树中抽取频繁1项集,并构建条件模式基;- 通过条件模式基递归构建FP树;- 根据FP树生成关联规则。
基于FPGrowth算法的关联规则挖掘技术在市场调研中的应用随着互联网的快速发展和大数据时代的到来,市场调研逐渐从传统的手工处理转向数据驱动的方式。
关联规则挖掘技术作为数据挖掘领域的重要方法之一,能够发现数据中隐藏的规律和关联性,对市场调研具有重要的应用价值。
本文将对基于FPGrowth算法的关联规则挖掘技术在市场调研中的应用进行探讨和总结。
一、概述关联规则挖掘是一种通过分析数据集中的频繁项集,发现数据项之间的关联关系的技术。
该技术通过计算项集之间的支持度和置信度等指标,得出频繁项集和关联规则,并利用这些规则进行市场调研分析和推荐。
FPGrowth算法作为一种高效的关联规则挖掘算法,能够有效地挖掘出频繁项集和关联规则,被广泛应用于市场调研领域。
二、FPGrowth算法的原理FPGrowth算法是一种基于频繁模式树的关联规则挖掘算法。
其核心思想是通过压缩数据集,构建FP树,并根据FP树挖掘频繁项集和关联规则。
该算法相比传统的Apriori算法具有更高的效率和更好的性能,在大规模数据集上有较好的表现。
三、FPGrowth算法在市场调研中的应用1. 相关性分析:通过FPGrowth算法挖掘出的关联规则,可以揭示出数据集中项之间的相关性。
市场调研人员可以通过分析这些关联规则,了解产品之间的相关性、顾客购买偏好等,为市场推广和销售策略提供依据。
2. 交叉销售推荐:基于FPGrowth算法的关联规则挖掘技术,可以帮助企业发现产品之间的内在关联性,进而进行交叉销售推荐。
例如,当一位顾客购买了手机时,可以根据关联规则挖掘出的结果,向顾客推荐手机壳、耳机等相关产品,从而提升销售额。
3. 用户分群:FPGrowth算法可以根据挖掘出的频繁项集和关联规则,对顾客进行分群分析。
通过识别出具有共同购买特征的顾客群体,可以为不同群体制定个性化的市场营销策略,提高营销效果。
4. 促销策略优化:通过分析关联规则,市场调研人员可以了解到哪些产品经常同时被购买,可以结合时间、地点等因素,制定更科学有效的促销策略。
fpgrowth算法代码FP-Growth算法是一种高效的关联规则挖掘算法,其主要原理是将数据集转换为频繁模式的树形结构来进行挖掘。
以下是FP-Growth 算法的Python代码实现:首先,我们需要定义一个类来表示FP树的节点:class TreeNode:def __init__(self, name_value, num_count, parent_node): = name_valueself.count = num_countself.parent = parent_nodeself.children = {}self.next = None其中,name表示节点的名称,count表示节点的计数值,parent表示节点的父节点,children表示节点的子节点,next表示指向相同元素项的不同节点。
然后,我们需要定义一个类来实现FP-Growth算法:class FPGrowth:def __init__(self, min_sup=1):self.min_sup = min_supself.freq_items = {}self.head_table = {}self.tree = Nonedef fit(self, data_set):self.build_head_table(data_set)self.build_FP_tree(data_set)self.mine_freq_items()def build_head_table(self, data_set):for trans in data_set:for item in trans:self.head_table[item] =self.head_table.get(item, 0) + data_set[trans]for item in self.head_table.copy():if self.head_table[item] < self.min_sup:del(self.head_table[item])for item in self.head_table:self.freq_items[frozenset([item])] =self.head_table[item]def build_FP_tree(self, data_set):self.tree = TreeNode('Null Set', 1, None)for trans, count in data_set.items():sorted_items = [item for item in trans if item in self.head_table]sorted_items.sort(key=lambda x:self.head_table[x], reverse=True)if len(sorted_items) > 0:self.insert_tree(sorted_items, count,self.tree)def insert_tree(self, items, count, cur_node):first_item = items[0]if first_item in cur_node.children:cur_node.children[first_item].count += countelse:cur_node.children[first_item] =TreeNode(first_item, count, cur_node)if self.head_table[first_item] is None:self.head_table[first_item] =cur_node.children[first_item]else:self.update_headtable(cur_node.children[first_item], self.head_table[first_item])if len(items) > 1:self.insert_tree(items[1:], count,cur_node.children[first_item])def update_headtable(self, target_node, next_node): while (next_node.next is not None):next_node = next_node.nextnext_node.next = target_nodedef mine_freq_items(self):freq_item_set = set(self.freq_items.keys())if len(freq_item_set) == 0:return Nonesorted_items = sorted(self.freq_items.items(), key=lambda x: x[1])for item in sorted_items:base_set = set(item[0])freq_set = frozenset(base_set)self.freq_items[freq_set] = item[1]conditional_tree =self.get_conditional_tree(base_set)if conditional_tree is not None:conditional_fpg = FPGrowth(self.min_sup)conditional_fpg.tree = conditional_treeconditional_fpg.build_head_table(self.create_conditional_db(b ase_set))conditional_fpg.mine_freq_items()for freq_item_set, count inconditional_fpg.freq_items.items():full_freq_set = freq_item_set | freq_set self.freq_items[full_freq_set] =self.freq_items.get(full_freq_set, 0) + countdef get_conditional_tree(self, base_set):if base_set is None or len(base_set) == 0:return Noneitem_count = {}for trans in self.head_table:item_set = set()cur_node = self.head_table[trans]while (cur_node is not None):iflen(base_set.intersection(set(cur_))) > 0:item_set.add(cur_)cur_node = cur_node.nextif len(item_set) > 0:item_count[trans] = item_setif len(item_count) == 0:return Noneconditional_tree = TreeNode('Null Set', 1, None)for trans, item_set in item_count.items():sorted_items = [item for item in list(item_set)if item in self.head_table]if len(sorted_items) > 0:self.insert_tree(sorted_items,data_set[trans], conditional_tree)return conditional_treedef create_conditional_db(self, base_set):new_db = {}for trans, count in data_set.items():base_set_list = [item for item in trans if itemin base_set]if len(base_set_list) > 0:base_set_list.sort(key=lambda x:self.head_table[x], reverse=True)new_db[frozenset(base_set_list)] = countreturn new_dbdef get_freq_items(self):return self.freq_items在FP-Growth类中,fit函数用于对数据集进行频繁模式挖掘,其中分别调用了build_head_table、build_FP_tree和mine_freq_items三个函数。
fpgrowth算法计算过程FPGrowth算法是一种用于频繁项集挖掘的算法,它使用一种称为FP树(Frequent Pattern Tree)的数据结构来表示事务数据库中的频繁项集。
FP树是一种压缩的数据结构,它通过合并相同的项来减少存储空间。
本文将详细介绍FPGrowth算法的计算过程。
1. 构建FP树FPGrowth算法的第一步是构建FP树。
首先扫描事务数据库,统计每个项的频次,并按照频次从高到低对项进行排序。
然后对于每个事务,根据项的排序顺序构建FP树。
从根节点开始,依次将事务中的项添加到树中。
如果树中已经存在该项,则增加该项的频次;否则,创建一个新的节点并添加到树中。
最终构建得到的FP树可以表示事务数据库中的频繁项集。
2. 构建条件模式基在构建FP树的过程中,对于每个项,除了保存频次外,还需要保存它在FP树中的出现路径,称为条件模式基。
条件模式基是以该项为结尾的路径集合,用于后续的递归挖掘。
3. 递归挖掘频繁项集构建完FP树和条件模式基后,可以通过递归的方式挖掘频繁项集。
对于每个项,以它为前缀的频繁项集可以通过以下步骤获取:- 对于该项,计算它的条件模式基;- 对于条件模式基,构建对应的条件FP树;- 对于条件FP树,重复步骤1和步骤2,直到无法构建出更多的频繁项集为止。
4. 生成关联规则在挖掘出频繁项集后,可以根据支持度和置信度的阈值设置,生成关联规则。
关联规则表示项集之间的关系,可以帮助人们理解数据的内在规律。
关联规则的生成可以通过以下步骤进行:- 对于每个频繁项集,生成该项集的所有非空子集;- 对于每个子集,计算其支持度和置信度;- 根据支持度和置信度的阈值,筛选出满足条件的关联规则。
FPGrowth算法的特点是不需要生成候选项集,而是通过FP树和条件模式基的构建,直接挖掘出频繁项集。
相比于传统的Apriori算法,FPGrowth算法具有更高的效率和更少的存储空间需求。
这使得FPGrowth算法成为频繁项集挖掘领域的一种重要算法。
机器学习中的关联规则挖掘方法简介机器学习中的关联规则挖掘是一种用于发现数据集中不同属性之间的关联关系的方法。
这些关联关系可以帮助我们理解属性之间的相互作用,从而能够更好地进行数据分析和决策制定。
在本文中,我们将介绍机器学习中常用的关联规则挖掘方法,包括Apriori算法和FP-growth算法。
1. Apriori算法Apriori算法是一种用于发现频繁项集的经典算法。
频繁项集是指在数据集中经常同时出现的一组项的集合。
Apriori算法基于“先验原理”,即如果一个项集是频繁的,那么它的所有子集也是频繁的。
该算法采用一种逐层的方式,从$k$-项集生成$k+1$-项集,直到不能再生成新的项集为止。
Apriori算法的时间复杂度较高,因为需要多次扫描数据集进行计数。
2. FP-growth算法FP-growth算法是一种用于发现频繁项集的高效算法。
该算法通过构建一个称为FP树的数据结构来实现。
FP树具有压缩数据集的能力,从而减少了扫描数据集的次数。
FP-growth算法的关键步骤包括:构建FP树、挖掘频繁项集和生成条件模式基。
首先,根据事务的频率对数据集进行排序,然后构建FP树,最后通过递归遍历FP树来挖掘频繁项集。
相比于Apriori算法,FP-growth算法的时间复杂度更低。
3. 频繁项集和关联规则在关联规则挖掘中,频繁项集是指在给定最小支持度阈值下出现频率很高的项集。
而关联规则是从频繁项集中通过设置最小置信度阈值而获得的一种形式化表示。
关联规则通常具有“A ⇒ B”的形式,其中A和B都是项集。
关联规则的置信度表示当项集A出现时,项集B同时出现的概率。
4. 关联规则挖掘的应用关联规则挖掘在实际应用中有着广泛的应用。
例如,在市场篮子分析中,关联规则可以帮助商家了解购物者的购买习惯,从而进行商品定价和促销策略的制定。
此外,关联规则挖掘还可以应用于网络流量分析、医学诊断、检测新闻事件等领域。
5. 关联规则挖掘的局限性和挑战尽管关联规则挖掘是一种有用的方法,但也存在一些局限性和挑战。
fp-growth算法原理fp-growth算法是一种用于频繁项集挖掘的算法,它是基于一种称为FP树的数据结构来实现的。
该算法可以高效地挖掘事务数据集中的频繁项集,因此广泛应用于数据挖掘和机器学习领域。
一、FP树FP树是一种基于前缀树的数据结构,可以用来存储事务数据集中各个事务的项集。
它通过将项集按照出现次数从高到低进行排序,并进行压缩,从而大大减小了数据的存储空间。
FP树由一个根节点开始,每个节点存储一个项和该项出现的次数。
FP树上的每一个路径都代表一个项集,而每个路径上的叶节点都包含了相同的项集,而仅仅是出现的次数不同。
假设我们有以下事务数据集:{| class="wikitable" style="text-align:center" |+ style="font-size:larger;" |事务数据集 |- ! style="padding:0.2em 1em;text-align:left;" | 事务编号 ! style="padding:0.2em 1em;text-align:left;" | 项集 |- | 1 | A, B, C |- | 2 | B, D |- | 3 | C, D |- | 4 | A, B, D |- |}我们需要扫描整个事务数据集,计算每个项的出现次数,并按照出现次数从高到低进行排序,得到如下表格:{| class="wikitable" style="text-align:center" |+ style="font-size:larger;" |频繁项集 |- ! style="padding:0.2em 1em;text-align:left;" | 项 !style="padding:0.2em 1em;text-align:left;" | 支持度 |- | B | 3 |- | C | 2 |- | A | 2 |- | D | 2 |-}然后,我们可以通过FP树来表示整个事务数据集。
fpgrowth函数fpgrowth函数是一种用于频繁模式挖掘的算法,它是一种高效的数据挖掘方法,用于发现数据集中的频繁模式或关联规则。
在本文中,我们将详细介绍fpgrowth函数的原理、应用场景以及使用方法。
一、原理fpgrowth函数是基于FP树(Frequent Pattern Tree)的一种频繁模式挖掘算法。
它通过构建一个特殊的数据结构FP树来存储数据集,然后利用FP树来快速发现频繁项集。
FP树是一种紧凑的数据结构,它通过节点链接的方式表示数据集中的频繁项集,可以避免昂贵的模式枚举过程。
具体来说,fpgrowth函数的工作流程如下:1. 构建FP树:遍历数据集,统计每个项的频次,并根据频次排序生成频繁项集。
然后根据频繁项集构建FP树,将数据集映射到FP 树上。
2. 挖掘频繁项集:从FP树的根节点开始,递归地遍历每个节点,找到以当前节点为末尾的路径(即频繁项集),将其加入结果列表中。
3. 生成关联规则:根据频繁项集,使用置信度等指标来生成关联规则,可以通过设置最小支持度和置信度的阈值来控制规则的生成。
二、应用场景fpgrowth函数在很多领域都有广泛的应用,特别适用于:1. 市场篮子分析:可以挖掘顾客购买商品的频繁组合,从而进行交叉销售和推荐。
2. 网络流量分析:可以挖掘网络流量中的异常行为和攻击模式,用于网络安全监测和预警。
3. 社交网络分析:可以挖掘用户之间的关系和行为模式,用于社交网络推荐和社区发现。
4. 生物信息学:可以挖掘基因序列中的频繁模式,用于寻找基因间的关联和功能预测。
三、使用方法fpgrowth函数通常通过调用相应的库或软件包来实现,例如Python 中的mlxtend库、R语言中的arules包等。
以Python为例,使用mlxtend库的fpgrowth函数可以按照以下步骤进行:1. 导入库:首先导入mlxtend库。
2. 准备数据集:将数据集整理成列表或数组的形式。
第11卷 第2期集美大学学报(自然科学版)Vol .11 No .2 2006年6月Journal of J i m ei University (Natural Science )Jun .2006 [收稿日期]2005-10-31[基金项目]福建省自然科学基金资助项目(A0310011);福建省科技三项重点项目(K04005)[作者简介]石明兰(1967-),女,讲师,硕士生,从事数据挖掘研究.[文章编号]1007-7405(2006)02-0117-05面向目标的关联规则挖掘的一个FP 增长算法石明兰1,3,杨 晖2,叶东毅3(1.福州大学土木工程学院,福建福州350002;2.福州大学至诚学院,福建福州350002;3.福州大学数学与计算机科学学院,福建福州350002)[摘要]将FP 2Gr owth 算法应用于面向目标的关联规则(OOA )挖掘,对FP 2Tree 的结点进行了修改,增加了目标支持度计数和效用度累计两个字段,对FP 2Gr owth 算法进行了改进.实验结果表明,改进后的方法比基于Ap ri ori 算法和基于Dfree 算法的OOA 挖掘效率更高.[关键词]数据挖掘;关联规则;OOA;效用度;FP 2Tree;FP 2Gr owth [中图分类号]TP 30116[文献标识码]A0 引言传统的关联规则挖掘的是项集之间的关联规则[1],即项目之间的关联性,而在某些应用领域希望找出项集对特定目标的支持程度,即希望挖掘满足该目标的关联规则,这些规则除应满足给定的支持度、置信度外,还应该满足用户给定的效用度[2].如在医疗数据库中,医生不仅希望知道哪些处方可以治疗病人,还希望知道其确切的疗效,在此背景下Shen Y 1D 1等提出了“基于效用度的面向目标的关联规则(OOA )挖掘的方法[2,3]”.目前挖掘OOA 的方法有基于Ap ri ori 算法[1]及基于D isjunctive 2free 的算法[4].Ap ri ori 算法及其改进形式在挖掘OOA 规则的过程中需要反复扫描数据库,并产生大量的候选集,严重影响算法的效率.DFree 算法要先计算代表集,再通过代表集来计算频繁集.基于FP 2Tree 的FP 2Gr owth 算法[5]只需要扫描数据库两次,由此构造的FP 2tree 上包含了全部的频繁项集,频繁项集的挖掘只需在FP 2Tree 上进行,其挖掘速度比改进的Ap ri ori 算法快一个数量级[5].但FP 2Gr o wth 算法在挖掘时需要递归地生成条件FP 2Tree,需要很大的时间和空间,文献[6]对FP 2Tree 进行了改进,在挖掘频繁模式时不生成条件模式树,从而大大提高规则的挖掘速度.针对OOA 挖掘的特点,笔者在文献[6]工作的基础上对FP 2Tree 的结点结构进行了扩充,增加了目标支持度计数和效用度累计两个字段,使之适用于OOA 挖掘.1 问题的描述设D ={T 1,T 2,…,T n }为一有限事务数据库DB ,其中每个事务T i (i ∈[1,…,n ]都有惟一的标识I D ,I ={I 1,I 2,…,I m }为项目(或属性)的全集,项目集I 可以划分成两个不相交的非空子集,I =In Obj∪IObj,其中In O bj为非目标项目(属性)集,I n O bj为目标项目集.集美大学学报(自然科学版)第11卷定义1 目标Obj 为一个逻辑公式,由I O bj中项目组成的目标关系式构成.设X <I n O bj为某事务T 中的任意项集,若T 中X 的全部项目都分别使目标Obj 为真(成立),则称T 支持X ∪{Obj }={X,O bj }.在事务数据库中,对于某条事务T,若目标Obj 为真,则称该事务T 支持目标Obj .用Count (X,DB )记录DB 中支持项集X 的事务数,用Count (X ∪{O bj },DB )表示事务数据库DB 中支持X ∪{Obj }的事务数,|D |为事务数据库中总的事务数.定义2 设X ΑIn O bj,X →O bj (os %,oc %,u )为面向目标数据挖掘中的一条关联规则,os %和oc %分别为该规则的目标支持度和目标可信度,则它们分别定义如下:os %=Count (X ∪{Obj },DB )|D |×100%, oc %=Count (X ∪{O bj },DB )Count (X,DB )×100%. 设项目A 为目标属性,值域为V,对任意的v ∈V,当A =v 时,由领域专家给定一个效用度与之对应,即U:f (A =v )→R ,R 为实数集.则一条记录(事务)的效用度为:其对应的目标属性值所对应的效用度的和,即U r =∑A ∈I Obj ∧A =v ∈rf (A =v )例1 表1为某目标事务数据库,I D 为区分记录的记录号.表1中ite m set 为非目标属性,而Obj 1及Obj 2为目标属性.目标Obj 可设定为Obj 1=1并且Obj 2=1,则目标由两个目标关系式用逻辑运算符构成,即Obj 1=1∧Obj 2=1.设表2为领域专家给定的目标项目属性的不同取值所对应的效用度表,则表1中事务1所对应的效用度为:015+015=1;事务4所对应的效用度为:-0.5+(-0.5)=-1.表1 一个简化的目标事务数据库DBTa b 11 A si m p l ed o b j e c ti ve bu s i ne s s da ta ba se I D ite m set Obj 1Obj 2I D ite m set Obj 1Obj 21I 1,I 2,I 3112I 2,I 4113I 2,I 3114I 1,I 2,I 4005I 1,I 3116I 2,I 3007I 1,I 3118I 1,I 2,I 3,I 5119I 1,I 2,I 311表2 目标属性不同取值所对应的效用度表(由业内专家给定)Ta b.2 Each dom a i n va l ue of obj ecti vea ttri bu te co rre spo nd i ng u tility (sp ec i fi e d by dom a i n exp e rts )目标属性效用度015-015Obj 111Obj 2定义3 任意项集X ΑI n O bj为OOA 项集.若X ∪{Obj }的支持度不小于预先指定的最小目标支持度阈值m in_os %,则X 为OOA 频繁项集.定义4 设项集X ΑIn Obj,则X →Obj 的效用度为包含X 的记录的效用度的平均值.即,u =(∑r ∈DB ∧X <ru r )/|X |,其中|X |为DB 中支持X 的记录数.定义5 若对于预先指定的最小目标支持度阈值m in_os %、最小目标可信度阈值m in_oc %和最小效用度阈值m in_u,分别有os %不小于m in_os %、oc %不小于m in_oc %及u 不小于m in_u,则X →Obj (os %,oc %,u )是OOA 规则.关于OOA 挖掘有如下结论:定理1[2] 若项集X (X ΑI n Obj)是OOA 频繁项集,则ΠY ΑX,Y ≠ ,Y 是OOA 频繁的.定理2[2] 若项集X (X ΑIn Obj)不是OOA 频繁项集,则ΠY =X,Y ΑIn O bj,Y 也不是OOA 频繁项集合.2 基于FP 2Gr owth 算法的OOA 挖掘211 构造OOA FP 2TreeOOA FP 2Tree 的结点包含6个字段:项的序号(order )、支持度计数(count )、结点的目标支持・811・ 第2期石明兰等:面向目标的关联规则挖掘的一个FP 增长算法度计数o_count 、结点的效用度累计iu 、指向最左子女结点或父结点的指针(ahead )及指向兄弟结点或结点链中下一结点的指针(next ).构造OOA FP 2Tree 的步骤:1)扫描数据库DB ,得到每个项的支持度计数和目标支持度计数.2)将项按目标支持度计数降序排列,从1开始按升序为已排序的项目编号,得到项目-序号表.3)扫描数据库DB ,对每个事务:①删除事务中目标支持度计数小于预先给定值的项,剩下的项转换成序号并排序,得到orderlist;②将orderlist 插入到OOA FP 2Tree 中,插入方法与构造FP 2tree [4]的方法相同.4)以先根次序遍历OOA FP 2Tree,生成结点链,统计具有相同序号的结点的目标支持度的计数和及效用度的累加和,并翻转ahead 指针.例2 如表1所示.设目标为Ob j 1=1∧Obj 2=1,项目I 1,I 2,I 3,I 4,I 5所对应的目标支持度计数为:5,5,6,1,1,其对应的序号分别为2,3,1,4,5,设最小目标支持度计数为1,则生成的OOA FP 2Tree 如图1所示.引理1[5] 设项集X ={I 1,I 2,…,I k }ΑIn O bj,I 1,I 2,…,I k 对应的序号分别为O 1,O 2,…,O K (设O 1,O 2,…,O K 已经按照从小到大排序).则项集X 的目标支持度计数为:在OOA FP 2Tree 中所有以根为起点,O K 为终点,包含O 1,O 2,…,O K 的路径上,以O k 为标记的结点的计数的和.由OOA FP 2Tree 的构造过程及项集的长度归纳不难证明引理1.引理1表明,OOA FP 2Tree 中包含了数据库DB 中所有OOA 频繁项集.212 基于OOA FP 2Tree 构造被约束子树定义6 设k i ,…,k 2,k 1为项目的序号,其对应的项目分别为I k ,…,I 2,I 1,L 为OOA FP 2Tree 树中从根结点到结点P 的一条子路径.L 被项集{I k ,…,I 2,I 1}约束:表示有P 的子孙结点M ,使得序号k i ,…,k 2,k 1出现在从P 到M 的路径上,并且结点M 对应的项目序号为k 1,P 的紧邻子结点对应的项目序号为k i ,结点P 称为子路径L 的端点.结点M 的目标支持度计数c 称为被约束子路径L 的目标支持度计数.OOA FP 2Tree 中所有被{k i ,…,k 2,k 1}约束的子路径组成的子树,称为被{k i ,…,k 2,k 1}约束的子树,记为S td (k 1,k 2,…,k i ).设结点N 为S td (k 1,k 2,…,k i )的结点,则所有经过结点N 被{k i ,…,k 2,k 1}约束的子路径的目标支持度计数和,称为结点N 的目标支持度计数.任意序号为k 的结点,从k 的结点链中的每个结点出发,自底向上搜索OOA FP 2Tree 即可以构造S td (k ).设指针数组branch[],每个指针指向一条被约束子路径的端点;整型数组o _b _count []、b _count[]及b_iu_count[]分别记录各个被约束子路径的目标支持度计数、支持度计数及效用度累加和;整型数组S td{k 1,k 2,…,k i }_o_count[]、S td (k 1,k 2,…,k i )_count[]及S td (k 1,k 2,…,k i )_iu_count[],记录S td (k 1,k 2,…,k i )中具有相同序号的结点的目标支持度计数、支持度计数及效用度累加和.例3 图1所示的OOA FP 2Tree 中,序号为3的结点的被约束子树如图2所示.设序号k 和j 对应的项目分别为I k 和I j ,由引理1和构造被约束子树的过程可以得到引理2.引理2[5] 若序号为j 的结点在S td (k )中出现,则项集I k ,I j 的目标支持度计数为S td (k )_o_count[j].被约束子树S td (k 1,K 2,…,k m -1,k m ),可以由S td (k 1,k 2,…,k m -1)构造,构造过程与构造S td (k )类似.并得到如下引理.引理3[6] 若序号为j 的结点在S td (k 1,k 2,…,k m )中出现,则项集{I k 1,I k 2,…,K k m ,I j }的目标支持度计数为S td (k 1,k 2,…,k m )_o_count [j].213 基于OOA FP 2Tree 的被约束子树的OOA 算法使用全程数组变量O_FP [],用于存放OOA 频繁项集(项目用对应的序号表示),len 表示该频・911・集美大学学报(自然科学版)第11卷繁项集的长度.对每个序号i ,主程序通过序号-项目表将序号i 转换成对应的项目,存入O 2FP []中,输出OOA 频繁1-项集及其目标支持度.构造OOA FP 2Tree 的被约束子树S td (i ),然后应用过程m ine (),挖掘更长的OOA 频繁项集,算法如下: Procedure OOA_FP (OOAFP_Tree ){L en =0;For i =Max_order downt o 1do {/3Max_O rder 为最大的项目序号3/O_FP [++len ]=ite m (i );输出OOA 频繁1-项集及其目标支持度计数、支持度计数及效用度累加和;基于OOA FP 2Tree 构造S td (i );I f (S td (i )中存在非根结点)M ine (S td (i ));L en 22;}}基于S td (i )挖掘更长OOA 频繁项集的算法M ine ()如下:Procedure m ine (S td (k 1,k 2,…,k m )){For i =k m -1downt o 1do{I f (S td (k 1,k 2,…,k m )_o_count[i]大于等于最小目标支持度)O_FP[++len ]=ite m (i );输出O_FP 中的OOA 频繁项集及其目标支持度计数、支持度计数及效用度累加和;基于S td (k 1,k 2,…,k m ),构造S td (k 1,k 2,…,k m ,i );I f (S td (k 1,k 2,…,k m ,i )中存在非根结点)M ine (S td (k 1,k 2,…,k m ,i ));L en 22;}}} 定理3[6] 对于给定的事务数据库DB 和最小目标支持度阈值,基于被约束子树的挖掘算法能够正确产生所有的OOA 频繁项集.证明 1)由引理2和引理3可以证明本文算法产生的项集都是频繁的;2)设任意项集X ={I 1,…,I k },其目标支持度计数为o_count ,I 1,…,I k ,对应的序号分别为o 1,…,o k .由引理2和引理3,对项集X 的长度进行归纳证明,当k >1时,S td (o 1,…,o k -1)将由算法构造,且S td (o 1,…,o k -1)_o_count (o k )=c ;再对项集X 的长度进行归纳,可以证明X 由本文的OOA 2FP 算法生成.在挖掘出所有频繁集后,再根据计算公式,计算出规则的目标可信度和效用度,以及根据预先给定的目标可信度阈值和效用度阈值,判断该规则是否符合设定的要求.例4 根据挖掘OOA 频繁项集算法,可知项集X ={I 1,I 2,I 3}是OOA 频繁的,且X →Obj 的支持度计数、目标支持度计数、效用度累加和分别为3,3,3.则该规则的目标可信度和效用度分别为:3÷3=1,3÷3=1.设目标可信度和效用度阈值分别为50%、50%;则{I 1,I 2,I 3}→Obj 为OOA 规则.・021・ 第2期石明兰等:面向目标的关联规则挖掘的一个FP增长算法3 性能分析笔者所采用的实验环境为:I ntel Pentium 4pu 2140GHz 、2142MHz,512MB 内存;编程语言Del phi 710.测试数据库为Mushr oom ,实验结果如图3所示,从图3可以看出:基于OOA FP 2Tree 的OOA 挖掘算法比基于Ap ri ori 算法的OOA挖掘算法[2,3]的速度有很大的提高,也比基于Dfree 的OOA 挖掘[6]算法速度更快.4 小结笔者将基于改进的FP 的算法应用于OOA 挖掘中,理论分析和实验结果表明,该方法在时间效率上比基于Ap ri ori 的OOA 挖掘[2,3]方法有较大幅度的提高,也比基于Dfree 算法的OOA 挖掘[7]方法有所提高.[参考文献][1]Agrawal R,Srikant R.Fast algorith m s for m ining ass ociati on rules in large database [C ]//I N T L.Pr oc of the 20th I N T Lconf on Very Large Databases .San Francisco:Morgan Kauf mann,1994:4872499.[2]Shen Yi 2Dong,Zhong Zhang,Q iang Yang .Objective 2O riented U tility 2Based A ss ociati on M ining [C ]//I EEE .Pr oceed 2ings of the 2002I EEE I nternati onal Conference on Data M ining (I C DM π02).W ashingt on:I EEE Computer Society,2002:4262433.[3]Ray mond Chan,Q iang Yang,Yi 2Dong Shen .M ining H igh U tility Ite m set [C ]//I EEE .Pr oceedings of the Third I EEEI nternati onal Conference on Data M ining .W ashingt on:I EEE Computer Society,2003:19226.[4]Bykowski A,R igotti C .A condensed rep resentati on t o find frequent patterns [C ]//AC M.Pr oceedings of the T wen 2teenth AC M SI G ACT 2SI G MOD 2SI G ART Sy mposiu m on Princi p les of Database System s .Santa Barbara:AC M p ress,2001:2672273.[5]Han J ia wei,Pei J ian,Yin Yi w en .M ining frequent patterns without candidate generati on [C ]//AC M.Pr oceedings ofthe 2000AC M SI G MOD internati onal conference on Management of data .Dallas:AC M p ress,2000:1212.[6]范明,李川.在FP 2树中挖掘频繁模式而不生成条件FP 2树[J ].计算机研究与发展,2003,40(8):121621222.[7]杨晖,叶东毅.D isjunctive 2free 模式算法在OOA 挖掘中的应用[J ].计算机科学,2005,32(8A ):1672170.A FP 2Growth A lgor ith m for O bjecti ve 2or i en ted A ssoc i a ti on Rules M i n i n gSH IM ing 2lan1,3,Y ANG Hui 2,YE Dong 2yi3(1.College of Civil Engineering,Fuzhou University,Fuzhou 350002,China;2.Zhi Cheng College,Fuzhou University,Fuzhou 350002,China;3.College of Mathe matics and Computer Science,Fuzhou University,Fuzhou 350002,China )Abstract:This paper app lies FP 2Gr owth algorith m t o objective 2oriented ass ociati on rules (OOA )m in 2ing .For the sake of adap tability,FP 2Gr owth algorithm is i m p r oved by modifying FP 2tree πs nodes and adding t w o fields of objective support counting and utility counting for each node .Experi m ental results show that thep resented app r oach is more efficient than the algorith m s based on Ap ri ori or D isjunctive 2free patterns .Key words:data m ining;ass ociati on rules;OOA;utility;FP 2Tree;FP 2Gr owth(责任编辑 陈 敏)・121・。