您的位置:首页 > 编程语言 > Java开发

简单的数据挖掘及excel表格处理(Java)

2018-03-04 23:00 162 查看

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属于其父节点。

显示结果

决策树窗体设计



决策树结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: