引言
目的:是找到所有的关联式规则(Association-Rules),而不是检测一个关联式规则是否存在。
下面会讲到的内容:
1.Association-Rules的基本概念
2.Apriori-Algorithmus
3.优化Apriori
4.FP-trees
5.Finden häufiger Muster in Zeitreihen//暂时不知是干嘛用得
6.有约束条件的Association Rules(Constraint-basierte Association Rules)
7.多层Association-Rules(Multi-Level Association Rules)
Association Rule
就像名字说得一样,他表达的是不同事物之间的关系。举个例子,商店购物车分析:通过分析客户的购物清单,可以找出客户购物时,不同物品之间的关系。比如去超市购买牛奶时一般会顺便购买鸡蛋。
基本概念:
item:单个元素(einzelnes Element)
itemset:Item的集合(Menge von Items)
Transaction(Transaktion):清单,有两种表达结构
1.关系结构(Relationsale Struktur):
<Tid,item>
<script type="math/tex" id="MathJax-Element-1305">
</script>
e.g.<1,item1><1,item2><2,item3>
2.紧凑结构(Kompakte Struktur):
<Tid,itemset>
<script type="math/tex" id="MathJax-Element-1306">
</script>
e.g.<1,{item1,item2}><2,{item3}>
在购物车分析中item就是指物品,transaction就是指单次购物买得东西。他和数据库里的概念木有关系
Support:itemset I的Support是指包含有I得Transaction的数量
Minimum Support
σ
:Support的阀值
Frequent itemset: 指Support大于
σ
的items
例子
Support({Milch})=3(75%)
Support({Obst})=3
Support({Milch,Obst})=2(50%)
假设 σ=60 ,那么就有:
{Milch}和{Obst}是frequent,{Milch,Obst}则不是
maximal:
我们说Frequent itemset 是最大的(maximal),当且不存在任何一集合,同时满足1.它属于这个集合的子集,2.这个集合也是frequent。
(Es reicht, die maximalen Frequent Itemsets explizit zu erzeugen, um die Frequent itemset zu kennen //不知啥意思???)
闭合性(Closedness):
一个itemset是闭合的(closed),当不存在任何一个超集和拥有相同的Support。
Association Rules选择的标准
//插图看
a⊂b和b⊂a
的不同
举个例子,对比一下下面两种说法的不同:
1.买可乐的人,一般会顺便买薯片
2.可乐和薯片经常一起被卖出
第一种说法的说服力明显比较强//不觉得??把第一种说法里的薯片和可乐倒过来就觉得了
A⇒B[s,c]:
其中A和B为itemset
s =
A⇒B
的support = support(
A∪B
)=p(
A∪B
)
//注这里不是指或,而是指同时存在
c =
A⇒B
的confidence = support(
A∪B
)/support(A)=p(B|A)=p(A \land B)/P(A)
Regel选择的标准:
Minimum Support:
σ
Minimum Confidence:
γ
我们希望的Regel应该满足:
s>=σ,c>=γ
//那么
σ和γ
选高或者选太低了会怎么样呢????
Apriori
1.从含一个元素的集合(1-Sets)开始:简单的数数
2.通过含k-1个元素的集合((k-1)-Sets)推出含k个元素的集合(k-Sets),分三个步骤:
Join Step:通过join从(k-1)-Sets中推出候选的k-Sets
Prune-Step:删除所有不符合要求的候选(Kandidaten)(比如把所有含有不在k-1Sets中出现子集的候选都删了)
Support Counting:就数了,不符合的都删了
//当k=2时,不用进行Prune.为什么???
L_1={large 1-itemsets};
for(k=2;L_k-1!=null;k++)do begin{
C_k = appriori-gen(L_k-1);
forall transactions t in D do begin{
C_t = subset(C_k,t);
forall candidates c in C_t do{
c.count++;
}
}
L_k = {c in C_k|c.count >= minsup};
}
Answer += L_k;
//上面的程序好像没有看到剪枝啊
//用hash树可以快速的查找一个itemset是否在Transaction中。
//怎么做呢???S30-S31
多维Association Rules(Multidimensionale Association Rules)
寻找的是不同属性的的值之间的关系(Beziehungen zwischen Werten verschiedener Attribute)
Regel:
nationality=French⇒income=high[50
income=high⇒nationality=French[50
对于求多维Association Rules可以先把多维换成一维:
<1,Italian,50,low>⇒ <script type="math/tex" id="MathJax-Element-1325"><1,Italian,50,low> \Rightarrow </script><1,{nat/Ita,age/50,inc/low}>
<2,French,45,high>⇒ <script type="math/tex" id="MathJax-Element-1326"><2,French,45,high> \Rightarrow</script><2,{nat/Fre,age/45,inc/high}>
这样就可方便使用Apriori了
多层Association Rules(Multi-Level Association Rules)
举个例子,面包其实是一个泛称,他还可以分为白面包啊全麦面吧啊等等,而白面包之下可能还能分为其他具体类别。因此存在多个层次。
Level-Crossing Association Rules:
这种Association Rules规则规定在产生候选集的时候,允许把不同的层次的itemsets分配一起。比如:
白面包⇒牛奶
(Für Mixed-Level Kandidaten kann man als Minimum Support den des unterenLevels nehmen.??????)
一般情况下只有在高层概念之间有比较高的Support,但同样的层级越高,我们的兴趣反而越小。比如:
吃得⇒喝的
Naheliegender Ansatz:
items的集合是混合的,各层的东西都有(Menge der Items enthält auch die Kategorien)。比如:{全麦面包,面包,营养品,牛奶}
但是在生成候选集合的时候,不允许同种类别之间进行混合,比如下面这个rule是不行的:
全麦面包⇒面包
(Vorgehen-wie bisherige Verfahren,bis auf dass Items, die hierarchische Beziehun haben, nicht kombiniert werden.????)
悲剧后果:
Frequent Itemset的数量会随着层数的增加呈指数增长
而且会产生许多相识的Association Rules
使用经过编码的TA表格(kodierte TA-Tabelle)
我们为各种Item进行编码,举个例子我分把牛奶编号为1,那么相应的全牛奶我们可以编码为12,恒牛奶则编码为11.以此类推,用数字表示种类,用数字的个数表示深度(这样好像有个数限制,就10个数字??)。那么我们可以得到一个编码后的TA(Transaction)表:
在此之前我们得到的都只是一维的表· Lk ,现在我们得到的是二维的L[i,j]
//插图 这个其实还是有点晕
提高识别Frequent Itemsets的效率(Schnelles Identifizieren von Frequent Itemsets)
主要介绍一下一下方法:
1.直接hash并剪枝(Pruning)
2.Sampling
3.Bayado//不知是什么鬼
4.FP-Trees
DHP(direct hashing and pruning) algorithm
现在的情况是,在k比较小得时候,对应的候选集非常大。举个例子,当
L1=1000时,C2=C21000=500∗999
//别把C和L弄混了,一个是候选集,一个是。。怎么说呢。。。知道就行了
DHP的目的就是:
1.提高生成候选(就是
Ck
啊)的效率
2.把一些没用的Transaction给扔了
**基本思想:**Hash Filter
(Beim zählen des Supports der Elemente von
Ck
werden auch (k+1)-elementige Teilmengen jeder Transaktion betrachtet)//没懂????
提高候选效率
当生成 L1 时,算法同时还生成了每个Transaction对应的所有的2元itemset子集,并且还把他们hash到一个hash表中,并进行计数。
例子
/*这段表示理解不行,跳了吧
Transactions:
{1,4},{1,4},{1,7},{1,7},{2,8},{2},{2},{4},{4},{7},{7},{8},{8}
1.minsup = 2;
同个Transaction的值加起来再mod7,统计出现次数大于2的值。将这些组合起来用
H1
表示,称为第一层哈希表,把所有哈希后的值在哈希表中候选集中,数数超过minsup则过,不足则删,他们即为
L1
.
通过join生成
L2
候选
H1:1,2,4,5,7
L1:1,2,4,7,8
候选:{1,2}{1,4}{1,7}{1,8}{2,4}{2,7}{2,8}{4,7}{4,8}{7,8}
2.调整哈希值,重复上面操作
s = a minimum support;
<Set all the buckets of H_2 to zero>
/*H_2 is hash table, i.e., array of int whose domain is the range of the hash function*/
forall transaction t in D do begin{
insert and count 1-items occurences in a hash-tree;
forall 2-subsets x of t do{
H_2[h_2(x)]++
}
}
L_1 = {c|c.count >= s, c is in a leaf node of the hash tree};
*/
//下面这段是从G.K.Gupta那盗过来的
/*
Introduction to Data Mining with Case Studies
Author:G.K.Gupta
Pretice Hall India, 2006
*/
下面这个表呈现了所有可能的2-itemsets
现在把这个表里的内容hash到hash表中:最后一列纯粹为了观赏
那么这个hash函数使怎么玩得呢??
首先还是编码:
B=1,C=2,E=3,J=4,M=5,Y=6
那么现在每个itemset都可以表示成两个数据了,比如(B,E)就可以表示为13,同理(C,M)可以表示为26
接着把得到的数字进行mod 8处理,得到的结果就是对应的Bucket number了。count的含义就不说了。如果count的值大于最小Support那么把bit vector设为1,反之为0。
/*
存在问题, 按说Bucket number的Count应该是5才对,另外没有说明是怎么求出C的,是取最大那一个吗??但也可能几个都是啊
*/
所有bit vector标为0的二元对都扔了
由上表也可以看出,随着hash函数参数的不同可能导致collision,上表中Bucket number为0的项对应的就有三个paar撞到了一起,这时候就应该进行额外的判断,来选出适合的C了。
/*
第一层的可以直接从Transaction中来,比较省事。但以后应该是从上一层的L中join得到的全部候选来hash了吧??
*/
减少Transaction
中心思想是:所有不含有Frequent k-itemsets的Transaction,同时也不可能含有对应的Frequent (k+1)-itemsets。那么这个Transaction在这时就会被标记起来后者就直接扔了。
例子
假设现在我们有 L1=A,B,D,M,T ,那么很遗憾我们并不能对这些Transaction做什么,因为每个Transaction都含有 L1 中的其中一个元素,那么如果我们得到了 C2 是{(A,B),(B,M)}呢
//所以在得到C的时候就可以对应的扔了一些Transaction了。因为L一定是对应的C的子集。
Sampling
在使用Apriori算法的时候,计算每层Itemset时都需要走一遍数据库,因此使用Apriori算法是的I/O消耗是很大的。
那么Sampling的思路就是,从数据库中取出一些样品(Sample)放倒主存里(最好尽量大点,使充满主存),使绝大部分的计算针对这个样本进行。
通过这些Sample,我们的目的是找到Negative Border。
那么Negative Border是什么呢?我们知道当itemset的大小为空时,他支持所有的Transaction,而当itemset是所有元素的集合时,那么几乎不存在包含他的Transaction。因此可以看出itemset重最小到最大他对应的Frequent的数量应该是逐渐减少的。那么就存在一条线使得,当一个Frequent itemset再往上扩大一步的时候他就会变成非Frequent的。这条线我们就叫做Negative Border。
很明显Negative Border受minsup得影响。
在针对Sample进行操作的时候,我们可以通过取相对小一点的minsup,使得尽可能包括所有的Frequent itemset。相应的我们也可以通过上下浮动minsup来确定真实Negative Border的可能区域。
//插图 说明Negative Border
Apriori-B
目的:(Weitgehende)Vermeidung der Betrachtung von Frequent Itemsets, die nicht maximal sind.就是说避免观察不是最大的Frequent Itemset。(最大就是指Negative Border边上得Itemset)
思想:不再k++了,这回决定大步向前走
(Diese Idee ist insbesondere bei großen Itemsets sinnvoll.)//呵呵??
举个例子:
从{1 2 3}{1 2 4} {1 2 5}{1 2 6}直接获得候选{1 2 3 4 5 6}
//如果都成那自然没事,但如果有一个不是fr,就可能导致漏选了,这时就该把这个不成的给细拆了。???
到目前为止学得基本上都是Apriori的变形,基本都是分两步走:建立候选,然后扫描数据库。那么能直接跳掉建立候选呢???
(Generate&Test-Paradigma???)
FP-Tree
全新的步骤,这回决定把整个Apriori给扔了:
1.把每个Transaction中的items按照出现的频率进行排序(1.5次扫描),如果两个item出现的次数相同,那么就按照字母表的顺序进行排序。另外如果一个item出现的次数直接小雨阀值了,那就直接删了把。换句话说就是只排序
L1
2.建立FP树(0.5次扫描)
3.从FP树(在主存中)抽象出Frequent Itemset
第一阶段
直接上图了。。。好吧是表来着的。。:
(Man sieht:Manche Präfixe sind recht häufig,z.B. c,f,a)
第二阶段
FP树由两部分组成:
1.就是树了
2.Header-Tabel
Tree(Baum):
1.每个排序后的Transaction都是树上得一条路径
2.每个节点都包含一个Item-ID,以及经过这个节点的路径的数目
Header-Tabel:(在生成树的同时建立)
1.Tabel中的每个项(Item)都是一个指向一个链路的指针
2.Tabel中的项都按照频率排序
//插个图 明了一下
第三阶段
1.所有的Items,从从频率最小的开始,会被依次进行处理
2.每一个步骤都抽象出这么一个Frequent Itemset:他包含有当前正在处理的Item,但是它同时也不包含有到目前为止已经处理过的Item。
3.具体操作和Apriori差不多,但就是不用在扫描数据库了。
看一下具体操作:假设最小Support是3:
Item P:
首先建立所有含有p得路径
有两条:{<(c:4),(f:3),(a:3),(m:2),(p:2)>,<(f:1),(b:1),(p:1)>}
保留下以p结束的路径:
{<(c:4),(f:3),(a:3),(m:2),(p:2)>,<(f:1),(b:1),(p:1)>}
那么maximal Frequent Patterns是{fp}
把p从树上减了
FP树处理大型数据库数据
当数据库太大时,可能导致FP-tree太大而不能存储在主存中。这时我们可以通过对Transaction进行分区,然后逐个处理。
(Projected Databases-Ergebnis der Partitionierung)
那么应该怎么分区呢??
1.首先还是要进行排序,比如排序后得到L=