Simple Data Mining and Form Processing(Java)
该项目发布于Github,https://github.com/wupian/Simple-Data-Mining。
有以下几个小功能:
- 对excel表格进行修改、合并、计算、排序、查询
- 单维、多维关联规则
- 决策树
表格处理
- 使用语言:Java
- 使用软件:Eclipse
- 程序结构及流程图
① 窗口设计
由于内容不是特别的多,因此在窗口大小设定上设定的比较小。第一次接触java的窗体设计,其实也没有想象中那么难,主要是对于表格的处理方面卡顿了一会儿。引入的是jxl.jar包。
以上为该程序的窗体设计,非常的简洁。只涉及到Frame,MenuBar,Menu,MenuItem等。
②表格处理设计
因为也是第一次用这个jar包,对很多的函数不是特别明白,经过一番搜查才懵懵懂懂写了一些东西出来。首先是最基础的打开文件,我利用了FileNameExtensionFilter筛选文件名后缀
这也是jxl的一个缺点吧,不能处理2007版的excel(也可能是我信息不正确)。对于表格的所有操作都是建立在一个二维数组上的,如下图所示
③ 排序:
对于排序的功能,也不难,首先确认用户的选择(如下图所示),然后将该属性进行排序,如果选择的是升序并且其他跟随变动,则进行一次冒泡排序,一旦有一条信息“冒泡”了,该信息所对应的其他信息也跟着一起“冒泡”(具体代码讲解在第三部分)。我选择了最好懂但是代码冗余可能比较大的一种方式,也就是写了四个条件:
i. 升序&&跟随变动 ii.升序&&不跟随变动 iii.降序&&跟随变动 iv.降序&&不跟随变动
其中有部分的函数其实是可以合并的
④ 计算:
首先,由于老师给的数据已经是数字化的了,因此我没有先对数据进行一个分析,也就是说,那些属性是数字可以计算,哪些是字符串或者别的类型的不能够计算。这是一个较大的失误,对于程序的兼容性不好。
⑤ 查询:
对于查询数据,我最初的想法可能有点局限了(写报告的时候才发现……),实现的结果是,当查询主属性的时候,默认你想要的是看全表,当查询的为非主属性的时候,显示为两列,主属性与选择查询的属性。其实还可以添加几个筛选查询,如:查询某个属性中数据相同的数据等。
⑥ 合并:
对于合并功能,我首先的考虑就是合并什么。其次考虑合并的主次性。因此最后默认主属性为第一列,然后分主文件与副文件(主文件中副文件没有的数据不处理,副文件中主文件没有的主属性数据则不合并)。
窗体显示效果
主窗口
打开文件
显示表格
排序
排序结果
合并文件
计算
关联规则
程序结构及流程图
- 单维关联规则:
这是我涉及到的数据挖掘的第一个开端吧,经过一番学习以后也有一定的理解。
首先是找出所有的频繁项集,然后再由频繁项集产生强规则。
对于频繁项集,由于数据是不确定的,如果我想对它们进行像数组那样的操作,用数组是肯定不行的。因此我粗略的学了一点关于vector的知识,它有点类似于可变数组,如vector.add(),即可在vector尾部增加一个数据。
这是简单的测试数据,左侧为id,右侧为id列表。
对于一级频繁项集 vet1,流程图如下:
由上图可以看得出,我对每个频繁项集都设定了一个存放数据的vector和存放数据计数的vector,两个分开计算。
在一级频繁项集执行完毕后,结果应该如下:
对于二级频繁项集,处理也比较简单,相当于是从一级频繁项集中选二。
类似上图
三级频繁项集:
其余类似。
其中还有一个步骤,就是每当找到一个关联规则,要计算其相应的计数vet,如果不符合支持度的设定,则用方法remove()将其删除。
找到所有的频繁项集以后,接下来就是找强规则。
我的想法是:建立一个vetnew,存放的是某个频繁项集某项的所有排序组合,然后再进行尝试联系。如下图
从第一步到第二步,我想到了一个个人认为比较巧妙的方式。以三级频繁项集为例:
其余类似。
最后一步就是计算置信度,插入表格,并显示出来。
- 多维关联规则:
首先是窗体设计,在参考了马克威分析软件以后,除了输入置信度与支持度,我还添加了一个源参数与目标参数。在经过单维关联规则后,个人认为多维关联规则在代码编写这一块会好很多。
以下是测试数据:
可以看得出,对于频繁项集中的名称,是有重复的,因此,我在命名上做了一些变动,以属性名加数据作为接下来的处理。如:头痛0,头痛1,肌肉痛0,肌肉痛1等。
在频繁项集的构建上,与单维关联规则类似,除了要注意名称的变化以外,其余基本一致,在此就不赘述了。
对于强规则的联系,首先与单维关联规则一样,将每个频繁项集中的数据拆分、搭配,然后将源数据与目标数据进行联系,若存在该规则,则计算其置信度,若小于置信度的设定,则删除。以此类推。
关联规则结果
单维关联规则界面
单维关联规则结果
多维关联规则界面
多维关联规则结果
决策树
- 决策树:
决策树的难度不是特别的小,除了计算信息增益以外,还涉及到图像技术,对于图像的自适应,对我来说难度还是比较大的。
整个流程比较简单,就是先计算熵,再计算信息增益,然后进行一个递归。
这是测试数据:
默认最后一列为目标属性。
流程大概如上图,就是计算每个属性的每个类别的出现数目,以及它在目标属性中分别出现的次数。即上图的all1和all2.然后计算各个熵,与目标属性的熵相减,最大的进行下一次划分,也就是递归。
如计算出gain(日志)=0.276、gain(是否)=0.033、gain(好友)=0.553,即好友密度的信息增益最大,继续划分好友密度(设为 F),如下图所示:
在这一次的实验中,我选择了ArrayList,它与Vector一样,都属于可变数组,经网上搜查好像ArrayList比Vector好很多(知识浅薄 具体好哪里也不知道……)
所需创建的ArrayList在上图也介绍过了。由于Arraylist的类型需要一样(其实可以不一样,即将类型设为Object,但是那样就没太大的意义了),因此在总的数据(Allarray)中,我分为了两部分,一部分为String类型,一部分为Integer类型。
在构建代码的过程中,花费了很多时间进行代码的布局,当确定需要哪些数组之后,也没有太大的难度了。剩下的就是套公式计算。
然后就是图形的构建。
首先我要了解怎么画,然后是画什么,然后是怎么与递归联系在一起。
在java 中,提供了画图的函数,graphics.drawLine(),graphics.drawString(), graphics.drawRoundRect()等,也不难懂。
打开某新建图片→设置背景颜色为白色→确定所要画的形状的位置(x,y)→画图
问题就在于这个位置的确定。我最终是选择将图片画死了。我的设计是每画一个属性(圆角矩形),就跟着X根线(X取决于接下来的数目),如:
然后下一个属性的(x,y)就在箭头的左侧-w/2……以此类推
确定如何画以后就是画什么,由于整个程序是递归的,也就是说,在我的程序中,它只能进行深度优先遍历,也就是说从左到右从上到下这个方式去画。存在几个问题,首先是我怎么判断是否已经结束,然后是该如何在图像上显示出来。
对于第一个问题,如果已经结束,准备开始新的递归时,可以判断它此时的数组,必定无法继续分下去,如果无法继续分下去,则输出此时的结果。如:
让属性在图像上显示理论也不难,如果要画只要知道它的上一个属性在哪,然后顺着它的线下来画上。
最后就是如何与递归联系起来。这个比较费脑,因为电脑递归的速度很快,有时候根本不懂它在递归什么,最后的结果怎么来。因此需要在草稿上先进行一番操作。
首先我将递归的过程全部写下来,如下图:
数字是执行顺序。因此可以通过其顺序画出大概的图像。
关于位置信息,可以通过其属于谁,然后画在其下,如F:s→(L:s,L:m),可知L:s与L:m处于同级状态,F:s属于其父节点。
显示结果
决策树窗体设计
决策树结果