1 算法的基本思想

增量式构造概念格就是在给定原始背景K=(O,A,R)所对应的初始概念格L=(CS(K),£)以及新增对象O*的情况下,求解形式背景K*=(OÈ{O*},A,R)所对应的新的概念格L*=(CS(K*),£)。根据Godin算法,可以按照初始概念格中的每个节点和新增对象之间的关系,形式化地定义概念格节点的不同类型,分为不变节点、更新格节点、产生子格节点以及新生格节点。

2 算法描述

2.1 建数据结构

建立统一的集概念格的构建和Hasse图的绘制为一体的概念格节点的数据结构:

Struct  CLindividualvertex

{

    Int vertexid;//记录该节点的标识码

    Int layernum;//记录节点的层数

    Carray<int,int>  * intension;//节点的内涵

    Int ext_count;//外延的基数,记录具有共同的内涵的对象的数目;

    Carray<int,int>  * sonvertexids;// 记录子节点的标识码(可能为多个)

    Carray<int,int>  * parvertexids;// 记录子节点的标识码(可能为多个)

    Dword  x;//节点x的坐标

    Dword  y;//节点y的坐标

} CLstructurevertex, CLstructurevertexnew

Carray< CLindividualvertex , CLindividualvertex > cllattice

采用这种数据结构,Vertexid用来记录节点的编号(标识码),便于建立各节点之间联系;layernum用于记录节点在整个Hasse图中的层号,从而确定其y坐标;定义了一个动态数组intension用于记录节点的内涵集,即用于记录该节点的项目集;整形变量ext_count用于记录外延的基数;定义了两个动态数组sonvertexids和parvertexids分别用于记录该概念节点的子节点的标识码和父节点的标识码;并且定义了记录坐标的变量x和y;基于以上数据结构,定义了两个结构体对象CLstructurevertex和CLstructurevertexnew,前者用于记录从数据库中读取的记录的数据,后者用于记录从数据库中读取的记录数据与概念格中的某个节点相交所产生的新的节点;动态数组cllattice用于记录整个概念格。

如果C是一个更新格节点,则在新格L*中C被更新为(extent(C)Èf(O*),intent(C))。在算法中,对于更新节点,对其外延基数加1,内涵不变,即C.ext_count = C.ext_count + 1。

该算法是在每增加一个新节点时确定其层号layernum,在添加新节点时,采取从上到下的办法,即从最高层节点到最低层节点依次比较,如果新对象与某层的一个结点的交集存在,且在以前的概念格中不存在,则该节点是产生子节点,添加一个新节点,该新节点的内涵等于产生子节点内涵与新对象内涵的交集,其层号在产生子节点的基础上加1。当与该产生子的子节点比较时,生成的交集在以前的概念格中肯定存在,不做处理,退出循环。

在进行从上到下的比较时,对于第一个节点,即内涵为空的结点不做比较,该节点是任何节点的祖先节点。

2.2 算法步骤

步骤(1):构建最低层节点C0,并加入到概念格cllatice中:C0.layernum = 0,C0.ext_count = 0,C0.intension = 所有项目的集合,

C0.y = ystart(ystart:y方向上的起始坐标)。

步骤(2):构建最高层节点Ch,并加入到概念格cllatice中:Ch.layernum = 1,Ch.ext_count = 0,C0.intension = ,

Ch.y = ystart+deltay (deltay:相邻层间y方向上的间隔)。

步骤(3):输入每条记录,构成该记录对应的事务T。

步骤(4):对按节点序号升序排列的每一个节点C,如果C.intension是T.intension的子集,那么,C.ext_count = C.ext_count + 1。

步骤(5):如果C.intension不是T.intension的子集,计算intersection = C.intension∩T。

步骤(6):如果intersection在原概念格中不存在,并且intersection≠T.intension,那么新增节点N:N.intension = intersection;N.ext_count = C.ext_count + 1;N.layernum = C.layernum + 1;N.y = C.y + deltay。增加N到C.parvertexids,并增加C到N.sonvertexids;增加N到T.parvertexids,并增加T到N.sonvertexids。

对于每个C的父节点M,如果M.intension Ì N.intension,那么从C.parvertexids中删除M,并从M.sonvertexids中删除C;并将N加入到M.sonvertexids,将M加入到N.parvertexids。M及其祖先节点的层号分别加1,y坐标分别加上deltay。

步骤(7):如果intersection在原概念格中不存在,并且intersection = T.intension,那么新增节点N′:N′.intension = intersection = T;N′.ext_count = C.ext_count + 1;N′.layernum = C.layernum + 1;N′.y = C.y + deltay。增加N′到C.parvertexids,并增加C到N′.sonvertexids;如果N′的父节点为空,则添加顶层节点M′到N′.parvertexids,并增加N′到顶层节点M′.sonvertexids。

对于每个C的父节点M,如果M.intension Ì N.intension,那么从C.parvertexids中删除M,并从M.sonvertexids中删除C;并将N加入到M.sonvertexids,将M加入到N.parvertexids。M及其祖先节点的层号分别加1,y坐标分别加上deltay。

步骤(8):重复步骤(3)~ 步骤(7),直至所有的记录参与概念格的构建。

2.3 绘制Hasse图

在构建概念格的同时可以考虑Hasse图的绘制问题,绘制方法为:确定每个节点的x坐标,记Xcenter为绘图区域X方向的中点的X值,nNum表示同一层的结点的序号(即同一层的第nNum个节点),nDeltaX表示X方向的相邻节点之间的间隔。X坐标的确定方法为:按层号layernum升序排列,对每层的节点C,

C.x = Xcemter + (nNum + 1)/2 *nDeltaX*pow(-1,nNum)。该方法保证同一层的各个节点等距离均匀分布在绘图区域X方向的中点的两边。确定了每个节点的X,Y坐标后,对已经建好的概念格的每一个节点,分别在该节点与其父节点之间画线,即可得Hasse图,即按节点序号升序排列的每个节点C,在每个节点与其每个父节点画直线。

 

3 参考文献

[1] 李德仁,王树良.空间数据挖掘理论与应用.

[2] 谢志鹏,刘宗田.  概念格与关联规则发现[J]. 计算机研究与发展. 2000(12)