函数依赖挖掘与应用于
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数依赖挖掘与应用
周健昌
1034064004
一、函数依赖概述
从关系中挖掘发现函数依赖是一项重要的数据库分析技术。
1.函数依赖挖掘的应用
一般情况下,我们使用函数依赖(Functional Dependency,FD)的过程是这样的:根据现实的业务或项目的要求,从业务逻辑中抽象出数据间的规律与限制,然后通过程序语言、表格或数据库等工具建立数据间的约束规律。
如果我们把这种先有数据规律后再产生数据的过程称为正向过程的话,那么FD挖掘过程中更多的应用在于“反向过程”:即从大量数据中,挖掘数据之间存在的一种“决定与被决定”的关系。
我们都知道函数依赖可以降低数据库的冗余,增强信息的一致完整性。
但在现实中,当我们面对一个不太了解领域,获得大量的数据(如股票挖掘与分析),我们如何做到这一点呢?如何从这些大量的数据中获得较普遍的规律呢(AR是特定值所反映出来的特殊规律)?
面对一大堆的数据,我们如何判断这些数据是否完全合乎业务逻辑?如果有错,我们如何找到这些的错误?
函数依赖就给我们提供了解决这些问题的一种有效的手段。
2.函数依赖挖掘分类
从1971年提出函数依赖挖掘的概念以来,经过专家学者们的共同努力,现已有许多函数依赖挖掘的方法。
总的来说,这些算法可分为:
i.生成并测试候选集的方法
总体策略同Apriori算法,具体处理某一结点的做法是基于属性集X的具体不同取值而将元组集划分等价类。
ii.最小覆盖(The Minimal Cover)方法
从原始关系中提取一个简化的划分,然后使用这样的划分,计算一致的元组集合,并生成最大一致元组集,最后根据最大一致元组集可以找到最小FD
iii.规范概念分析(Formal Concept Analysis)方法
根据关系数据库理论与规范概念分析之间的关系,使用预定义的规范概念分析闭集操作符来提取数据库中成立的函数依赖。
二、函数依赖挖掘
下面,我主要结合自己近期的学习内容,介绍一种经典的FD挖掘算法—TANE算法。
TANE的总体思想是将关系实例r按元组的不同取值将它们分组,这使得即使对有大量元组的关系,测试其有效性也变得有效快捷。
在具体介绍TANE算法前我们首先介绍与之相关的一些术语。
1.基本术语
等价类(Equivalent Class):
属性集X的某一等价类[t]X是指在给定关系实例中,所有与元组t在X上取值相等的元
组的集合。
●划分(Partition):
π的含义是在给定关系实例r中,X的所有等价类的集合。
属性集X上的划分的X
π是一组不相交的元组的集合(等价类)的集合。
这样,每个集合(等价类)这就是说X
内部的元组在属性集X中的取值是相等的,并且,这些集合的并集就等于关系实例r。
●集合的阶(Rank):
指集合中所含元素个数,集合S的阶记为|S|
比如,等价类[t]X的阶|[t]X |:表明等价类内有多少个元组。
π|指的是划分Xπ的内部有多少个等价类。
划分的阶|X
●精简划分(Stripped Partition):
X的精简划分
π∧是指在划分Xπ的基础上去除所有阶为1 的等价类后的划分。
X
等价类:[1]{A}=[2]{A}={1,2}
π={{1,4,7},{2},{3},{5},{6},{8}}
划分:D
精简划分:π∧={{1,4,7}}
2.TANE算法的搜索策略:
在谈及TANE算法搜索策略前,先要说说TANE算法的总体目标:找出给定关系r的所有最小非平凡函数依赖:X→A.其中,|X|>=1 ,|A|=1。
其依据如下:
所谓X→A是“最小”的,是指若X→A成立,则X的任何真子集Y,都有Y→A不成立。
∉。
所谓X→A是“非平凡”的,是指若X→A成立,则A X
只挖掘|A|=1的原因是根据阿姆斯特朗公理中的合并律,任何大于1的右方属性集,都可以由多个X→A形式的FD合并而成。
a)总体而言,处理的属性集从小到大:
即从一个属性集开始,当处理完所有n个属性的属性集以后,再处理n+1个属性的属性集。
这个过程实际上同Apriori算法是一致的。
类似的从小到大的搜索策略已被广泛应用于许多数据挖掘的应用,除了可以高效地剪枝,算法的效率还基于通过前面已计算各层的结果来计算当前层各结点,以尽量减少时空耗费。
意图:从小到大的过程是要确保考虑与输出的都是最小函数依赖。
b)局部而言,处理的属性集从大到小:
具体处理一个属性集时,遵循从大到小的判定过程:当处理属性集X(其中|X|=n)时,检查X的每个真子集Y(其中|Y|=n-1)是否有真子集?
尽管我们只检查X 的每一个n-1阶的真子集Y ,但由于在a) 中是从小到大的过程,在Y 中已可确保Y 的任何一个n-2阶的真子集Z 的有效性,依此类推,故而我们只检查Y 的有效性就可判定X 的任一阶真子集的有效性。
意图:从大到小的过程中是为确保考虑的都是非平凡函数依赖。
3. TANE 算法的剪枝策略:
a) 右方集剪枝:
右方集
()
X C
+
定义:
()
{|:\{,}}X A R B X X A B B C
+
=∈∀∈→不成立
()
X C
+
的含义:()
X A C
+
∈
的是指对R 中任意属性A ,如果属性集X 中去除属性集X
中去除属性A(即X\{A})则X 内部不存在着任何非平凡函数依赖。
于是,若()
X A C
+
∈
,并且X\{A}→A 成立,则我们可就可以认为X\{A}→A 是最小的
非平凡函数依赖。
()
X C
+
的剪枝依据:
按照
()
X C
+
的含义, 当
()
X C
+
=∅时,即R 中的任一属性在属性集X\{A} 里,仍会出
现函数依赖,因此无论如何,:\{,}B X X A B B ∀∈→都不是最小函数依赖,故X 集以及X 的任何真超集都可不用计算,从而中将X 剪枝。
b) 键剪枝:
如果不能检测出属性集X 是一个键或超键,则任意\A R X ∈,非平凡函数依赖X →A 成立,且X 的任意真超集(超键)Y ,都有任意,\{,}B R X A B B ∀∈→,成立,但Y →B 并非最小函数依赖,故X 的任意真超集都不用计算,从而可以剪去键Y 。
4. 如何判断函数依赖:
a) 划分细化的概念
当划分X π中的每个等价类都是划分A π中相应唯一一个等价类的子集时,我们称划分X π细化了划分A π。
有了划分细化的概念,下面的FD 的判断依据就呼之欲出了。
FD 判断依据1:当且仅当划分X π细化划分A π时,函数依赖X →A 成立。
图1. 划分细化的图解
注:
如果每一种着色代表着一个等价类的话,则左图X π细化了A π,但右图由于元组5的存在,所以X π并非细化A π。
再细想,若A π划分细A π,那么必有|A π|=|{}XU A π|,这是说,XU{A}所含有种种要素的等价类的个数与X 含有的等价类的个数是相等的,且对XUA 的任一等价类,总能在X 的等价类中找到一个与之相等(大小写与对应元素),于是我们可以得到以下的FD 判断依据:
FD 判断2:当且仅当|A π|=|{}XU A π|时,X →A 成立。
对判断的不太严格的证明如下:
1. 我们可以把划分所依据的属性集(如A π的依据是X )理解为相应受到限制的属性
集,则属性集每多一个属性就多一个约束条件,所以对XU{A}划分所得结果必是
对X 所划分的结果的子集,因而{}XU A π总是细化A π,从而{}||||XU A X ππ≥总是成立的。
2. 若A π细化A π,则{}XU A π与A π总对应相等。
由上可知,若X π细化A π,则必定有{}||||XU A X ππ=,反之一样。
b) 两个判断的区别:
● 对于判断依据1,我们需要具体地计算划分X π、A π以及两者间等等价类的对应关系。
● 对于判断依据2,我们只要得到X π与各有多少个等价类即可,而这是十分容易得到的。
显然,我们用判断依据2时,可以更快地判断函数依赖于X →A 是否成立。
5. 具体的TANE 算法:
a) 总体过程;’
注解:
1. 第6行COMPUTE_DEPENDENCIES(Le)用于找所有X\{A}→A 型的最小函数依赖,
其中|\{}|X A e =。
2. 第7行通过右方集剪枝与键剪枝将搜索究竟缩小。
3. 第8行通过所有e 层结点生成相应e+1层结点。
4. 从这个总体过程可以看出TANE 算法与Apriori 算法的总体结构是类似的。
b) 计算函数依赖过程:
注解:
1. 第1、2行正是前述的通过上层结点的()
X C
+
来计算下层结点的初始
()
X C
+
的做法 。
2. 第4-8行充分体现了定理
3.1 以及
()
X C
+
的内在含义。
3. 第3行可以看出是依次处理Le 层的结点。
c) 剪枝过程:
1. 第1、2、3行体现的正是右方集的剪枝策略。
2. 第4-8行体现的是键剪枝的策略。
3. 假设X 是一个超键且A ,则函数依赖X\{A} A 是成立且是最小的,当且仅当X\{A}
是键且()
,X B X A C
+
∀∈∈,由些可知,第7行的输出是正确的。
d) 生成下层结点:
注解:
1. 第2行的PREFIX_BLOCK (Le )是指对Le 逻辑上按共同的前缀进行分组。
2. 第3行体现的是同一具共同前缀组中两个不同结点,两两合并形成一个下层结点。
3. 第一个行对于刚生成的阶Le+1的结点从小到大的检查,确定它所有阶为e 的真子集结
点是否都存于Le 中。
若都是存在,则将这个阶为e=1的结点纳入到Le+1集合中。
e)生成下层结点划分信息:
6.具体实现TANE算法的注意事项:
a)关于上层结点的查找:
从前面的具体的算法可以看出,每一个具体的步骤都涉及查找上层结点,对于每一个n 层的点,我们都要查找或判断n个n-1层结点的某些条件。
这样的情况下,查找的效率就成十分的重要考虑因素。
我们的措施(类似于缓存的策略):
a)建立一个映射到n-1层各结点的哈希表,用于存放已查找过的结点
b)需查找某个n-1层的结点时,先到哈希表中查找,若找到,则趎接返回这个结点
c)否则,则从n-1 层的所有结点中,顺序地查找,直到找到或者为空,再把结果(空
则插入空标记)插入到哈希表,并返回这个结点或空标记。
b)关于降低空间复杂度:
C ,X的划分信息等)
●每一个结点都会包含大量的信息(如X取值、X相应的()X
●其中最大的究竟消耗是每一结点对应着一个划分信息
假定我们正处理第n层的结点,则
●前n-1层结点中,我们只用到第1层以及n-1层的结点。
●使用第1层以及n-1层时,我们也不用它们的划分信息。
可采取措施:
●删除第2~n-1层所有结点的所有信息。
●删除第1层、第n-1层的划分信息。
7.TANE算法的效率:
TANE算法时间复杂度:随R属性数目指数据级增长,随元组数目线性增长,这是FD 挖掘的必要性的复杂度。
三、 TANE 扩展到AFD 挖掘: 1. 近似函数依赖度的定义: 从关系实例r 中去除最小数目N d 的元组,使得X →A 成立,这个N d 与关系实例r 中元组数目|r|的比例就是FD 近似度,严格定义如下:
()min{|||A r\S }/||e x s s r X r =⊆→且在中成立
2. 近似函数依赖:
给定一个阈值e L (01L e ≤≤),若()
X
A L e e →≤则我们称X →A 是一个近似函数依赖。
3. 在TANE 原算法中的更改:
对于给定的阈值e L ,我们可以容易地修改TANE 算法,使它能够挖掘近似函数依赖。
关键的修改是在COMPTE_DEPENDENCIES 中的第5行关于有效性测试的部分:
此外,剪枝策略也必要做相应的弱化,将COMPUTE_DEPENDENCIES 中第8、9行用以下两替代:
4. 如何快速计算e(X →A):
实际上,我们只要判断出e (X →A)与e L 之间的大小关系即可,而不用精确计算,于是我们可用以下的公式加快判断:()({})()()X XU A X A X e e e e →-≤≤ 1. 当()({})X XU A L e e e -≥时,()X A L e e →≤必定成立 2. 当()X L e e >时,()X A L e e →<必定不成立
3. 只有以上两个判断都不可用时,才计算()X A e →
当我们直接计算()X A e →时需要(||)r O 的时间,但当我们做用()X e 与({})XU A e 时,我们可在计算X 的划分信息时就同时得到计算,故而节约大量时间。
四、 后续工作:
1. 为TANE 加入一些可行的剪枝策略以提高效率
TANE 算法的剪枝策略为函数集积的挖掘节省了大量的时间与究竟,尤其是当结点越小(即处理属性集X 的阶越小)时,剪枝所带来的时空越是可观,但TANE 所提出来的剪枝策略完全排除了不必要的下层结点的生成了吗?未必!如下举例子:
C+假定在第2层结点中,结点(D,E)中检测到D→E,E→D都成立,则站点因为()X 为空而被剪去,所以在所有下层的结点属性集的都是不会同时包含属性D、E, 但是,假定(A,C)、(A,D)、(A,E)内部都没有必现最小非平凡函数依赖,且各站点也不是键。
因而,第三层至少形成以下结点:(A,C,D)、(A,C,E)。
问题出来了:根据阿姆斯特郎公理,我们如果知道A→B,B→A,则对于任何X→Z形式的函数依赖,如果∉,则我们只要将X中的A替换成B,(假定替换后得到Y),则Y→Z ∈,但B X
A X
必定是成立的(对于Z中含A的情况同样可推)。
本来我们可能通过简单的推理以及简单的替换就可以判断这些结点是否有函数依赖成立,但现在我们要经过复杂的结点生成,函数依赖计算、剪枝才能判断,更重要的是因为第三层多生成了类似于(A,C,E)这样的结点(通常不仅仅一个),便得下层结点多生成了很包含属性E的重复结点,从而在很大程序上会使时空复杂度增加。
2.为FD、AFD、CFD、AR、AAR的挖掘建立一个统一的算法模型(通过引入一些度量
作为上述几种关系的区分标准)
已有学者提出基于模板概念的FD、CFD、AFD、AR、AAR的统一模型,并提出可将一些挖掘AR的算法作相应的修改使之适用于挖掘FD。
同样也已有学者修改TANE算法,使之可以对CFD进行挖掘,并提出修改后的算法—CTANE
我们的想法就是通过一些数值型指标(不一定基于前人的模板思想),来统一FD、AFD、CFD、AR、AAR。
3.为TANE算法引入一些度量,以改进TANE算法的效率。
我们都知道,AR时为项集引入频繁度可以减少生成频繁项集的频繁项个数从而可以加快AR的挖掘。
同样的道理,我们可以为FD等的挖掘引入一此度量以减少生成的节点信息或直接加快挖掘速度。
五、参考文献
[ 1 ]YHuhtala, J. Karkk amen,R Porkka, H. Toivonen, "TANE: An efficient algorithm for discovering functional and approximate depen-dencies," Comput. J., vol. 42, no. 2, pp.
100-111, 1999.
[ 2 ]W. Fan, F. Geerts, X. Jia. SEMANDAQ: A data quality system based on conditional functional dependencies. In Proc. VLDB, 2008, demo.
[ 3 ]Fan, W., Geerts, F., Xiong, M., Lakshmanan, L.V.S.: Discovering conditional functional dependencies. In: ICDE (2009)。