毕 业 设 计(论 文)
数据挖掘实验工具程序设计
学生姓名: ***********
指导教师: 程学先
日 期: 二○一六 年 五 月
摘 要
现在已经进入大数据时代,其中为社会关注并且具有极大效益的技术之一是数据挖掘技术,该技术目前尚未成熟,仍处于研究探讨阶段。这篇论文介绍一套数据挖掘实验工具的设计与实现,包括聚类分析工具、ID3决策树设计工具、Apriori算法关联分析工具与一元线性回归分析工具的设计与研制情况。聚类分析是将一个数据集合分成一组聚类,通过赋给不同分类不同的中心点,通过计算欧氏距离判断应该将这些数据放在哪个类别中,使得这些不同类中的数据尽可能地不相似和相隔距离较远,而又要保证同一个类中的数据尽可能地相似和相隔距离较近。ID3决策树通过计算信息熵与信息增益实现分类,使得能根据进行某种决策的大量日常数据分析在新情况下得到最科学、最能符合所需要的利益的决策方案。Apriori算法关联分析通过数据库中记录的大量经营过程数据,寻求数据之间的关联规律,使能最有效地组织数据,提供改进经营过程的方案。一元线性回归分析根据已经发生的二个数据之间相互关联和变化的数据,试图找出二个数据之间存在的线性关系,借以预测当一个数据发生变化为某值时,另一个数据的可能值。
这些内容是“数据挖掘”课程中基本又重要的内容,以往多利用SQL Server数据库中数据仓库中提供的程序组织实验教学,但是,其操作复杂,稳定性差,特别是看不到其中数据变换过程与计算方法。有许多学者、专家研究这些课题,但是未见可供公众使用的综合多个数据挖掘技术的实验系统。我们设计并建成了这一套数据挖掘实验工具,使用简单、方便,并且可以直观看到数据处理的中间步骤、计算方法与数据变化情况,对教学更有意义。同时,由于其易学易用,也可用到实际应用系统科学决策中。
关键词: 数据挖掘 聚类分析 ID3决策树 Apriori算法 一元线性回归
第1章 绪论
1.1本论文研究背景
现在已经步入大数据时代,其中为社会广泛关注并且具有极大效益的技术之一就是数据挖掘技术,该项技术目前尚未成熟,仍处于研究和探讨阶段,但是其意义及蕴藏的巨大经济效益却是令人瞩目的。
知识发现(KDD)与DM已经是数据库领域中最重要的课题之一。KDD是在1989年8月于美国底特律市召开的第十一届国际人工智能会议上正式提出的。而在1995年加拿大蒙特利尔召开的第一届KDD & Data Mining国际学术会议上,又把数据挖掘技术分成了科研领域的知识发现与工程领域的数据挖掘。在这之后每年召开一次这样的会议,经过十多年的努力,已经在数据挖掘技术的研究领域取得了喜人的成果。目前,KDD的研究工作主要围绕理论、技术和应用这三方面展开。多种理论与方法的合理整合开发利用是大多数研究者目前采用的有效技术。目前,国外数据挖掘领域的最新发展方向主要就是对发现知识的方法的进一步研究,比如最近几年来就注重对Bayes(贝叶斯)方法和Boosting方法的进一步研究和改进提高;KDD与数据库的紧密结合;传统的统计学回归方法在KDD中的应用。在应用方面则主要体现在KDD商业软件工具从解决问题的单一过程转向到建立解决问题的整体系统,主要的用户有保险公司、大型银行和销售业等行业。许多计算机企业和研究机构都非常重视数据挖掘方面的开发应用,IBM和微软等公司都相继成立了研究中心。美国是全球数据挖掘研究最繁荣的地区,同时也占据着研究的核心地位。
与国外的发展相比,目前国内对数据挖掘方面的研究起步较晚而且不成熟,目前还处于发展阶段。最新发展方向:分类技术研究,建立集合理论体系,大量数据处理;将粗糙集和模糊集理论二者融合用于知识发现;构造模糊系统辨识方法与模糊系统知识模型;构造智能专家系统;研究中文文本挖掘的理论模型与实现技术;利用概念进行文本挖掘。
随着大数据时代的到来,各类学校对数据挖掘课程也越来越重视,但是,其教学实验环境,包括课堂演示实验环境与学生模拟实验环境、创新实验环境都不理想。由于数据挖掘得迅速发展,市场上已经有不少的数据挖掘工具可以使用,例如:
1. QUEST 工具是IBM 公司研发的一个多任务数据挖掘系统。系统提供了用于在大型数据库中进行开发的多种功能。各种开发算法的计算复杂度是近似于线性(O(n))的,可适用于各种大小的数据库。为各种发现功能设计了相应的并行算法。
2. MineSet 是由SGI公司和Standford 大学联手开发的多任务数据挖掘系统。集成了多种数据挖掘算法以及可视化工具,帮助能够用户直观而且实时地发掘和理解大量数据背后隐藏的知识。它使用了6 种可视化工具来表现数据和知识,提供多种数据挖掘模式。包括分类器、回归模式、关联规则、聚类归、判断列重要度,支持多种关系数据库。
3、IBM公司以它在美国及世界各地的研究实验室发展数年的资料探勘解决方案,发展出了一系列包括在人工智能、机制学习、语言分析及知识发掘上的应用和基本研究的精密软件。
4、Oracle Darwin常被认为是最早资料探勘工具之一
5、Clementine是SPSS所发行的一种资料探勘工具,此工具结合了多种图形使用者接口的分析技术。
6、Thought and Scenario(Cognos)是两个资料探勘工具的组合,都需要电子表格、数据库和ASCII文字文件作为资料来源。
如此多的工具虽然说明了这一课题被重视程度与应用价值,但是它们都是商品化的软件,一般学校难以使用。
许多学校采用SQL Server数据库的数据仓库中数据挖掘工具组织实验教学,但是操作比较复杂,不适应课堂教学。另外,其中数据挖掘的算法、挖掘过程中的中间数据很难得到,对于教学的感性教育不够理想。
学校开设的语言课一般是C语言、JAVA语言、.NET……,但采用C语言或JAVA语言开发的数据挖掘方面的简单、非商品的系列的实验工具未见报道。
1.2 本论文研究目的和意义
根据以上分析,数据挖掘课程的教学需要一个简单的、低成本的、能更好表现算法与数据挖掘中间过程的实验工具,使更好配合课堂与课下实验教学,帮助学习者更好理解数据挖掘的概念、基本知识与基本方法。前面各大公司开发的软件也给我们启示,首先要研究一些最基本、最体现数据挖掘基本概念的实验工具。
1.聚类分析是一种分类的分析方法。按照个体的显著特征将它们分成不同的类别,使同一类别中的个体具有较高的相似性,而不同的类别之间则应具有较高的不相似性。
2.关联分析主要是挖掘隐藏在数据之间的相互关系。它在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构,通过分析数据或记录间的关系,决定哪些事情将一起发生。它能将复杂的信息与数据简单化,挖掘出其中的关联关系,而Apriori算法是关联规则挖掘的经典算法,也是目前数据挖掘领域里应用比较广泛的算法。由于数据挖掘这个命题就和这一内容相关,因而具有重要性
3. 决策树技术是数据挖掘技术中经常被使用的一种技术,它可以用来对数据进行分析,也可以用来作预测,它以树的形式表现在一个决策中多个条件因子的相互关系与重要程度,从而使决策更具有准确性与科学性。
4. 回归分析研究两个或多个变量的相互依存关系,在银行、保险、电信、电子、化工、医药、钢铁等几乎所有行业都有应用需求,它可以帮助我们判断一个因素对另一个因素的影响有多大,可以得到拟合率极好的回归方程,使得预测和控制更加准确可靠。
本课题准备在这4个方面进行研究,设法获得一个实验工具能用在以上问题教学中,要求既可对数据库中数据又可对纯文本数据进行数据挖掘操作,要求能表现数据挖掘中间过程与步骤,要求操作简单,对环境要求低能适应课堂演示教学的需要。
这一课题要求能对纯文本数据进行数据挖掘操作,使得可以在各种课堂环境中进行演示操作,于改进教学手段与教学方法,提高教学效果,提高学生动手能力等方面的意义是显而易见的。要求能对一般数据库进行数据挖掘操作,降低操作难度,无需数据仓库支持,在实际管理系统中都能应用,其实用价值也很大。
本课题要求基于Windows操作系统环境开发,主要应用于SQL Server数据库与纯文本文件数据的数据挖掘。程序设计语言采用java(jdk1.6及以上版本)。要求提交的是可执行jar文件。
第2章K-means聚类分析实验程序设计
2.1 K-means聚类分析简介
K-means聚类分析方法目的是将一个数据集合分成一组聚类,通过赋给不同分类不同的中心点,通过计算欧氏距离判断应该将这些数据放在哪个类别中,使得这些不同类中的数据尽可能地不相似和相隔距离较远,而又要保证同一个类中的数据尽可能地相似和相隔距离较近。
算法采用误差平方和准则函数作为聚类准则函数。
该种算法是一种基于样本间的相似性度量的聚类方法,是属于非监督学习方法一类。它以m为参数,把a个对象分为m个簇,以同一个类中具有较高的相似性,而不同类间的相似性较低。相似性的计算根据一个类中对象的平均值来进行。此算法通过多次迭代运算来完成分析,首先随机选择m个对象,每个对象代表一个聚类的质心。然后对于其余对象,根据该对象与各类的质心之间的距离,把它分配到与之最相似的聚类中。然后,计算每个新聚类的新质心。重复上述过程,直到准则函数收敛。
2.2 K-means算法求解步骤
1 选取k个中心点,本次实验是将前面的第i个数据赋值为第i个分类的中心点。
2 遍历所有数据,算出每个数据到各个分类中心点的欧氏距离,然后再根据这个距离将每个数据划分到最近的中心点所在的分类中。
3 计算每个聚类的平均值,并作为新的中心点。
4 重复2-3,直到这k个中心点不再变化(收敛了),或迭代次数达到了预期迭代次数。
2.3概要设计
1.程序流程图如图2.1所示。首先是从文本文件或数据库中导入数据,然后根据预期分类数,选定头几个数据为各分类的中心点,然后进入循环,根据设定预期迭代次数,当迭代次数小于预期时,根据各个数据到各个分类中心点的距离,将各个数据分到相应的类中,再进行循环条件的判断,当迭代次数达到时,便完成迭代,退出程序,输出结果。
2.数据结构
纯文本文件数据要求:要求由数字数据构成,数据成一列,每行一个数据,可以为整型数,也可以为双精度数据。如图2.2所示。
如果以数据库为数据源,首先要求建立ODBC数据源,指向一个数据库,被研究对象可以是任意数据表,要求针对其中数字数据类型字段数据操作,例如欲分析成绩数据中成绩分布情况,希望知道是否存在某些个区间数据特别集中的区域,这样的区间是二个、三个、……,各区间数据分布的具体情况等,则可以以成绩表为分析对象,分析时需要指定字段名为分数,另外可以以全部数据,也可以选择个人、班级、课程或其他条件先对数据进行预筛选之后再进行分析。需要先确定分2类、分3类、……,再确定各类中数据情况。
实验用数据内容部分如图2.3所示。
2.4 数据库为挖掘对象的程序设计
1.界面设计。
设计界面包括二部分,关于分析结果输出界面在本文实验应用效果一节中介绍。数据源数据选择界面如图2.4所示。
其中数据表名可以选择一个表,也可以选择多个表,如果选择多个表,要求能实现自然连接。程序在识别操作者选择了多个表时自动进行连接,变成一个表。
当操作者选择了表名后。在选择字段名下拉组合框中与字段列表列表框中显示所有可供选择的字段名称。操作者通过字段名下拉组合框、选择关系符下拉组合框、输入数据值可以一个个选择或输入条件表达式的主要元素,点击添加条件按钮可以将所选或所输入数据组合成符合SQL语言规则的条件语句放到条件文本域框中,可以类似形成多个条件,之间用括号、and、or等连接形成一个条件表达式,用于筛选数据,找出欲分析的数据对象。
操作者通过字段列表选择某一个具体欲进行分析的字段,例如分数,做好数据分析的数据准备。
2.程序设计
1)连接数据库、选择数据表、自动建立连接,
其主要代码:
try { //接jdbc驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbcdbc:slq1");
String s="select "+字段名+" from "+表名+" where "+条件式;
sta3 = dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs=sta3.executeQuery(s);
……
2)读取数据到数组中,主要代码:
rsmd3 = rs.getMetaData();
variabl2045=rsmd3.getColumnCount(); //获取列数
variabl1739 = new String[variabl2045]; //定义列名数组 variabl2685 = new String[variabl2045]; //定义列数据类型数组
variabl1309 = new int[variabl2045]; //定义列数据宽度数组
for(int i=0; i<variabl2045; i++) {
variabl1739 = rsmd3.getColumnName(i + 1);
variabl2685 = rsmd3.getColumnTypeName(i+1);
variabl1309 = rsmd3.getColumnDisplaySize(i + 1);
int rowNumber=0; //记录条数
rs.last();
rowNumber=rs.getRow();
String []记录=new String[rowNumber];
variabl1375=new String[rowNumber][variabl2045];//数据内容
rs.absolute(1);
c=0; //行号
b=0; //列号
while(c<rowNumber) {
rs.absolute(c+1);
while(b<variabl2045){
variabl1375[c]=rs.getString(b+1);
记录[c]=variabl1375[c];
b++;
}
}
……
3)进行数据分析并图形显示,见下面内容。
2.5 纯文本文件数据为挖掘对象的程序设计
1)读取文件内容到数组中
public void focusLost(FocusEvent arg0){
try {
纵向最大值=0;纵向最小值=0;
横向最大值=0;横向最小值=0;
FileReader fs = new FileReader(fb1.getText());
BufferedReader br = new BufferedReader(fs);
String tempStr = null;
记录1 = new String[2000];
列宽[0] = 200;
for (int i = 0; (tempStr = br.readLine()) != null; i++){
记录1=tempStr;
记录数=i+1;
}
fs.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
2)"显示数据表格"按钮将读出的数据按照所预设的分类数用表格形式显示,表格的列数等于分类数加1.
预期分类数=Integer.parseInt(fa0.getText());
记录条数 = 记录数;
表格列数 = 预期分类数+1;
列宽=new int[表格列数];
表格列名 = new String[表格列数];
表格列名[0]="原始数据";
列宽[0]=100;
for (int i=1;i<表格列数;i++){
表格列名="第"+i+"类数据";
列宽=100;
}
String[] 列数据类型 = new String[表格列数];
表格数据=new String[记录条数][表格列数];
for (int i=0;i<记录条数;i++){
表格数据[0]=记录1;
}
3)迭代显示分类结果
预期迭代次数=Integer.parseInt(fa1.getText());
预期分类数=Integer.parseInt(fa0.getText());
中心位置=new double[预期分类数];
int [] 各类元素数=new int[预期分类数+1];
double 较小值=0; //计算到某一个分类中心位置的平均距离最小值
double 和=0;
for (int i=0;i<预期分类数;i++){
中心位置=Integer.parseInt(表格数据[0]);
}
由于刚开始时,除了原始数据那一列之外,别的列都是没有数据的,因此也没有办法计算各列的中心位置是多少,所以可以先将原始数据那一列里面的第i行数据作为后面对应的第i+1列的中心位置使用。
for (int i=0;i<预期迭代次数;i++)
{
for (int i2=0;i2<预期分类数;i2++)
{
for (int j=0;j<记录条数;j++)
{
表格数据[j][i2+1]="";
}
}
各类元素数=new int[预期分类数+1];//每次迭代新各类元素数置0
//以下按距离中心的距离大小将表格数据归到相应类中
较小值=0; //计算到某一个分类中心位置的平均距离
int 临时分类号=0;
int y=0;
double z=0;
for (int j=0;j<记录条数;j++)
{
for (int k=0;k<预期分类数;k++)
{
if (k==0)
{
临时分类号=0;
y=Integer.parseInt(表格数据[j][0]);
较小值=Math.sqrt((y-中心位置[k])*(y-中心位置[k])); //计算相距方均值
}
else
{
y=Integer.parseInt(表格数据[j][0]);
z=Math.sqrt((y-中心位置[k])*(y-中心位置[k])); //计算相距方均值
if (z<较小值)
{
较小值=z;
临时分类号=k;
}
}
}
表格数据[各类元素数[临时分类号]][临时分类号+1] = 表格数据[j][0];
各类元素数[临时分类号]++;
}
上面的程序根据原始数据那一列的各个数据到后面各中心点的位置相隔的距离判断应该将这一个数据放到哪一列,依次设定迭代次数为1、2、……,可以清楚地观看分类全过程直到结束。由于会运行迭代多次(可以设定迭代次数),所以每次运行时确定的分类号都是临时分类号,而且由于在判断每一个数据样本到第一个分类的距离(即到中心位置[0]的距离)时没有可比较的对象,所以在k=0时,只计算了距离,而没有判断到哪一个分类,因为此时还无法判断,只有当k>0时,才可以与前面的距离进行比较,等和所有的中心点比较之后,便可以得出这个数到哪个中心点距离最近,以便确定应该将这个数放在哪一类里面最合适。
最后的两句代码是确定应该将这个数放在哪一类之后,将这个表格中第一列的第j个数据放在那个类中,由于这个元素的加入,那个类中的元素数也应该加1。
for (int i1=0;i1<预期分类数;i1++)
{
和=0;
for (int j1=0;j1<各类元素数[i1];j1++)
和=和+Integer.parseInt(表格数据[j1][i1+1]);
中心位置[i1]=和/各类元素数[i1];
}
在每一次迭代之后,都会生成一次分类,一次分类完成后,都会根据各个分类里面的元素值求得这个类别的总和是多少,然后根据总和和这个类别里面有几个元素确定这个类别的中心位置是多少,同理便可以得出新一轮的中心位置数组,以便下一次迭代时使用。
2.6 测试及应用
1.针对图2.3和2.4对成绩表数据库课程聚类分析结果
1)取得的数据及输出界面如图2.5所示
2)迭代第1次、第2次、第3次结果及图形显示的数据分布情况如图2.6所示:
从实验过程可以看到,当迭代2次及以后,数据分类就趋向于稳定,得到最终分类结果。从图形显示分类情况可以直观地了解聚类分析的意义。
2、对文件数据聚集分析程序的测试
设计了6个文件用例对本程序进行测试:a1.txt——a6.txt,下面给出这些文件的内容和聚类条件,并运行出迭代结果。
1)a1.txt内容如图2.7所示
聚类条件:预期分类数:2
预期迭代次数:5
运行结果如图2.8所示:
2)a2.txt数据如图2.9所示:
聚类条件:
预期分类数:3
预期迭代次数:6
运行结果如图2.10所示:
3)a3.txt数据如图2.11所示;
聚类条件:
预期分类数:4
预期迭代次数:6
运行结果如图2.12所示:
从以上测试结果证明设计正确,对于不同数据分布、对于不同分类要求、对于不同迭代次数,都能符合实际数据聚合分类的结果。
第3章 ID3分类实验程序设计
3.1 ID3分类分析简介
常见的数据分类问题例如:
在银行业中,分类方法可以辅助将正常信用卡用户和欺诈行为信用卡用户分类。
在医疗诊断中将正常细胞和癌变细胞分类,使能及时制定正确可靠的治疗方案。
在网络运行中区分正常邮件与垃圾邮件,制定有效垃圾邮件过滤机制。
分类过程可用图3.1描述。
首先输入数据、对数据进行量化
数据可以是图像(例如文字、指纹、照片)、可以是波形(例如脑电图、心电图、震动波形)、也可以是物理数据或逻辑数据。
物理数据可为数值型数据,也可为描述型数据。逻辑数据指描述型数据,可以为描述,也可表示为逻辑值。
对于图像、波形等复杂数据,需要量化才能为计算机处理。
预处理指去除噪声数据、对空缺值进行处理、数据集成或者变换
某些数据集包含的属性个数很多(即维数很高),存在冗余,需要将维数较高的样本空间转换为维数较低的样本空间,求得最能反映分类本质的那些特征或者属性。
分类器设计包括划分数据集,给数据集加类标号。它利用训练集总结分类规律性,建立判别公式或判别规则。分类器设计完毕先要经历分类器测试,利用测试集评估分类器的分类性能。再将分类得到的类标号和测试集中数据样本的原始类标号对比,以评估分类器的分类性能。
ID3 算法是由 Quinlan 第一次提出。该算法是以信息论为基础,以信息熵和信息增益度作为衡量标准,从而实现了对数据的归纳分类。
其基本方法是选择具有最高信息增益的描述属性作为给定数据集X的分枝属性创建决策树的一个节点。再根据该描述属性的不同取值创建分枝,之后对各分枝中的样本子集递归调用上述方法建立该节点的各个子节点。当某个分枝上的所有样本都属于同一个类别时划分就会停止。或者,当某个分枝上的所有样本都不属于同一个类别,但同时又没有剩余的描述属性来进一步划分数据集时,也会形成叶节点,并且就会用多数样本所属的那个类别来标记这个叶节点。这样便可建立决策树,用于决策辅助。
3.2 ID3算法求解步骤
分类问题中使用的数据集可以表示为X={(xi,yi)|i=1,2,…,total}
xi=(xi1,xi2,…,xid) ,其中xi1,xi2,…,xid分别对应d个描述属性A1,A2,…,Ad的具体取值
yi表示数据样本xi的类标号,假设给定数据集包含m个类别,则yi∈{c1,c2,…,cm},其中c1,c2,…,cm是类别属性C的具体取值
未知类标号的数据样本x用d维特征向量x=(x1,x2,…,xd)来表示
数据集(表)中每一条记录是一个训练样本。
分析步骤为:
1)收集当前的例子来计算信息增益属性;
2)选择信息增益最大的属性k;
3)把在k处取值相同的样本归于同一子集中,k取到几个值就会得到几个子集;
4)在返回值的每一个序列的情况下,递归调用的结果是该算法的一个子集;
5)如果子集包含一个属性,用适当的符号确定该属性的值,以及到叶节点的一个分支,然后返回给调用者。
3.3 概要设计
1.ID3算法求解程序流程如图3.2所示。
2. 文本文件数据结构
纯文本文件数据要求:要求由若干行数据构成,第一行为各列标题,其他行为训练数据。每行由数量相等的若干数据构成,数据间用TAB空格符分隔。最后一列数据为目标数据,称为类数据;其他列数据称为描述属性数据。如图3.3所示是一个关于是否去看病的一个决策问题的训练数据。希望能建立决策树,当知道天气情况与温度情况,同时了解了一个人是否经常锻炼与抵抗力情况后,能给出他是否会去看病的判断。
3、数据库数据结构
如果以数据库为数据源,被研究对象可以是任意数据表,要求能选择满足条件的一个表或连接多个表得到的表中若干字段数据,其中所选择的最后一个字段为类属性字段,其他字段为描述属性字段。
例如建立关于是否看病的数据表,其字段构成与图3.3表中数据结构相同,最后一个字段“是否看病”为类属性字段。要求能选择这样的表中满足某种条件的数据,取全部字段进行分析。
3.4 数据库为挖掘对象的程序设计
1.界面设计。
界面与聚类分析程序界面相同,只是要求,选择字段允许且必须是多个字段。如图3.4所示。
2.程序设计
内容与2.4节2的内容相同。
3.5 纯文本数据文件为挖掘对象的程序设计
程序流程:
程序包括计算条件熵子程序、显示决策树图形程序。主程序首先建立初始数据表,再调用计算熵子程序,求出当前各描述属性之熵值,取其最小者为当前节点。保存该节点名称、层次属性、本层顺序属性、计算熵值有关表达式。
根据当前节点有关数据列中数据种类得到每一类表格数据,在每一类中删除当前节点有关数据列,再分别调用计算熵子程序,分别得到下层各枝节点有关描述属性之熵值,分别得到这些节点属性名。再迭代分别求每一分支节点的下一层节点,直到最后一个描述属性。每得到一个节点,保存该节点名称、层次属性、本层顺序属性、计算熵值有关表达式。
遍历所有节点名称属性、层次属性、本层顺序属性,计算其图形位置,在每节点前叙属性数据基础上增加图形位置属性数据并保存。根据位置属性数据与名字绘制决策树。
如果右键点击某个节点,显示该节点计算熵值有关表达式的内容。
1.读取文本文件中数据放到表格中。
variabl1591 = 记录数;
variabl1737 = 列宽.length;
int[] variabl1309 = new int[variabl1737]; // 定义列数据宽度
scrollPane = new JScrollPane();
scrollPane.setBounds(810,70,400,430);
model = new DefaultTableModel(variabl1375,variabl2593);//设置表格数据
table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(table); //设置滚动条
frame1.getContentPane().add(scrollPane, BorderLayout.CENTER);
inset = frame1.getInsets();
}
});
2.计算条件熵程序段
1)声明变量
String 最小属性="";
String [] s10=null;
set1.removeAll(set1);
String []s1=null; //存放类属性数据,去掉重复值
String []s2=null; //存放某一个描述属性数据,去掉重复值
int [] t1=null; //存放类属性某数据重复个数
int [] t2=null; //存放某一个描述属性某数据重复个数
int [][] t20=null; //存放某一个描述属性某属性值数据重复个数
String 显示内容="";
String 显示内容1="";
int 类属性个数=0,描述属性个数=0;
char x1=10,x2=13; 2)根据表格数据区分类属性与描述属性,设置HashSet类型数据set1与set2分别存放类属性集合与描述属性集合。
for (int i=0;i<variabl1737-1;i++){ //表格列数
set2.removeAll(set2);//描述属性集合
for (int j=0;j<variabl1591;j++){
if (i==0) {
set1.add(variabl1375[j][variabl1737-1].toString());//类属性集合
}
if (j>0){ //描述属性集合
set2.add(variabl1375[j-1].toString());//第i列数据置入
}
}
if (i==0) {
类属性个数=set1.size();
s1=new String[类属性个数];
s1=set1.toArray(new String[0]);
t1=new int[类属性个数];
}
描述属性个数=set2.size();
s2=new String[描述属性个数];
s2=set2.toArray(new String[0]);
t2=new int[描述属性个数];
t20=new int[描述属性个数][类属性个数];
for (int j=0;j<variabl1591;j++){
for (int k=0;k<类属性个数;k++){
if ((i==0)&&(s1[k].equals(variabl1375[j][variabl1737-1]))){
t1[k]++; //存放类属性某数据重复个数
}
}
for (int k=0;k<描述属性个数;k++){
if (s2[k].equals(variabl1375[j])){
t2[k]++; //存放描述属性某数据重复个数
for (int k1=0;k1<类属性个数;k1++){
if (s1[k1].equals(variabl1375[j][variabl1737-1])){
t20[k][k1]++; //存放某一个描述属性某属性值数据重复个数
}
}
}
}
}
3.计算熵并保存将来显示计算熵值有关表达式的内容
显示内容=显示内容+variabl2593+"条件熵=";
int k1=0,k=0;
double [] 对数值=new double[类属性个数];
double [] 计算值0=new double[描述属性个数];
double [] 计算值1=new double[类属性个数];
double 计算值2=0;
double 计算值=0;
double 值=0;
显示内容1="";
for (k=0;k<描述属性个数;k++){
显示内容=显示内容+"-"+t2[k]+"/"+variabl1591+"*( ";
显示内容1=显示内容1+"+"+t2[k]+"/"+variabl1591+"*( ";
计算值0[k]=t2[k]/variabl1591;
计算值=0;
double x=0;
for (k1=0;k1<类属性个数;k1++){
显示内容=显示内容+t20[k][k1]+"/"+t2[k]+"*ln( ";
显示内容1 = 显示内容1+t20[k][k1]+"/"+t2[k]+"*";
x=(t20[k][k1]+0.0000)/t2[k];
if (x<0.001) x=0.001;
对数值[k1]=-(Math.log10(x)/Math.log10(2)) ;
显示内容 = 显示内容+t20[k][k1]+"/"+t2[k]+" )";
显示内容1=显示内容1+(对数值[k1]+" ").substring(0,8);
if (k1<类属性个数-1) 显示内容1=显示内容1+"+";
计算值1[k1]=对数值[k1]*x;
计算值=计算值+计算值1[k1];
if (k1<类属性个数-1) 显示内容=显示内容+"+";
}
显示内容=显示内容+" )";
显示内容1=显示内容1+" )";
计算值2=计算值2+计算值*t2[k]/variabl1591;
值=值+计算值*t2[k]/variabl1591;
}
显示内容=显示内容+" )"+x1+x2+" =";
显示内容1=显示内容1+" )"+x1+x2+" =";
显示内容=显示内容+显示内容1+值+x1+x2;
if (值<variabl1579){
variabl1579=值;
最小属性=variabl2593;
}
值=0;
}
显示内容 = 显示内容+x1+x2+"比较上述数据,可见"+最小属性+"的条件熵最小,其值为:"+ variabl1579+"。选为下一级的根。";
}
});
3.6 测试完成情况及应用
运行本程序根据图3.3得到的决策树如图3.5所示。
右键点击根节点可看到表中数据与计算各描述属性条件熵的情况如图3.6所示。
右键点击其他节点所得到的根下各节点所计算的表与条件熵计算情况:
天气晴数据子集
天气阴数据子集
可见已经到叶节点,无论温度如何或其他条件如何均会去看病
天气雨数据子集
天气晴温高数据子集
天气晴温中数据子集
天气晴温低数据子集
天气雨温高无数据
天气雨温低数据子集
从测试结果可以看到,本程序无论基于数据或基于文件,都能快速、正确得到决策树,并且可以看到计算条件熵、求取决策树的全过程,可以直观看到计算条件熵的计算式与运行结果。。
第4章Apriori算法进行关联分析实验程序设计
4.1 Apriori算法进行关联分析简介
数据关联是数据库中存在的一类重要的可被发现的知识。若两个或两个以上变量的取值之间存在规律性,就称为据有关联关系。关联分析的目的是挖掘出隐藏在数据间的相互关系,它能发现数据库中形如“90%的顾客在一次购买活动中购买商品A的同时购买商品B”之类的知识。关联规则是在交易数据、关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式、关联、相关性或因果结构,通过分析数据或记录间的关系,决定哪些事情将一起发生,关联规则在整个社会乃至整个世界应用之广泛,它的重要性是无可比拟的,它能将复杂的信息与数据简单化,挖掘出其中的关联关系,而Apriori算法是关联规则挖掘的经典算法,也是目前数据挖掘领域里应用比较广泛的算法。
Apriori是关联规则挖掘算法中最为经典的一个算法,有很多的关联规则挖掘算法都是以它为基础来设计的。它利用了频繁项集性质的先验知识,利用一种称为逐层迭代搜索的方法来找出所有的频繁项集,即用k-项集用于搜索(k+1)-项集。为了提高迭代搜索的效率,Apriori算法使用了下述性质来压缩搜索空间。
性质1:若X为频繁项目集,则X的所有子集都是频繁项目集。
性质2:若X为非频繁项目集时,则X的所有超集都是非频繁项目集。
其典型的一个应用问题是:如果知道销售表,可以得到一段时间内各个顾客所采购的商品情况,例如图4.1所示。
希望能分析出这样的问题:顾客购买那些商品存在关联性,或通俗的说,如果顾客购买了某种商品,则他们同时购买另一种商品的概率是否超过某个值(例如50%)?
这就是关联分析需要解答的问题之一。需要设计能解答这类问题的实验程序。
4.2 Apriori关联分析算法
假定某超市销售的商品包括:面包、啤酒、蛋糕、奶油、牛奶和茶。
设I={i1,i2,…,ik}是k个不同项目的集合,每个in(k=1,2,……,n)称为一个项目。
项目的集合I称为项目集合,简称为项集。其元素个数就是项集的长度,长度为n的项集便称为n-项集。
上例中,每个商品是一个项目,项集是I={ 面包,啤酒,蛋糕,奶油,牛奶,茶 }为6-项集。
项集情况如图4.2所示。
每笔交易T都会是项集I上的一个子集,即TíI。
对应的每一个交易都会有一个唯一的标识:交易号,记作TID
交易的全体便构成了交易数据库D,也可以称为交易记录集D,简称为交易集D。
交易集D中包含交易的个数记为|D|。
例如:T1 面包 、奶油 、牛奶、茶 ; TID=T1;
T1={面包 、奶油 、牛奶、茶 }; D为表全部数据; |D|=10
对于项集X,XìI,将count(XíT)设定为交易集D中包含X的交易的数量
项集X的支持度support(X)便是项集X出现的概率,
以此来描述了X的重要性。
例如2-项集{面包 ,牛奶}出现在T1、T2、T5、T9、T10中5次,即
count(X)= count(T1,T2,T5,T9,T10)=5
我们希望知道的购买一种商品同时购买另一种商品的概率为最小支持度。如果一种所需要的项集,支持度大于或等于最小支持度称为频繁项集,简称频繁集,反之则称为非频繁集。通常k-项集如果满足最小支持度,称为k-频繁集,记作Lk。
Apriori算法首先产生1-频繁集L1,再经连接、修剪产生2-频繁集L2,……,直到无法产生新的频繁集时终止。
例如, 面包、啤酒、蛋糕、奶油、牛奶和茶 的1-候选频繁集为: {面包}、 { 啤酒 } 、 { 蛋糕 } 、 { 奶油 } 、 { 牛奶 }和{ 茶 } ,各自在交易中出现的次数分别为7、1、2、3、8、7,交易数为10,即它们支持度(Support)各为8/10、1/10、2/10、3/10、8/10、7/10。如果规定最小支持度为0.5,则1-频繁集L1为{ 面包 } 、 { 牛奶 } 、 { 茶 } 。
再对面包、啤酒、蛋糕、奶油、牛奶和茶求2-候选频繁集为: {面包, 啤酒}、 {面包, 蛋糕}、 {面包, 奶油}、 {面包, 牛奶}、 {面包, 茶}、 {蛋糕, 奶油}、 {蛋糕, 牛奶}、 {蛋糕, 茶}、 {奶油, 牛奶}、 {奶油, 茶} 、 {牛奶, 茶}
各自在交易中出现的次数分别为1、1、3 、5、5 、0、1 、0、3 、2、5 ,交易数为10,如果规定最小支持度还是为0.5,则2-频繁集L2为{面包, 牛奶}、 {面包, 茶 } 、 { 牛奶 , 茶 } 。
如果查3-频繁集L3,在2-候选频繁集基础上组合,只连接有共同项的那些2-候选频繁集,例如{面包, 啤酒}、 {面包, 蛋糕}可连接,有共同的面包,连接得到{面包, 啤酒, 蛋糕}。而{面包, 茶}、 {蛋糕, 奶油}不可连接,它们没有共同项。
由此可得3-候选频繁集:{面包, 啤酒, 蛋糕}、{面包, 啤酒, 奶油}、{面包, 啤酒, 牛奶}、{面包, 啤酒, 茶}、{面包, 蛋糕, 奶油}、{面包, 蛋糕, 牛奶}、{面包, 蛋糕, 茶}、{面包, 奶油, 牛奶}、{面包, 奶油, 茶}、{蛋糕, 奶油, 牛奶}、{蛋糕, 奶油, 茶}、{蛋糕, 牛奶, 茶}、{奶油, 牛奶, 茶}。
根据频繁集的子集一定是频繁的进行修剪,对每一个3-候选频繁集分析,看其所有子集 都在L2中,如果在则加入到3-频繁集中。
另一种办法是只对2-频繁集进行组合,得到3-候选频繁集{面包, 牛奶, 茶 } 。再找出3-频繁集,如果规定最小支持度还是为0.5 ,则不存在3-频繁集。
4.3概要设计
1.程序流程图如图4.3所示。
首先读取数据库或文件中数据内容,如果是类似于图4.1的数据,先要选取满足条件的记录,从中找出某个字段,例如商品品名列,再根据同一人同一次(同一时间)购买的商品列为一个项集。以表格形式显示该项集表,根据预定的最小支持度和欲分析的项集数,求取最小频繁集并显示出来。
2. 数据结构
纯文本文件数据要求:要求数据成一列,每行多个数据,均为字符串,用逗号分隔。如图4.4所示。
如果以数据库为数据源,首先要求建立ODBC数据源,指向一个数据库,被研究对象可以是任意数据表,要求针对其中某字段数据操作,例如销售表中选择商品品名字段。要求先根据某条件决定分组,例如图4.1销售表分析中需要先根据顾客姓名和日期分组,将每组购买的所有商品品名用逗号分隔,连接成一个字符串,得到如图4.2数据表形式显示在表格中。
因此,数据表结构要求能实现如上变换,需要有某个目标字段,有构成分组条件的字段。这些字段中数据不允许空值。
4.4 数据库数据关联分析的程序设计
1.界面设计。
数据源数据选择界面如图4.5所示。
其中数据表名可以选择一个表,也可以选择多个表,如果选择多个表,要求能实现自然连接。程序在识别操作者选择了多个表时自动进行连接,变成一个表。当操作者选择了表名后。在选择字段名下拉组合框中与字段列表列表框中显示所有可供选择的字段名称。操作者通过字段名下拉组合框、选择关系符下拉组合框、输入数据值可以一个个选择或输入条件表达式的主要元素,点击添加条件按钮可以将所选或所输入数据组合成符合SQL语言规则的条件语句放到条件文本域框中,可以类似形成多个条件,之间用括号、and、or等连接形成一个条件表达式,用于筛选数据,找出欲分析的数据对象。
操作者通过字段列表选择某一个具体欲进行分析的字段,例如商品名;再确定分组字段,分组字段可以为多个字段,彼此间用逗分隔。做好数据分析的数据准备。
2.数据库数据关联分析程序设计
1)查找记录主要代码:
String s = variabl17072.getText();
int 数据条数=0;
String []s5=new String[10000];
if (variabl17073.getText().length()>0) {
String [] s0=variabl17073.getText().split(",");
分组字段数=s0.length;
for (int j=0;j<s0.length;j++)
if ((","+s+",").indexOf(","+s0[j]+",")<0)
s=s0[j]+","+s;
}
s="select "+s+" from "+variabl17071.getText();
if (variabl2223.getText().trim().length()>0) //加条件表达式
s=s+" where "+variabl2223.getText().trim();
if (variabl17073.getText().length()>0) //加分组要求(排序)
s=s+" order by "+variabl17073.getText();
try {
dbConn=main4.getConn(); // 连接数据库
sta3 = dbConn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs=sta3.executeQuery(s);
2)得到供分析数据显示在表格中,
int rowNumber=0; //记录条数
rs.last();
rowNumber=rs.getRow();
variabl1375=new String[rowNumber][variabl2045+1]; //数据内容
rs.absolute(1);
c=0; //行号
b=0; //列号
String s2="",s3="",s4="";
s5[0]="";
while(c<rowNumber) {
rs.absolute(c+1);
while(b<variabl2045){
variabl1375[c]=rs.getString(b+1);
b++;
}
s2="";
for (int j=0;j<分组字段数;j++){
s2=s2+variabl1375[c][j];
}
variabl1375[c][variabl2045]=s2;
c++;
b=0;
}
3 纯文本文件数据关联分析程序设计
1)求取项集
预期分类数=Integer.parseInt(fa0.getText());
记录条数 = 记录数;
表格列数 = 预期分类数+1;
需要预先确定最小支持度数,例如0.2。
主要代码:
String [] s10=new String[1];
String 显示数据="";
int k=0;
for (int i=0;i<variabl1591;i++){
s10=variabl1375[1].toString().split(",");//求元素
for (int j=0;j<s10.length;j++){
set1.add(s10[j]); //通过set去除重复元素
}
}
元素个数 = set1.size();
元素个数2 = set1.size();
元素 = set1.toArray(new String[0]);
元素1 = set1.toArray(new String[0]);
元素2 = set1.toArray(new String[0]);
int 元素次数[]=new int[元素.length];
for (int i=0;i<元素.length;i++)
for (int j=0;j<variabl1591;j++){
if ((","+variabl1375[j][1]+",").indexOf(","+元素+",")>=0){
元素次数++;
}
}
for (int i=0;i<元素.length;i++) //按元素出现次数从大到小排序
for (int j=0;j<元素.length-i-1;j++){
if (元素次数[j]<元素次数[j+1]){
s=元素[j];
k=元素次数[j];
元素[j]=元素[j+1];
元素次数[j]=元素次数[j+1];
元素[j+1]=s;
元素次数[j+1]=k;
}
}
2)计算求取频繁集
主要代码:
最小支持度=Float.parseFloat(fa0.getText())*元素数;
频繁集="1项集:";
int 元素个数0=0;
for (int i=0;i<元素.length;i++) { //保存一项集
元素2=元素;
if (((元素次数+0.0)/variabl1591)>=最小支持度){
频繁集 = 频繁集+"{"+元素+":"+元素次数+"}";
元素个数0++;
}
}
频繁集=频繁集+x1; //+x2;
//以下对所有记录中元素按 元素 顺序排列
int []variabl1117=new int[1];
for (int i=0;i<variabl1591;i++){ //将元素名变为序号
s10=variabl1375[1].toString().split(",");//求元素
variabl1375[2]="";
variabl1117=new int[s10.length];
for (int j=0;j<s10.length;j++){
s=s10[j];
for (int i1=0;i1<元素.length;i1++){
if (s.equals(元素[i1])){
variabl1117[j]=i1;
}
}
}
Arrays.sort(variabl1117);//从低到高排序
for (int j=0;j<s10.length;j++){
if (j<s10.length-1)
variabl1375[2] = variabl1375[2]+元素[variabl1117[j]]+",";
else
variabl1375[2] = variabl1375[2]+元素[variabl1117[j]];
}
}
for (int i=0;i<variabl1591;i++){
variabl1375[1]=variabl1375[2];
}
model = new DefaultTableModel(variabl1375,variabl2593);
table = new JTable(model); //重新显示表格数据
for(int i=0;i<variabl1737;i++) {
TableColumn tc = table.getColumn(variabl2593);
if (i==0) tc.setPreferredWidth(50); //设置表格中各列的宽度
else tc.setPreferredWidth(760);
}
scrollPane.setViewportView(table);
//以下计算并显示项集与频繁集
String [] 元素0=new String[元素个数0];
for (int i=0;i<元素个数0;i++)
元素0=元素;
p1(2,元素个数0,元素0); //以下从2项集开始计算
System.out.println(" 频繁集="+频繁集);
jta1.setText(" 频繁集="+频繁集);
}
4.5 测试及应用
1.针对图4.3分析结果
1)取得的数据及输出界面如图4.6所示。 2)计算得到的频繁集
当最小支持度为0.2时
显示频繁集
频繁集 = 1项集:{牛奶:9}{蛋糕:8}{面包:7}{茶:6}{奶油:4}
2项集:{牛奶,面包:5}{牛奶,蛋糕:5}{蛋糕,茶:3}{蛋糕,面包:4}
3项集:{牛奶,蛋糕,面包:3}
当最小支持度为0.5时
显示频繁集
频繁集 = 1项集:{牛奶:9}{蛋糕:8}{面包:7}
2项集:
可见没有支持度在0.5及以上的二个以上商品相关的频繁集。
第5章一元线性回归分析实验程序设计
5.1 线性回归分析简介
回归分析是对两个或多个变量间的定量关系、相互依存关系的分析。回归分析可以帮助人们判断哪些因素的影响是最显著的,而哪些因素的影响是不显著的,同时还可以利用求得的回归方程来进行预测和控制。其中最简单的是一元线性回归分析,指成对的两个变量数据的散点图呈现出直线趋势时,采用最小二乘法,找到两者之间的经验公式,即一元线性回归预测模型,根据自变量的变化,来估计因变量变化的预测方法。
5.2 一元线性回归分析算法
1、选取一元线性回归模型的变量 ;
2、绘制计算表和拟合散点图;
3、计算变量间的回归系数及其相关的显著性 ;
4、得到一元直线拟合曲线。
5、根据拟合曲线,计算当自变量为某值时,预测因变量的值。
所得到的拟合曲线是否合理,需要做模型检验。包括:
1、经济意义的检验:根据模型中各个参数所包含的经济含义,分析各参数的值是否与分析对象所包含的经济含义相符合。
2、回归标准差检验
3、拟合优度检验
4、回归系数的显著性检验
应用线性回归方程进行模型预测的方法可以分为:点预测和置信区间预测法
1、点预测法:将自变量取值带入回归预测模型求出因变量的预测值。
2、置信区间预测法:先估计出一个范围,然后确定该范围会出现的概率。置信区间的大小的影响的因素:a、因变量估计值;b、回归标准差;C、概率度t。
求一元线性回归直线计算步骤:
1. ,列计算表求∑x,∑xx,∑y,∑yy,∑xy。
2.计算Lxx,Lyy,Lxy
Lxx=∑(x-xˇ)(x-xˇ)
Lyy=∑(y-yˇ)(y-yˇ)
Lxy=∑(x-xˇ)(y-yˇ)
3.求相关系数,并检验;
r = Lxy /( Lxx Lyy)1/2
2. 求回归系数b和常数a;
b=Lxy /Lxx
a=y - bx
4.得到回归方程。
Y=bx+a 5.3 数据结构设计
纯文本文件数据要求:要求由数字数据构成,数据成二列,每行二个数据,用TAB空格分隔,二个数据可以为整型数,也可以为双精度数据。如图5.1所示。
如果以数据库为数据源,被研究对象可以是任意数据表,要求针对其中二个数字数据类型字段的数据展开分析,例如欲分析合金质量表中含碳量对于抗拉强度的影响情况。合金质量表数据情况如图5.2所示。
5.4 程序设计
1.回归方程参数计算与求取回归方程。
int x=0,y=0;
int w0=5,h0=5;
float x和1=0f,y和1=0f,xy和1=0f,x平方和1=0f;
float x平均1=0f,y平均1=0f,Lxx1=0f,Lxy1=0f;
for (int i=0;i<记录条数;i++){
x和1 = x和1+横向数据/横向系数;
y和1=y和1+纵向数据/纵向系数;
xy和1 = xy和1+横向数据*纵向数据/纵向系数/横向系数;
x平方和1=x平方和1+横向数据*横向数据/横向系数/横向系数; float yyy=(纵向数据-纵向最小值)*纵向单位数据长度;
yyy=可用高度+Y线到顶距-yyy;
float xxx=(横向数据-横向最小值)*横向单位数据长度+Y线左边距;
//打点
g.fillOval((int)xxx,(int)yyy,w0,h0);
}
x平均1=x和1/记录条数;
y平均1=y和1/记录条数;
Lxx1=x平方和1-x和1*x和1/记录条数;
Lxy1=xy和1-x和1*y和1/记录条数;
String 回归方程1="回归方程1="+"Y="+(y平均1-Lxy1*x平均1/Lxx1)+"+"+(Lxy1/Lxx1)+"x"; 2.显示一元线性回归图形
g.setColor(Color.BLACK);
int variabl1609 = variabl1585 - 100;
float variabl1351 = (float)((variabl2653-variabl2655))/(variabl1581);
float variabl1353=(float)(variabl1609)/(variabl2653-variabl2655);
int variabl1615=60;
int variabl1617=60;
float variabl1297= (float)((variabl1291-variabl1293))/(variabl1299);
float variabl1295=(float)((variabl1583-200))/(variabl1291-variabl1293);
Graphics2D g2=(Graphics2D)g;
g2.setStroke(new BasicStroke(2f));
g.drawLine(variabl1615,variabl1617-10,variabl1615,variabl1609+variabl1617+5); //纵坐标线
g.drawLine(variabl1615,variabl1617-15,variabl1615-3,variabl1617);
g.drawLine(variabl1615,variabl1617-15,variabl1615+2,variabl1617);
g.setColor(Color.RED);
g.drawString(dataStatistic12_1.variabl2593[1],variabl1615+10,variabl1617-5);
int x=0,y=0;
int w0=5,h0=5; //打点的大小
float variabl2671=0f,variabl2673=0f,xvariabl2673=0f,variabl2665=0f;
float variabl26351=0f,variabl26331=0f,Lxx1=0f,Lxy1=0f;
for (int i=0; i<variabl1591; i++){
variabl2671=variabl2671+variabl2651;
variabl2673=variabl2673+variabl2649;
xvariabl2673=xvariabl2673+variabl2651*variabl2649;
variabl2665=variabl2665+variabl2651*variabl2651;
float yyy=(variabl2649-variabl2655)*variabl1353;
yyy=variabl1609+variabl1617-yyy;
float xxx=(variabl2651-variabl1293)*variabl1295+variabl1615;
g.fillOval((int)xxx,(int)yyy,w0,h0); //显示各数据点
}
variabl26351=variabl2671/variabl1591;
variabl26331=variabl2673/variabl1591;
Lxx1=variabl2665-variabl2671*variabl2671/variabl1591;
Lxy1=xvariabl2673-variabl2671*variabl2673/variabl1591;
variabl11971="方程:"+"Y="+(variabl26331-Lxy1*variabl26351/Lxx1)+"+"+(Lxy1/Lxx1)+"x";
g.drawString(variabl11971,100,variabl1585);
float x2,y2,z1; //x1,y1,
x2=(variabl1291-variabl1293)*variabl1295+variabl1615;
y2=((variabl26331-Lxy1*variabl26351/Lxx1)+(Lxy1/Lxx1)*variabl1291)-variabl2655;
y2=variabl1609+variabl1617-y2*variabl1353;
g.setColor(Color.RED);
g.drawLine((int)(variabl1615),(int)(variabl1609+variabl1617),(int)(x2),(int)(y2));
//显示回归曲线
5.5 测试及应用
运行回归分析程序后显示原数据点的位置、拟合直线、回归方程表达式,如图5.3所示。
测试结果说明如果二个数据间存在类似于直线的关系,运行本程序可以得到回归曲线与回归方程。当知道一个数据的值时可以预测另一个数据的值。
结 论
数据挖掘是目前一个热门课题,我们设计了这套实验系统,可以进行聚类分析、ID3决策分析、Apriori关联分析与一元线性回归分析,可以用于课堂演示、实验课程教学,也可以用于一般管理信息系统中对数据库中数据的分析,可以提供辅助决策信息,提高管理质量与效益。这个系统的优点在于操作的简便,分析数据可以放到纯文本文件中,也可以放到数据库中,只需要按照所提供的界面输入必要的字段选择、选择条件定义及其他参数,就能应用SQL语句从数据库中获得供分析数据,或直接从文件中获取供分析数据,之后输入必要的要求参数,程序就可以直接运行了。
基于文件分析的程序的缺点在于它的扩展性,我们所设计的连接数据库的程序可以在连接数据库之后,导入数据再进行聚类分析,数据的量可以十分大可观,也可以更加贴近生活实际,具有实用价值。但是基于文件分析的程序适用条件较低,操作十分简单,用于课堂教学的演示更有优越性。
在这次设计中,用到的知识非常多,包括数据挖掘概念与知识、Java的图形界面设计和Java数据库程序设计,做完之后感觉对以前的知识又巩固了一遍,也是对自己能力的一次提高,希望以后能够有更加多的像这样的实践,做出更好的作品。
参考文献
1. 朱福喜.面向对象与JAVA程序设计[M].清华大学出版社.2009.
2. Coy S.Horstmann GaryCornell著.《Java核心技术 卷I》.机械工业出版社, 2010-01-01
3. 李刚.疯狂java讲义.电子工业出版社[M].2008.
4. 谢邦昌 著.《数据挖掘基础与应用 (SQL Server 2008)》机械工业出版社,2012
5. 陈文伟 著.《数据仓库与数据挖掘教程》清华大学出版社,2011
6. Bruce Eckel.Thinking in Java. Upper Saddle River, New Jersey, Prentice Hall, 2006
7.Jiawei Han.数据挖掘概念与技术.机械工业出版社2001,8
8.W.H.Inmon.数据仓库.机械工业出版社2000,5
9.林字等编著.数据仓库原理与实践.北京:人民邮电出版社,2003
10.张春阳,周继恩,刘贵全,蔡庆生.基于数据仓库的决策支持系统的构建,计算机工程.2002(4):249-252
11.陈德军,盛翊智,陈绵云.基于数据仓库的OLAP在DSS中的应用研究.2003(1):30-31
12黄杰晟,曹永锋.挖掘类改进决策树[J].现代计算机(专业版).2010(01)
13. 苏新宁,杨建林,江念南,栗湘.数据仓库和数据挖掘[M].清华大学出版社,2006 年 4 月第 l 版.
14. 陈文伟.数据仓库与数据挖掘教程[M].清华大学出版社,2006 年 8 月第 1 版.
15. 周根贵主编.数据仓库与数据挖掘[M].浙江大学出版社,2004 年 8 月第 1 版.
16. 陈文伟.数据挖掘技术[M].北京:北京工业大学出版,2002:200-205
17. 朱建峰.可视化数据挖掘[M].北京:电子工业出版社,2008:301-303.
18. 周欣,沙朝锋,朱扬勇等.兴趣度一关联规则的又一个阀值.计算机研究与发展,2000(37),No.5,51-63.
19. 高惠璇.实用统计方法与SAS系统[M]. 北京大学出版社 .2001-10
20. David Hand / Heikki Mannila / Padhraic Smyth著.《数据挖掘原理》.机械工业出版社, 2003-05-09
2016学士论文-数据挖掘实验工具程序设计 |