精华内容
下载资源
问答
  • 数据挖掘报告

    万次阅读 热门讨论 2010-04-10 10:03:00
    研究方向前沿读书报告数据挖掘技术的算法与应用 目录第一章 数据仓库... 51.1 概论... 51.2 数据仓库体系结构... 61.3 数据仓库规划、设计与开发... 71.3.1 确定范围... 71.3.2 环境评估... 71.3.3 分析... 71.3.4 ...

     

    研究方向前沿读书报告

    数据挖掘技术的算法与应用

     

    目录

    第一章 数据仓库... 5

    1.1 概论... 5

    1.2 数据仓库体系结构... 6

    1.3 数据仓库规划、设计与开发... 7

    1.3.1 确定范围... 7

    1.3.2 环境评估... 7

    1.3.3 分析... 7

    1.3.4 设计... 8

    1.3.5 开发... 8

    1.3.5 测试... 8

    1.3.6 运行... 8

    1.4 小结... 9

    第二章 数据挖掘... 9

    2.1 概论... 9

    2.2 数据挖掘研究的内容和本质... 10

    2.2.1 广义知识... 10

    2.2.2 关联知识... 10

    2.2.3 分类知识... 11

    2.2.4 预测型知识... 11

    2.3 数据挖掘流程... 11

    2.3.1 确定业务对象... 12

    2.3.2 数据准备... 12

    2.3.3 数据挖掘... 12

    2.3.4 结果分析... 12

    2.3.5 知识的同化... 13

    2.4 数据挖掘的方法... 13

    2.4.1 神经网络方法... 13

    2.4.2 遗传算法... 13

    2.4.3 策树方法... 14

    2.4.4 粗集方法... 14

    2.4.5 覆盖正例排斥反例方法... 14

    2.4.6 统计分析方法... 14

    2.4.7 模糊集方法... 14

    2.6 数据挖掘工具的现状... 15

    2.7 数据挖掘未来研究方向及热点... 16

    2.4.1 网站的数据挖掘... 16

    2.4.2 生物信息或基因数据挖掘... 17

    2.4.3 文本的数据挖掘... 17

    2.4.4 2005年十大热点问题... 17

    2.5 小结... 18

    第三章  关联规则... 18

    3.1 概论... 18

    3.2 基本概念... 18

    3.3 关联规则种类... 19

    3.4 主要研究方向和典型算法分析... 20

    3.4.1 多循环方式的采掘算法... 20

    3.4.2 增量式更新算法... 21

    3.4.3 并行发现算法... 22

    3.5 频集算法的几种优化方法... 24

    3.4.1 基于划分的方法... 24

    3.4.2 基于Hash的方法... 24

    3.4.3 基于采样的方法... 25

    3.4.4 减少交易的个数... 25

    3.4.5 其他的频集挖掘方法... 25

    3.4.6 提高效率的几种方法说明... 26

    3.6 多层和多维关联规则的挖掘... 27

    3.7 关联规则价值衡量的方法... 28

    3.6.1 系统客观层面... 28

    3.6.2 用户主观层面... 29

    3.8 选择规则的方法... 29

    3.9 小结... 30

    第四章  正负关联规则研究... 30

    4.1 概述... 30

    4.2 研究现状... 31

    4.3 关联规则具体研究... 31

    4.3.1 关联规则挖掘的矩阵算法... 31

    4.3.2 基于相关系数的正、负关联规... 32

    4.3.3 项集的相关性判断正负关联规则... 32

    4.3.4 正、负关联规则间的置信度关系研究... 33

    4.3.5 挖掘正负关联规则... 33

    4.3.6 布尔加权关联规则的几种开采算法及比较... 34

    4.3.6 关联规则的增量式更新... 34

    4.3.7 行化的分组关联规则算法... 36

    4.3.8 分布式的数据挖掘... 36

    4.6 研究方向的理论意义和实用价值... 38

    4.7 小结... 38

    第五章  可视化研究... 39

    5.1 概述... 39

    5.2 研究现状... 39

    5.3 研究方向的理论意义和实用价值... 39

    5.4 可视化具体研究... 39

    5.4.1 矩阵表示... 39

    5.4.2 规则多边形... 40

    5.4.3 平行坐标系... 41

    5.5 小结... 41

    参考资料:... 42

     

     

     

     

     

     

     

     

    本报告的组织

    第一章        数据仓库的内容

    第二章        数据挖掘的内容

    第三章        关联规则的内容

    第四章        正负关联规则的研究,各种方法的具体算法 实现。

    第五章        可视化研究

     

     

     

     

     

     

     

     

     

     

     

     

     

    第一章  数据仓库

    1.1 概论

    传统数据库在日常的管理事务处理中获得了巨大的成功,但是对管理人员的决策分析要求却无法满足。因为,管理人员常常希望能够对组织中的大量数据进行分析,了解业务的发展趋势。而传统数据库只保留了当前的业务处理信息,缺乏决策分析所需要的大量历史信息。为满足管理人员的决策分析需要,就需要在数据库的基础上产生适应决策分析的数据环境——数据仓库(DWData Warehouse)。[1]

    目前,数据仓库一词尚没有一个统一的定义,著名的数据仓库专家WHInmon在其著作《Building the Data Warehouse》一书中给予如下描述:数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。对于数据仓库的概念我们可以从两个层次予以理解,首先,数据仓库用于支持决策,面向分析型数据处理,它不同于企业现有的操作型数据库;其次,数据仓库是对多个异构的数据源有效集成,集成后按照主题进行了重组,并包含历史数据,而且存放在数据仓库中的数据一般不再修改。

    根据数据仓库概念的含义,数据仓库拥有以下四个特点:

    1、面向主题。操作型数据库的数据组织面向事务处理任务,各个业务系统之间各自分离,而数据仓库中的数据是按照一定的主题域进行组织。主题是一个抽象的概念,是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个操作型信息系统相关。

    2、集成的。面向事务处理的操作型数据库通常与某些特定的应用相关,数据库之间相互独立,并且往往是异构的。而数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的,必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企业的一致的全局信息。

    3、相对稳定的。操作型数据库中的数据通常实时更新,数据根据需要及时发生变化。数据仓库的数据主要供企业决策分析之用,所涉及的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期的加载、刷新。

    4、反映历史变化。操作型数据库主要关心当前某一个时间段内的数据,而数据仓库中的数据通常包含历史信息,系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到目前的各个阶段的信息,通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。

    通过利用数据仓库系统,人们可以获得许多方面的知识。[7]

    1.2 数据仓库体系结构

    企业数据仓库的建设,是以现有企业业务系统和大量业务数据的积累为基础。数据仓库不是静态的概念,只有把信息及时交给需要这些信息的使用者,供他们做出改善其业务经营的决策,信息才能发挥作用,信息才有意义。而把信息加以整理归纳和重组,并及时提供给相应的管理决策人员,是数据仓库的根本任务。因此,从产业界的角度看,数据仓库建设是一个工程,是一个过程。整个数据仓库系统是一个包含四个层次的体系结构,具体由下图表示:

    ·数据源:是数据仓库系统的基础,是整个系统的数据源泉。通常包括企业内部信息和外部信息。内部信息包括存放于RDBMS中的各种业务处理数据和各类文档数据。外部信息包括各类法律法规、市场信息和竞争对手的信息等等。

    ·数据的存储与管理:是整个数据仓库系统的核心。数据仓库的真正关键是数据的存储和管理。数据仓库的组织管理方式决定了它有别于传统数据库,同时也决定了其对外部数据的表现形式。要决定采用什么产品和技术来建立数据仓库的核心,则需要从数据仓库的技术特点着手分析。针对现有各业务系统的数据,进行抽取、清理,并有效集成,按照主题进行组织。数据仓库按照数据的覆盖范围可以分为企业级数据仓库和部门级数据仓库(通常称为数据集市)。

    ·OLAP服务器:对分析需要的数据进行有效集成,按多维模型予以组织,以便进行多角度、多层次的分析,并发现趋势。其具体实现可以分为:ROLAPMOLAPHOLAPROLAP基本数据和聚合数据均存放在RDBMS之中;MOLAP基本数据和聚合数据均存放于多维数据库中;HOLAP基本数据存放于RDBMS之中,聚合数据存放于多维数据库中。

    ·前端工具:主要包括各种报表工具、查询工具、数据分析工具、数据挖掘工具以及各种基于数据仓库或数据集市的应用开发工具。其中数据分析工具主要针对OLAP服务器,报表工具、数据挖掘工具主要针对数据仓库。[8]

    1.3 数据仓库规划、设计与开发

        对企业自身来说,数据仓库的建设是一个系统工程,是一个不断建立、发展、完善的过程,通常需要较长的时间。这就要求各企业对整个系统的建设提出一个全面、清晰的远景规划及技术实施蓝图,将整个项目的实施分成若干个阶段,以总体规划、分步实施、步步见效为原则,不仅可迅速从当前投资中获得收益,而且可以在已有的基础上,结合其他已有的业务系统,逐步构建起完整、健壮的数据仓库系统。

    企业数据仓库的建设通常按照快速原型法予以实施,主要包括:确定范围、环境评估、分析、设计、开发、测试和运行等几个阶段。同时企业数据仓库又是一个在原型的基础上进行不断迭代的过程。

    1.3.1 确定范围

    确定范围的主要任务包括了解方向性分析处理需求,确定信息需求,确定数据覆盖范围。方向性需求包括:决策类型、决策者感兴趣的问题(或对象)等。在确定范围时应该重视的因素是必须用户驱动和数据驱动相结合,同时可以借鉴国内外已有的成功经验。

    1.3.2 环境评估

    环境评估是对企业数据仓库系统建设的硬件环境和软件环境进行选型和准备。在硬件平台选择中需要选择与数据仓库系统规模相适应的核心服务器,同时我们认为数据仓库系统平台与业务处理平台应该相分离。软件平台的选择主要包括数据仓库引擎、OLAP引擎、前端分析展现工具的选择。产品进行测试是软件选型的一种有效方法,各个企业可以根据自身的数据状况对各类产品进行测试。

    1.3.3 分析

    分析阶段主要包括两个方面的任务是深入了解数据源和分析数据仓库系统所包含的主题域及其相互之间的关系。分析阶段必须坚持用户参与,并且与原有系统开发或维护人员进行深入的沟通。

    需求分析包括一下的工作:确定数据仓库的粒度;确定候选的衡量指标(Candidate Measure)、事实表以及维度,包括确定维度的层次结构;构建初始的多维模型。[5]

    1.3.4 设计

    数据仓库设计的主要任务包括与操作型系统接口的设计和数据仓库本身的设计两个部分的内容。其中与操作型系统接口的设计主要是指数据抽取、清理、转换和刷新策略的设计。从多个不同的数据源中抽取数据,需要解决数据的不一致性,保证数据的质量。其中的不一致性主要包含模式冲突和语义冲突。从操作型数据库模型到数据仓库模型的转变需要大量细致的工作,例如:-消除纯粹是操作型的数据;-将包含在多个表中的有关数据进行合理合并;-适当增加部分导出数据;-在码值中增加时间关键字;-按照合适的数据粒度进行综合。

    数据仓库本身的设计包括数据仓库逻辑数据模型的设计、数据仓库物理数据模型的设计。由于目前数据仓库产品尚未形成一套统一的标准,因此在数据仓库设计阶段必须要有数据仓库专家和数据仓库系统产品提供商的参与。

    目前,主流的数据仓库建模技术分为两种:实体关系建模(Entity-Relationship Modeling)以及维建模(Dimension Modeling)。其中,维建模又分为星型结构以及雪花型结构等。[5]

    数据仓库设计工具的选择有:

    EDA/SQL(SAS Institute Inc)SAS研究所

    (Sybase,Inc)Sysbase有限公司[3]

    CA公司的Erwin[5]

    1.3.5 开发

    开发阶段所要完成的主要内容包括数据仓库建模、数据抽取和加载模块、数据访问模块以及开发实际应用。实际应用开发建议采用撌缘銛的方法,从急需的业务开始进行,应该重视的因素包括必须有行业专家的参与,同时必须有数据仓库专家的参与。

    1.3.5 测试

    测试是保证系统可靠性的重要手段。数据仓库测试与一般软件系统测试不同的是数据仓库的测试不仅包括对软件系统的测试,同时包括对数据的测试。在测试阶段必须保证测试的充分性,同时注意测试数据的覆盖范围。

    1.3.6 运行

    系统运行主要包括用户培训、数据加载、数据访问及应用等。在数据仓库系统的运行过程中,不断收集用户新的需求。

    数据仓库系统的建设不可能一蹴而就,它是一个不断建立、完善、健全的过程。这个过程是随着业务量、业务范围和客户的不断发展而发展的,其成长的速度非常之快,同时随着业务的发展,数据仓库的价值也将随之增长。[8]

    1.4 小结

       本章主要介绍说明数据仓库的相关概念、体系结构和设计开发等。为数据挖掘的前期工作做准备。为数据挖掘提供良好的环境。当然,数据仓库并不是数据挖掘的先决条件,因为有很多数据挖掘可直接从操作数据源中挖掘信息。

    第二章  数据挖掘

    2.1 概论

    数据挖掘(Data Mining)是发现数据中有用模式的过程。数据挖掘会话的目的是确定数据的趋势和模式。[4] 数据挖掘强调对大量观测到的数据库的处理。它是涉及数据库管理,人工智能,机器学习,模式识别,及数据可视化等学科的边缘学科。用统计的观点看,它可以看成是通过计算机对大量的复杂数据集的自动探索性分析。

    顾名思义, 数据挖掘就是从大量的数据中挖掘出有用的信息。它是根据人们的特定要求,从浩如烟海的数据中找出所需的信息来,供人们的特定需求使用。20007月,IDC发布了有关信息存取工具市场的报告。1999年,数据挖掘市场大概约为75亿美元,估计在下个5年内市场的年增长率为324%,其中亚太地区为266%。到2002年,该市场会发展到22亿美元。据国外专家预测,随着数据量的日益积累和计算机的广泛应用,在今后的5—10年内,数据挖掘将在中国形成一个新型的产业。

    数据挖掘技术是人们长期对数据库技术进行研究和开发的结果。起初各种商业数据是存储在计算机的数据库中的,然后发展到可对数据库进行查询和访问,进而发展到对数据库的即时遍历。数据挖掘使数据库技术进入了一个更高级的阶段,它不仅能对过去的数据进行查询和遍历,并且能够找出过去数据之间的潜在联系,从而促进信息的传递。现在数据挖掘技术在商业应用中已经可以马上投入使用,因为对这种技术进行支持的三种基础技术已经发展成熟,他们是:(1) 海量数据搜集;(2)强大的多处理器计算机;(3)数据挖掘算法。Friedman[1997]列举了四个主要的技术理由激发了数据挖掘的开发、应用和研究的兴趣:(1)超大规模数据库的出现,例如商业数据仓库和计算机自动收集的数据记录;(2)先进的计算机技术,例如更快和更大的计算能力和并行体系结构;(3)对巨大量数据的快速访问;(4 对这些数据应用精深的统计方法计算的能力。

    商业数据库现在正在以一个空前的速度增长,并且数据仓库正在广泛地应用于各种行业;对计算机硬件性能越来越高的要求,也可以用现在已经成熟的并行多处理机的技术来满足;另外数据挖掘算法经过了这10多年的发展也已经成为一种成熟,稳定,且易于理解和操作的技术。

    随着在80年代末一个新的术语,它就是数据库中的知识发现,简称KDD(Knowledge discovery in database)。它泛指所有从源数据中发掘模式或联系的方法,人们接受了这个术语,并用KDD来描述整个数据发掘的过程,包括最开始的制定业务目标到最终的结果分析,而用数据挖掘(data mining)来描述使用挖掘算法进行数据挖掘的子过程。[9]

    数据挖掘与传统的数据分析(如查询、报表、联机应用分析)的本质区别是数据挖掘是在没有明确假设的前提下去挖掘信息、发现知识。数据挖掘所得到的信息应具有先未知,有效和可实用三个特征。

    基于并行系统的数据库管理系统也给数据挖掘技术的应用带来了便利。如果你有一个庞大而复杂的数据挖掘问题要求通过访问数据库取得数据,那么效率最高的办法就是利用一个本地的并行数据库。

    现在面临一个尴尬的境地——数据丰富信息匮乏(data rich but information poor)!快速增长的海量数据,已经远远的超过了人们的理解能力,如果不借助强有力的工具,很难弄清大堆数据中所蕴含的知识。结果,重要决策只是基于制定决策者的个人经验,而不是基于信息丰富的数据。数据挖掘就这样应运而生,数据挖掘填补了数据和信息之间的鸿沟。[11]

    2.2 数据挖掘研究的内容和本质

    随着DM/KDD研究逐步走向深入,数据挖掘和知识发现的研究已经形成了三根强大的技术支柱:数据库、人工智能和数理统计。因此,KDD大会程序委员会曾经由这三个学科的权威人物同时来任主席。目前DM/KDD的主要研究内容包括基础理论、发现算法、数据仓库、可视化技术、定性定量互换模型、知识表示方法、发现知识的维护和再利用、半结构化和非结构化数据中的知识发现以及网上数据挖掘等。

    数据挖掘所发现的知识最常见的有以下四类:

    2.2.1 广义知识

    广义知识指类别特征的概括性描述知识。根据数据的微观特性发现其表征的、带有普遍性的、较高层次概念的、中观和宏观的知识,反映同类事物共同性质,是对数据的概括、精炼和抽象。

    广义知识的发现方法和实现技术有很多,如数据立方体、面向属性的归约等。数据立方体还有其他一些别名,如多维数据库实现视图“OLAP"等。该方法的基本思想是实现某些常用的代价较高的聚集函数的计算,诸如计数、求和、平均、最大值等,并将这些实现视图储存在多维数据库中。既然很多聚集函数需经常重复计算,那么在多维数据立方体中存放预先计算好的结果将能保证快速响应,并可灵活地提供不同角度和不同抽象层次上的数据视图。另一种广义知识发现方法是加拿大SimonFraser大学提出的面向属性的归约方法。这种方法以类SQL语言表示数据挖掘查询,收集数据库中的相关数据集,然后在相关数据集上应用一系列数据推广技术进行数据推广,包括属性删除、概念树提升、属性阈值控制、计数及其他聚集函数传播等。

    2.2.2 关联知识

    它反映一个事件和其他事件之间依赖或关联的知识。如果两项或多项属性之间存在关联,那么其中一项的属性值就可以依据其他属性值进行预测。最为著名的关联规则发现方法是RAgrawal提出的Apriori算法。关联规则的发现可分为两步。第一步是迭代识别所有的频繁项目集,要求频繁项目集的支持率不低于用户设定的最低值;第二步是从频繁项目集中构造可信度不低于用户设定的最低值的规则。识别或发现所有频繁项目集是关联规则发现算法的核心,也是计算量最大的部分。

    2.2.3 分类知识

    它反映同类事物共同性质的特征型知识和不同事物之间的差异型特征知识。最为典型的分类方法是基于决策树的分类方法。它是从实例集中构造决策树,是一种有指导的学习方法。该方法先根据训练子集(又称为窗口)形成决策树。如果该树不能对所有对象给出正确的分类,那么选择一些例外加入到窗口中,重复该过程一直到形成正确的决策集。最终结果是一棵树,其叶结点是类名,中间结点是带有分枝的属性,该分枝对应该属性的某一可能值。  数据分类还有统计、粗糙集(RoughSet)等方法。线性回归和线性辨别分析是典型的统计模型。为降低决策树生成代价,人们还提出了一种区间分类器。最近也有人研究使用神经网络方法在数据库中进行分类和规则提取。

    2.2.4 预测型知识

    它根据时间序列型数据,由历史的和当前的数据去推测未来的数据,也可以认为是以时间为关键属性的关联知识。

    目前,时间序列预测方法有经典的统计方法、神经网络和机器学习等。1968BoxJenkins提出了一套比较完善的时间序列建模理论和分析方法,这些经典的数学方法通过建立随机模型,如自回归模型、自回归滑动平均模型、求和自回归滑动平均模型和季节调整模型等,进行时间序列的预测。由于大量的时间序列是非平稳的,其特征参数和数据分布随着时间的推移而发生变化。因此,仅仅通过对某段历史数据的训练,建立单一的神经网络预测模型,还无法完成准确的预测任务。为此,人们提出了基于统计学和基于精确性的再训练方法,当发现现存预测模型不再适用于当前数据时,对模型重新训练,获得新的权重参数,建立新的模型。也有许多系统借助并行算法的计算优势进行时间序列预测。

    此外,还可以发现其他类型的知识,如偏差型知识(Deviation),它是对差异和极端特例的描述,揭示事物偏离常规的异常现象,如标准类外的特例,数据聚类外的离群值等。所有这些知识都可以在不同的概念层次上被发现,并随着概念层次的提升,从微观到中观、到宏观,以满足不同用户不同层次决策的需要。[9]

    2.3 数据挖掘流程

      数据挖掘是指一个完整的过程,该过程从大型数据库中挖掘先前未知的,有效的,可实用的信息,并使用这些信息做出决策或丰富知识。
      数据挖掘环境可示意如下图:

       下图描述了数据挖掘的基本过程和主要步骤

    数据挖掘的基本过程和主要步骤:

    在数据挖掘中被研究的业务对象是整个过程的基础,它驱动了整个数据挖掘过程,也是检验最后结果和指引分析人员完成数据挖掘的依据和顾问。

    过程中各步骤的大体内容如下:

    2.3.1 确定业务对象

    清晰地定义出业务问题,认清数据挖掘的目的是数据挖掘的重要一步。挖掘的最后结构是不可预测的,但要探索的问题应是有预见的,为了数据挖掘而数据挖掘则带有盲目性,是不会成功的。

    2.3.2 数据准备

    (1) 数据的选择

    搜索所有与业务对象有关的内部和外部数据信息,并从中选择出适用于数据挖掘应用的数据。

    (2) 数据的预处理

    研究数据的质量,为进一步的分析作准备。并确定将要进行的挖掘操作的类型。

    (3) 数据的转换

    将数据转换成一个分析模型。这个分析模型是针对挖掘算法建立的。建立一个真正适合挖掘算法的分析模型是数据挖掘成功的关键。

    2.3.3 数据挖掘

      对所得到的经过转换的数据进行挖掘。除了完善从选择合适的挖掘算法外,其余一切工作都能自动地完成。

    2.3.4 结果分析

      解释并评估结果。其使用的分析方法一般应作数据挖掘操作而定,通常会用到可视化技术。

    2.3.5 知识的同化

     将分析所得到的知识集成到业务信息系统的组织结构中去。
      数据挖掘过程的分步实现,不同的步会需要是有不同专长的人员,他们大体可以分为三类。

    业务分析人员:要求精通业务,能够解释业务对象,并根据各业务对象确定出用于数据定义和挖掘算法的业务需求。

    数据分析人员:精通数据分析技术,并对统计学有较熟练的掌握,有能力把业务需求转化为数据挖掘的各步操作,并为每步操作选择合适的技术。

    数据管理人员:精通数据管理技术,并从数据库或数据仓库中收集数据。
      从上可见,数据挖掘是一个多种专家合作的过程,也是一个在资金上和技术上高投入的过程。这一过程要反复进行牞在反复过程中,不断地趋近事物的本质,不断地优先问题的解决方案。数据重组和细分添加和拆分记录选取数据样本可视化数据探索聚类分析神经网络、决策树数理统计、时间序列结论综合解释评价数据知识数据取样数据探索数据调整模型化评价
    [9]

    2.4 数据挖掘的方法

    2.4.1 神经网络方法

    神经网络由于本身良好的健壮性、自组织自适应性、并行处理、分布存储和高度容错等特性非常适合解决数据挖掘的问题,因此近年来越来越受到人们的关注。典型的神经网络模型主要分3大类:以感知机、BP反向传播模型、函数型网络为代表的,用于分类、预测和模式识别的前馈式神经网络模型;以Hopfield的离散模型和连续模型为代表的,分别用于联想记忆和优化计算的反馈式神经网络模型;以ART模型、Koholon模型为代表的,用于聚类的自组织映射方法。神经网络方法的缺点是"黑箱"性,人们难以理解网络的学习和决策过程。

    2.4.2 遗传算法

    遗传算法是一种基于生物自然选择与遗传机理的随机搜索算法,是一种仿生全局优化方法。遗传算法具有的隐含并行性、易于和其它模型结合等性质使得它在数据挖掘中被加以应用。

    Sunil已成功地开发了一个基于遗传算法的数据挖掘工具,利用该工具对两个飞机失事的真实数据库进行了数据挖掘实验,结果表明遗传算法是进行数据挖掘的有效方法之一[4]。遗传算法的应用还体现在与神经网络、粗集等技术的结合上。如利用遗传算法优化神经网络结构,在不增加错误率的前提下,删除多余的连接和隐层单元;用遗传算法和BP算法结合训练神经网络,然后从网络提取规则等。但遗传算法的算法较复杂,收敛于局部极小的较早收敛问题尚未解决。

    2.4.3 决策树方法

    决策树是一种常用于预测模型的算法,它通过将大量数据有目的分类,从中找到一些有价值的,潜在的信息。它的主要优点是描述简单,分类速度快,特别适合大规模的数据处理。最有影响和最早的决策树方法是由Quinlan提出的著名的基于信息熵的ID3算法。它的主要问题是:ID3是非递增学习算法;ID3决策树是单变量决策树,复杂概念的表达困难;同性间的相互关系强调不够;抗噪性差。针对上述问题,出现了许多较好的改进算法,如 SchlimmerFisher设计了ID4递增式学习算法;钟鸣,陈文伟等提出了IBLE算法等。

    2.4.4 粗集方法

    粗集理论是一种研究不精确、不确定知识的数学工具。粗集方法有几个优点:不需要给出额外信息;简化输入信息的表达空间;算法简单,易于操作。粗集处理的对象是类似二维关系表的信息表。目前成熟的关系数据库管理系统和新发展起来的数据仓库管理系统,为粗集的数据挖掘奠定了坚实的基础。但粗集的数学基础是集合论,难以直接处理连续的属性。而现实信息表中连续属性是普遍存在的。因此连续属性的离散化是制约粗集理论实用化的难点。现在国际上已经研制出来了一些基于粗集的工具应用软件,如加拿大Regina大学开发的KDD-R;美国Kansas大学开发的LERS等。

    2.4.5 覆盖正例排斥反例方法

    它是利用覆盖所有正例、排斥所有反例的思想来寻找规则。首先在正例集合中任选一个种子,到反例集合中逐个比较。与字段取值构成的选择子相容则舍去,相反则保留。按此思想循环所有正例种子,将得到正例的规则(选择子的合取式)。比较典型的算法有MichalskiAQ11方法、洪家荣改进的AQ15方法以及他的AE5方法。

    2.4.6 统计分析方法

    在数据库字段项之间存在两种关系:函数关系(能用函数公式表示的确定性关系)和相关关系(不能用函数公式表示,但仍是相关确定性关系),对它们的分析可采用统计学方法,即利用统计学原理对数据库中的信息进行分析。可进行常用统计(求大量数据中的最大值、最小值、总和、平均值等)、回归分析(用回归方程来表示变量间的数量关系)、相关分析(用相关系数来度量变量间的相关程度)、差异分析(从样本统计量的值得出差异来确定总体参数之间是否存在差异)等。

    2.4.7 模糊集方法

    即利用模糊集合理论对实际问题进行模糊评判、模糊决策、模糊模式识别和模糊聚类分析。系统的复杂性越高,模糊性越强,一般模糊集合理论是用隶属度来刻画模糊事物的亦此亦彼性的。李德毅等人在传统模糊理论和概率统计的基础上,提出了定性定量不确定性转换模型--云模型,并形成了云理论。

    2.5 如何评价数据挖掘软件

    越来越多的软件供应商加入了数据挖掘这一领域的竞争。用户如何正确评价一个商业软件,选择合适的软件成为数据挖掘成功应用的关键。

    评价一个数据挖掘软件主要应从以下四个主要方面:

    计算性能:如该软件能否在不同的商业平台运行;软件的架构;能否连接不同的数据源;操作大数据集时,性能变化是线性的还是指数的;算的效率;是否基于组件结构易于扩展;运行的稳定性等;

    功能性:如软件是否提供足够多样的算法;能否避免挖掘过程黑箱化;软件提供的算法能否应用于多种类型的数据;用户能否调整算法和算法的参数;软件能否从数据集随机抽取数据建立预挖掘模型;能否以不同的形式表现挖掘结果等;

    可用性:如用户界面是否友好;软件是否易学易用;软件面对的用户:初学者,高级用户还是专家?错误报告对用户调试是否有很大帮助;软件应用的领域:是专攻某一专业领域还是适用多个领域等;

    辅助功能:如是否允许用户更改数据集中的错误值或进行数据清洗;是否允许值的全局替代;能否将连续数据离散化;能否根据用户制定的规则从数据集中提取子集;能否将数据中的空值用某一适当均值或用户指定的值代替;能否将一次分析的结果反馈到另一次分析中,等等。

    2.6 数据挖掘工具的现状

    比较著名的有IBM Intelligent MinerSAS Enterprise MinerSPSS Clementine等,它们都能够提供常规的挖掘过程和挖掘模式。

    (1) Intelligent Miner

    由美国IBM公司开发的数据挖掘软件Intelligent Miner是一种分别面向数据库和文本信息进行数据挖掘的软件系列,它包括Intelligent Miner for DataIntelligent Miner for TextIntelligent Miner for Data可以挖掘包含在数据库、数据仓库和数据中心中的隐含信息,帮助用户利用传统数据库或普通文件中的结构化数据进行数据挖掘。它已经成功应用于市场分析、诈骗行为监测及客户联系管理等;Intelligent Miner for Text允许企业从文本信息进行数据挖掘,文本数据源可以是文本文件、Web页面、电子邮件、Lotus Notes数据库等等。

    (2) Enterprise Miner

    这是一种在我国的企业中得到采用的数据挖掘工具,比较典型的包括上海宝钢配矿系统应用和铁路部门在春运客运研究中的应用。SAS Enterprise Miner是一种通用的数据挖掘工具,按照"抽样--探索--转换--建模--评估"的方法进行数据挖掘。可以与SAS数据仓库和OLAP集成,实现从提出数据、抓住数据到得到解答的"端到端"知识发现。

    (3) SPSS Clementine

    SPSS Clementine是一个开放式数据挖掘工具,曾两次获得英国政府SMART 创新奖,它不但支持整个数据挖掘流程,从数据获取、转化、建模、评估到最终部署的全部过程,还支持数据挖掘的行业标准--CRISP-DMClementine的可视化数据挖掘使得"思路"分析成为可能,即将集中精力在要解决的问题本身,而不是局限于完成一些技术性工作(比如编写代码)。提供了多种图形化技术,有助理解数据间的关键性联系,指导用户以最便捷的途径找到问题的最终解决办法。

    其它常用的数据挖掘工具还有LEVEL5 Quest MineSet (SGI) Partek SE-Learn SPSS 的数据挖掘软件SnobAshraf Azmy SuperQuery WINROSA XmdvTool [26]

    2.7 数据挖掘未来研究方向及热点

    当前,DM/KDD研究方兴未艾,其研究与开发的总体水平相当于数据库技术在70年代所处的地位,迫切需要类似于关系模式、DBMS系统和SQL查询语言等理论和方法的指导,才能使DM/KDD的应用得以普遍推广。预计在本世纪,DM/KDD的研究还会形成更大的高潮,研究焦点可能会集中到以下几个方面:

    发现语言的形式化描述,即研究专门用于知识发现的数据挖掘语言,也许会像SQL语言一样走向形式化和标准化;

    寻求数据挖掘过程中的可视化方法,使知识发现的过程能够被用户理解,也便于在知识发现的过程中进行人机交互;

    研究在网络环境下的数据挖掘技术(WebMining),特别是在因特网上建立DM/KDD服务器,并且与数据库服务器配合,实现WebMining

    加强对各种非结构化数据的开采(DataMiningforAudioVideo),如对文本数据、图形数据、视频图像数据、声音数据乃至综合多媒体数据的开采;

    处理的数据将会涉及到更多的数据类型,这些数据类型或者比较复杂,或者是结构比较独特。为了处理这些复杂的数据,就需要一些新的和更好的分析和建立模型的方法,同时还会涉及到为处理这些复杂或独特数据所做的费时和复杂数据准备的一些工具和软件。

    交互式发现;

    知识的维护更新。

    但是,不管怎样,需求牵引与市场推动是永恒的,DM/KDD将首先满足信息时代用户的急需,大量的基于DM/KDD的决策支持软件产品将会问世。

    就目前来看,将来的几个热点包括网站的数据挖掘(Web site data mining)、生物信息或基因(Bioinformatics/genomics)的数据挖掘及其文本的数据挖掘(Textual mining)。下面就这几个方面加以简单介绍。

    2.4.1 网站的数据挖掘

    需求随着Web技术的发展,各类电子商务网站风起云涌,建立起一个电子商务网站并不困难,困难的是如何让您的电子商务网站有效益。要想有效益就必须吸引客户,增加能带来效益的客户忠诚度。电子商务业务的竞争比传统的业务竞争更加激烈,原因有很多方面,其中一个因素是客户从一个电子商务网站转换到竞争对手那边,只需点击几下鼠标即可。网站的内容和层次、用词、标题、奖励方案、服务等任何一个地方都有可能成为吸引客户、同时也可能成为失去客户的因素。而同时电子商务网站每天都可能有上百万次的在线交易,生成大量的记录文件(Logfiles)和登记表,如何对这些数据进行分析和挖掘,充分了解客户的喜好、购买模式,甚至是客户一时的冲动,设计出满足于不同客户群体需要的个性化网站,进而增加其竞争力,几乎变得势在必行。若想在竞争中生存进而获胜,就要比您的竞争对手更了解客户。

    电子商务网站数据挖掘,在对网站进行数据挖掘时,所需要的数据主要来自于两个方面:一方面是客户的背景信息,此部分信息主要来自于客户的登记表;而另外一部分数据主要来自浏览者的点击流(Click-stream),此部分数据主要用于考察客户的行为表现。但有的时候,客户对自己的背景信息十分珍重,不肯把这部分信息填写在登记表上,这就会给数据分析和挖掘带来不便。在这种情况之下,就不得不从浏览者的表现数据中来推测客户的背景信息,进而再加以利用。

    就分析和建立模型的技术和算法而言,网站的数据挖掘和原来的数据挖掘差别并不是特别大,很多方法和分析思想都可以运用。所不同的是网站的数据格式有很大一部分来自于点击流,和传统的数据库格式有区别。因而对电子商务网站进行数据挖掘所做的主要工作是数据准备。目前,有很多厂商正在致力于开发专门用于网站挖掘的软件。

    2.4.2 生物信息或基因数据挖掘

      生物信息或基因数据挖掘则完全属于另外一个领域,在商业上很难讲有多大的价值,但对于人类却受益非浅。例如,基因的组合千变万化,得某种病的人的基因和正常人的基因到底差别多大?能否找出其中不同的地方,进而对其不同之处加以改变,使之成为正常基因?这都需要数据挖掘技术的支持。

    对于生物信息或基因的数据挖掘和通常的数据挖掘相比,无论在数据的复杂程度、数据量还有分析和建立模型的算法而言,都要复杂得多。从分析算法上讲,更需要一些新的和好的算法。现在很多厂商正在致力于这方面的研究。但就技术和软件而言,还远没有达到成熟的地步。

    (1)        

    2.4.3 文本的数据挖掘

    人们很关心的另外一个话题是文本数据挖掘。举个例子,在客户服务中心,把同客户的谈话转化为文本数据,再对这些数据进行挖掘,进而了解客户对服务的满意程度和客户的需求以及客户之间的相互关系等信息。从这个例子可以看出,无论是在数据结构还是在分析处理方法方面,文本数据挖掘和前面谈到的数据挖掘相差很大。文本数据挖掘并不是一件容易的事情,尤其是在分析方法方面,还有很多需要研究的专题。目前市场上有一些类似的软件,但大部分方法只是把文本移来移去,或简单地计算一下某些词汇的出现频率,并没有真正的分析功能。

    随着计算机计算能力的发展和业务复杂性的提高,数据的类型会越来越多、越来越复杂,数据挖掘将发挥出越来越大的作用。[9]

    2.4.4 2005年十大热点问题

    2005ICDM的大会上,给出了一下10个挑战性的问题:

        1  发展统一的数据挖掘理论

    (2)       多维的数据挖掘和高速流的数据挖掘

    (3)       时序系列的数据挖掘

    (4)       从复杂数据中的复杂知识的挖掘

    (5)       网络的数据挖掘

    (6)       分布式数据挖掘和多代理的数据挖掘

    (7)       生物和环境问题的数据挖掘

    (8)       相关问题的数据挖掘过程

    (9)       安全,隐私和数据一致性

    (10)   动态、不均衡和权值数据的数据挖[12]

    2.5 小结

        本章主要介绍数据挖掘的相关知识。看看是否发现有什么可以研究的,并了解其过程以及未来研究的方向热点等问题。通过对数据挖掘的了解,可以在以后的挖掘过程中相互采用比较好的算法,实现综合应用。或对自己的思想有所启发。创造更好的挖掘算法。

    第三章  关联规则

    3.1 概论

    数据关联是数据库中存在的一类重要的可被发现的知识。若两个或多个变量的取值之间存在某种规律性,就称为关联。关联可分为简单关联、时序关联、因果关联。关联分析的目的是找出数据库中隐藏的关联网。有时并不知道数据库中数据的关联函数,即使知道也是不确定的,因此关联分析生成的规则带有可信度。

    关联规则挖掘发现大量数据中项集之间有趣的关联或相关联系。它在数据挖掘中是一个重要的课题,最近几年已被业界所广泛研究。关联规则挖掘的一个典型例子是购物篮分析。关联规则研究有助于发现交易数据库中不同商品(项)之间的联系,找出顾客购买行为模式,如购买了某一商品对购买其他商品的影响。分析结果可以应用于商品货架布局、货存安排以及根据购买模式对用户进行分类。

    Agrawal等于1993年首先提出了挖掘顾客交易数据库中项集间的关联规则问题[20],以后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。他们的工作包括对原有的算法进行优化,如引入随机采样、并行的思想等,以提高算法挖掘规则的效率;对关联规则的应用进行推广。

    最近也有独立于Agrawal的频集方法的工作,以避免频集方法的一些缺陷,探索挖掘关联规则的新方法。也有一些工作注重于对挖掘到的模式的价值进行评估,他们提出的模型建议了一些值得考虑的研究方向。

     

    3.2 基本概念

    1993年,R.Agrawal等人首次提出了关联规则的概念。其一般定义如下:J={ I1, I2, , Im }是一项目集,D是一事务数据库,其中每个事务T J。每个事务都有一个标识符,称之为TID。若A一是项目集,当且仅当A T时,我们说事务T包含了A。一条关联规则就是形如A B的蕴含关系,其中A JB JA B= 。如果D中包含A B的比例是s,就称关联规则A BD中的支持度为s,也可以表示为概率PA B);如果D中包含A的同时也包含B的比例是c ,则说关联规则A B的置信度为c,表示为条件概率PB|A)。就是:

    SupportA B= PA B

    ConfidenceA B= PB|A

    支持度(support)和置信度(confidence)两个阈值是描述关联规则的两个重要概念,支持度反映关联规则在数据库中的重要性,置信度衡量关联规则的可信程度。如果某条规则同时满足最小支持度(min-support)和最小置信度(min-confidence),则称它为强关联规则。

    3.3 关联规则种类

    我们将关联规则按不同的情况进行分类:

    (1) 基于规则中处理的变量的类别,关联规则可以分为布尔型和数值型。布尔型关联规则处理的值都是离散的、种类化的,它显示了这些变量之间的关系;而数值型关联规则可以和多维关联或多层关联规则结合起来,对数值型字段进行处理,将其进行动态的分割,或者直接对原始的数据进行处理,当然数值型关联规则中也可以包含种类变量。例如:性别=“”=>职业=“秘书,是布尔型关联规则;性别=“”=>avg(收入)=2300,涉及的收入是数值类型,所以是一个数值型关联规则。

    (2) 基于规则中数据的抽象层次,可以分为单层关联规则和多层关联规则。在单层的关联规则中,所有的变量都没有考虑到现实的数据是具有多个不同的层次的;而在多层的关联规则中,对数据的多层性已经进行了充分的考虑。例如:IBM台式机=>Sony打印机,是一个细节数据上的单层关联规则;台式机=>Sony打印机,是一个较高层次和细节层次之间的多层关联规则。

    (3) 基于规则中涉及到的数据的维数,关联规则可以分为单维的和多维的。在单维的关联规则中,我们只涉及到数据的一个维,如用户购买的物品;而在多维的关联规则中,要处理的数据将会涉及多个维。换成另一句话,单维关联规则是处理单个属性中的一些关系;多维关联规则是处理各个属性之间的某些关系。例如:啤酒=>尿布,这条规则只涉及到用户的购买的物品;性别=“”=>职业=“秘书,这条规则就涉及到两个字段的信息,是两个维上的一条关联规则。

    4 关联规则挖掘的算法
    (1)
    经典频集方法
        Agrawal
    等于1993年首先提出了挖掘顾客交易数据库中项集间的关联规则问题,其核心方法是基于频集理论的递推方法。以后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。他们的工作包括对原有的算法进行优化,如引入随机采样、并行的思想等,以提高算法挖掘规则的效率;提出各种变体,如泛化的关联规则、周期关联规则等,对关联规则的应用进行推广。

    (2) 核心算法

    Agrawal等在1993年设计了一个基本算法,提出了挖掘关联规则的一个重要方法这是一个基于两阶段频集思想的方法,将关联规则挖掘算法的设计可以分解为两个子问题:

    (1)找到所有支持度大于最小支持度的项集(Itemset),这些项集称为频集(Frequent Itemset)。

    (2)使用第1步找到的频集产生期望的规则。这里的第2步相对简单一点。如给定了一个频集Y=I1I2...Ikk³2Ij∈I,产生只包含集合{I1I2...Ik}中的项的所有规则(最多k),其中每一条规则的右部只有一项,(即形如[Y-Ii]ÞIi"1£i£k),这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。其核心思想如下:

    (1)     L1 = {large 1-itemsets};

    (2)     for (k=2; Lk-1¹F; k++) do begin

    (3)       Ck=Apriori-gen(Lk-1);   //新的候选集

    (4)       for all transactions tÎD do begin

    (5)           Ct=subset(Ck,t);    //事务t中包含的候选集

    (6)           for all candidates cÎ Ct  do

    (7)           c.count++;

    (8)       end

    (9)        Lk={cÎ Ck |c.count³minsup}

    (10)    end

    (11)    Answer=ÈkLk;

    首先产生频繁1-项集L1,然后是频繁2-项集L2,直到有某个r值使得Lr为空,这时算法停止。这里在第k次循环中,过程先产生候选k-项集的集合CkCk中的每一个项集是对两个只有一个项不同的属于Lk-1的频集做一个(k-2)-连接来产生的。Ck中的项集是用来产生频集的候选集,最后的频集Lk必须是Ck的一个子集。Ck中的每个元素需在交易数据库中进行验证来决定其是否加入Lk,这里的验证过程是算法性能的一个瓶颈。这个方法要求多次扫描可能很大的交易数据库,即如果频集最多包含10个项,那么就需要扫描交易数据库10遍,这需要很大的I/O负载。

    在论文中,Agrawal等引入了修剪技术(Pruning)来减小候选集Ck的大小,由此可以显著地改进生成所有频集算法的性能。算法中引入的修剪策略基于这样一个性质:一个项集是频集当且仅当它的所有子集都是频集。那么,如果Ck中某个候选项集有一个(k-1)-子集不属于Lk-1,则这个项集可以被修剪掉不再被考虑,这个修剪过程可以降低计算所有的候选集的支持度的代价。文[6]中,还引入杂凑树(Hash Tree)方法来有效地计算每个项集的支持度。

    3.4 主要研究方向和典型算法分析

    R.Agrawal等人提出了关联规则的采掘问题以后,该问题的研究得到了长足地发展。到目前为止,其主要的研究方向有:

    3.4.1 多循环方式的采掘算法

    此类算法包括Agrawal等人提出的AIS[28]AprioriAprioriTidAprioriHybrid[29]Park 等人提出的DHP[30]Savasere等人的PARTITION[31]以及Toivonen提出的抽样算法Sampling[32]等等。其中最有效和有影响的算法为:AprioriDHPPARTITION

    在算法AIS中,候选大项集是在扫描数据库的过程中产生的。具体地说,在对数据库进行第k 次扫描时,候选大项集(其中每一个元素的元素个数不一定是k个,可以大于k)是由第k-1次扫描所产生的边界集(Frontierset)通过增加当前事务中的项得到,同时计算候选大项集中的元素的支持数,直到某一次扫描所产生的边界集为空时停止运算。应该注意的是,第k次扫描所产生的边界集要大于本次扫描生成的大项集。本算法的缺点在于生成的候选大项集太大。

    算法AprioriAprioriTid利用在给定的事务数据库D中,任意大项集的子集都是大项集; 任意弱项集的超集都是弱项集这一原理对事务数据库进行多遍扫描,第一次扫描得出大1项集L1,第k(k>1)次扫描前先利用第k-1次扫描的结果(即大k-1项集Lk-1)和函数Apriori_gen[29]产生候选大k项集Ck,然后在扫描过程中确定Ck中每一元素的支持数,最后在每一遍扫 描结束时计算出大k项集Lk,算法在当候选大k项集Ck为空时结束。由于充分利用的上述原理 ,这两个算法所产生的候选大项集要比算法AIS小得多,从而提高了算法的效率。算法AprioriTid还有另外一个特点,即仅在第一次扫描时用事务数据库D计算候选大项集的支持数,其 它各次扫描用其上一次扫描生成的候选事务数据库D'来计算候选大项集的支持数。在最后的 几次扫描中,D'的大小要远远小于D,减小了I/O操作时间,提高了算法的效率。算法Aprio riHybrid是算法Apriori与算法AprioriTid的结合,当候选事务数据库D'不能完全容纳于内 存时用算法Apriori,当内存能够完全容纳候选事务数据库D'时,则用算法AprioriTid

    算法DHP利用哈希(Hashing)技术有效地改进了候选大项集的生成过程,产生了比前述算法更小的候选大项集(对大2候选集尤为明显),同时也缩减了事务数据库的大小,减小了I/O操作时间,其效率比算法Apriori有明显提高。

    算法PARTION分为两个部分。在第一部分中,算法首先将要在其中发现关联规则的事务数据 D分为n个互不相交的事务数据库D1D2...DnDi(i=1,2,...,n)的大小要求 能够容纳在内存之中,然后将每一个分事务数据库Di(i=1,2,...,n)读入内存并发现其 中的大项集Li,最后在第一部分结束时将所有分事务数据库的大项集合并成为一个在事务数 据库D中的潜在大项集 算法第二部分计算潜在大项集PL在事务数据库D中的支持数,并得出大项集L。该算法只对事务数据库D扫描两次,大大减少了I/O操作,从而提高了算法的效率。

    算法Sampling设计思想为:对事务数据库D进行随机抽样得到抽样事务数据库D',先以小于 用户给定的最小支持度的支持度发现存在于D'中大项集L',再在剩下的数据库D-D'中继续计 L'中各元素的支持数,最后以用户给定的最小支持度计算出大项集L。在大部分情况下,可以用此方法发现正确的大项集,但有时可能会漏掉一些大项集,这时可以对D进行第二次 扫描以得出漏掉的大项集。此算法在大部分情况下可以只对D进行一次扫描就得出大项集, 最坏的情况对D进行两次扫描,因而算法效率较高。

    3.4.2 增量式更新算法

    关联规则的增量式更新问题主要有两个:在给定的最小支持度和最小置信度下,当一个新 的事物数据集db添加到旧的事物数据库DB中时,如何生成db(DB中的关联规则;给定事物 数据库DB,在最小支持度和最小可信度发生变化时,如何生成数据库DB中的关联规则。文[33]考虑了关联规则更新的第一类问题,给出了一个基本框架与算法Apriori相一致的算法FUP。文[34]针对关联规则更新的第二类问题进行了研究,设计出了相应的算法IUAPIUA

    算法FUP的基本思想为:对任意一个k(k 1)项集,若其在DBdb中都是大项集,则其一定是 大项集;若其在DBdb中都是弱项集,则其一定是弱项集;若其仅在DB(db)中是大项集,则 其支持数应加上其在db(DB)中的支持数以确定它是否为大项集。算法FUP假设在DB中发现的 大项集 (nL中最大元素的元素个数)已被保存下来。它需要对DBdb进行多次扫描,在第 1次扫描中,算法先扫描db,将L1中的元素仍为db(DB中的大项集的元素记入L'1,并生成候 选大1项集C1C1中的元素为db中的大1项集且不包含在L1中;然后扫描DB以决定C1中的元素 是否为db(DB中的大项集,并将是db(DB中的大项集的元素记入L'1中。在第k(k>1)次扫描前 ,先对L'k-1Apriori_Gen()函数生成候选大k项集Ck,并除去Lk中的元素,即Ck=Ck-Lk Lk进行剪枝,即对于X∈Lk,若存在Y∈Lk-1-L'k-1,则X肯定不会是db∪DB中的大k项集,应将其在Lk中删除;然后扫描db,将Lk中的元素仍为db∪DB中的大项集的元素记入L'k,记录候选大k项集Ck中的元素在db中的支持数;最后扫描DB,记录Ck中的元素在DB中的支持数,扫描结束时,将Ck中是db∪DB中大项集 的元素记入L'k中。算法在LkCk均为空时结束。由于利用了对DB进行采掘的结果,本算法的效率比再一次利用算法AprioriDHPdb∪DB进行采掘的效率要高得多。
      算法IUA采用了一个独特的候选大项集生成算法iua_gen,在每一次对数据库DB扫描之前生成 较小的候选大项集,从而提高了算法的效率。它也要求上一次对数据库DB进行采掘时发现的 大项集 (nL中最大元素的元素个数)在本次采掘时是可得到的。因为人们在发现关联规则时,常常需要不断地调整最小支持度和最小可信度来聚集到那些真正令其感兴趣关联规则上 ,因而本算法具有很重要的意义。

    3.4.3 并行发现算法

    目前已经提出的并行采掘关联规则的算法有:Agrawal等人提出的CD(Count Distribution) CaD(Candidate Distribution)DD(Data Distribution)[35]Park等人提出的PDM[36]Chueng等人提出的算法DMA[37]FDM[38]虽然是基于分布式数据库的采掘算法,但也可 适用于并行采掘。

    算法CD具有速度较快、容易实现、要求各计算机间同步次数较少等优点,但它有通信量大和 候选大项集大等缺点。算法CaDDDPDM的执行效果都不如CD[37]。算法DMA虽克服了算法C D的一些弱点,但它要求各计算机间同步次数较多。算法FDM与算法DMA基本一致,区别在于F DM中增加了全局剪枝技术。

    这些算法都是基于无共享体系结构,即并行计算的n台计算机之间除了用网络连接起来以外 ,其它都是完全独立的。每台计算机Pi(i=1,2,...,n)上都有自己的分事务数据库DBi,总的事务数据库

    算法CD是算法Apriori在并行环境下的应用,它要求计算机Pi(i=1,2,...,n)DBi进行多遍扫描。在第k次扫描,当k>1时,计算机Pi(i=1,2,...,n)首先利用第k-1次扫描所得 的大项集Lk-1Apriori_Gen()函数生成候选大项集Ck,当k=1时,计算机Pi先扫描DBi得出 其中的大1项集,再与其它计算机得到的大1项集进行交换并进行合并,从而生成候选大1 C1;然后扫描DBi计算Ck中的元素在DBi中的支持数,计算机Pi广播Ck中元素的支持数,并 接收从其它计算机 传来的Ck中元素的支持数,并对这些支持数进行累加,得出Ck 元素的全局支持数;最后计算出大k项集Lk,若Lk中元素个数为1,则算法结束。

    算法DMA是基于若项集XDB中是大项集,则其必在某一个DBi也是大项集的原理进行设计。算法中采用局部剪枝技术(Local pruning),使其生成的候选大项集比算法CD要小。算法各个站点进行支持数交换时采用轮询站点技术(polling site),使每一个项集X的通讯代 价由算法CDo(n2)降为o(n),其中n为站点个数。它可分为如下几步:生成候选大k项集CHiK。根据计算机Pi(i=12...n)k-1次循环所生成的稠密集HLiK-1,生成循环k所需用的候选大k项集CHiK,即 支持数计算。扫描DBi计算候选大k项集中的每个元素X的局部支持数X.supi交换支持数。采用轮询站点技术与其它计算机交换候选大k项集中的 元素的支持数,并计算它的全局支持数。生成大项集Lk和稠密集。中的元素具有下列性质:它在DBiDB中都是大项集。

    (4)采掘一般或多层关联规则

    在研究采掘关联规则的过程中,许多学者发现在一些实际应用中,由于数据比较少,要想在 原始的概念层次上发现强的(Strong)和有趣的(Interesting)关联规则是比较困难的,因为 好多项集往往没有足够的支持数。由于概念层次在要采掘的数据库中经常是存在的,比如在 一个连锁店会存在这样概念层次:光明牌牛奶是牛奶,牛奶是食品等,我们称高层次的项是 低层次项的父亲,这种概念层次关系通常用一个有向非循环图(DAG)来表示。于是我们就可 以在较高的概念层次上发现关联规则。基于要采掘的数据库中的概念层次和发现单一概念层 次中的关联规则的算法,学者们提出了许多高效发现一般或多层关联规则的算法,主要有: Han等人的ML_T2L1及其变种ML_T1LAML_TML1ML_T2LA[39]R.Srikant等人的Cumulate Stratify及其变种EstimateEstMerge[40]等。

    算法ML_T2L1的基本思想是首先根据要发现的任务从原事务数据库生成一个根据概念层次信 息进行编码的事务数据库,利用这个具有概念层次信息的新生成的数据库,自顶向下逐层递 进地在不同层次发现相应的关联规则。它实际上是算法Apriori在多概念层次环境中的扩展 。根据对在发现高层关联规则过程中所用的数据结构和所生成的中间结果共享方式的不同, 算法ML_T2L1有三个变种:ML_T1LAML_TML1ML_T2LA

    算法Cumulate的基本思想与Apriori完全一样,只是在扫描到事务数据库某一事务时,将此 事务中所有项的祖先加入到本事务中,并加入三个优化:对加入到事务中的祖先进行过滤 预先计算概念关系T中的每一个项的祖先,得到项集与其祖先的对照表T*对既包含 项集X又包含X的祖先的项集进行剪枝。

    算法Stratify基于若项集X的父亲不是大项集,则X肯定不会是大项集的事实进行设计。其基本思想为:在概念层次有向非循环图中,定义没有父亲的项集X的深度depth(X)=0,其 它项集的深度为: 算法要对事务数据库进行多遍扫描,第k k(0)次扫描计算深度为k k(0)的所有项集Ck的支持数,并得出深度为k k(0)的大项集Lk,在第k k(1)次扫描之前,对Ck进行剪枝,即删除Ck中那些祖先包含在Ck-1-Lk-1中的元素。围绕着怎样及早决定某些深度较大的项集是否是大项集问题,文献[40]用抽样技术对算 Stratify进行扩展,形成算法EstimateEstMerge

    (5)采掘多值属性关联规则

    关联规则可分为布尔型关联规则和多值属性关联规则。多值属性又可分为数量属性和类别属 性。多值属性关联规则采掘问题首先在文献[41]中提出。目前提出的采掘多值属性关联规则的算法大多是将多值属性关联规则采掘问题转化为布尔型关联规则采掘问题,即将多值属性 的值划分为多个区间,每个区间算作一个属性,将类别属性的每一个类别当作一个属性。

    [41]中发现的多值属性关联规则的形式为:x=qx y=qy,其前件和后件对应的都是单一的 数值,而不是一个区间,文中提出的算法比较简单,但当我们需要发现所有属性之间的关联 规则时,我们将遇到属性组合的爆炸问题。

    [42]偏完整性度量(partial completenessmeasure原则将数量属性划分为相等的几个区段,当某一区段的支持数小于用户给定的最小支持数时,我们就将其与其邻近的区段 进行合并。为了使发现的关联规则更具有趣性,文中采用了大于期望的值(greater-than- expected-value准则。

    [43]认为文[42]中的属性划分方法不能很好地表示数据的分布,尤其是属性值分布不均匀 的时候,于是提出了一个聚类算法,根据数据库中数据的分布情况决定属性值如何划分区段 ,并可将相关的区段进行合并。在此基础上发现的多值关联规则更具有效性和可理解性。

    (6)基于约束的关联规则采掘

    基于约束的关联规则采掘的主要目的是发现更有趣的、更实用的和更特别的关联规则,这方 面的研究主要有[4451]

    [44]研究了在提供布尔表达式约束情况下的关联规则发现问题。这种布尔表达式约束允许 用户指定他所感兴趣的关联规则的集合,这种约束不仅可以用来对事务数据库进行预加工, 而且可以把它集成在采掘算法内部,从而提高算法的执行效率,文中根据这种集成方式的不 同给出了三种不同的算法:MultipleJoinsReorderDirect

    [45]提出并分析了用户所给出的约束的两个对发现算法的剪枝步骤非常重要的属性:反单 调性(anti-monotonicity)和简洁性(succinctness),提出了一个高效的基于约束的关联规 则采掘算法CAP

    另一种类型的基于约束的关联规则采掘方法是元模式制导的关联规则采掘算法[4951]。这 种类型的发现算法首先由用户给定要发现的关联规则的元模式或模板,然后根据这些模板在 数据库中发现与模板相适应的实际存在的关联规则。例如文[50]就是基于这种模式提出了两 个相应的算法:大谓词增长算法(largepredicate-growing)和直接p-谓词测试算法(Direct p-predicatetesting)

    (7)其它方向
      除了以上列举的比较常见的研究方向外,还有其它一些研究方向,如:发现关联规则的语言 [52,53]、采掘长模式和密集数据集[48,54]、采掘相关性和因果关系[55,56]、发现比例 规则[57]、发现周期(cyclic)和日历(calendric)关联规则[58,59]、采掘多维关联规则[59] 等等[60]

    3.5 频集算法的几种优化方法

    虽然Apriori算法自身已经进行了一定的优化,但是在实际的应用中,还是存在不令人满意的地方,于是人们相继提出了一些优化的方法。

    3.4.1 基于划分的方法

    Savasere[14]设计了一个基于划分(partition)的算法,这个算法先把数据库从逻辑上分成几个互不相交的块,每次单独考虑一个分块并对它生成所有的频集,然后把产生的频集合并,用来生成所有可能的频集,最后计算这些项集的支持度。这里分块的大小选择要使得每个分块可以被放入主存,每个阶段只需被扫描一次。而算法的正确性是由每一个可能的频集至少在某一个分块中是频集保证的。上面所讨论的算法是可以高度并行的,可以把每一分块分别分配给某一个处理器生成频集。产生频集的每一个循环结束后,处理器之间进行通信来产生全局的候选k-项集。通常这里的通信过程是算法执行时间的主要瓶颈;而另一方面,每个独立的处理器生成频集的时间也是一个瓶颈。其他的方法还有在多处理器之间共享一个杂凑树来产生频集。更多的关于生成频集的并行化方法可以在中找到。

    3.4.2 基于Hash的方法

    一个高效地产生频集的基于杂凑(hash)的算法由Park等提出来。通过实验我们可以发现寻找频集主要的计算是在生成频繁2-项集Lk上,Park等就是利用了这个性质引入杂凑技术来改进产生频繁2-项集的方法。

    3.4.3 基于采样的方法

    基于前一遍扫描得到的信息,对此仔细地作组合分析,可以得到一个改进的算法,Mannila等先考虑了这一点,他们认为采样是发现规则的一个有效途径。随后又由Toivonen进一步发展了这个思想,先使用从数据库中抽取出来的采样得到一些在整个数据库中可能成立的规则,然后对数据库的剩余部分验证这个结果。Toivonen的算法相当简单并显著地减少了I/O代价,但是一个很大的缺点就是产生的结果不精确,即存在所谓的数据扭曲(data skew)。分布在同一页面上的数据时常是高度相关的,可能不能表示整个数据库中模式的分布,由此而导致的是采样5%的交易数据所花费的代价可能同扫描一遍数据库相近。LinDunham在中讨论了反扭曲(Anti-skew)算法来挖掘关联规则,在那里他们引入的技术使得扫描数据库的次数少于2次,算法使用了一个采样处理来收集有关数据的次数来减少扫描遍数。Brin等提出的算法使用比传统算法少的扫描遍数来发现频集,同时比基于采样的方法使用更少的候选集,这些改进了算法在低层的效率。具体的考虑是,在计算k-项集时,一旦我们认为某个(k+1)-项集可能是频集时,就并行地计算这个(k+1)-项集的支持度,算法需要的总的扫描次数通常少于最大的频集的项数。这里他们也使用了杂凑技术,并提出产生相关规则Correlation Rules)的一个新方法,这是基于他们的工作基础上的。

    3.4.4 减少交易的个数

    减少用于未来扫描的事务集的大小。一个基本的原理就是当一个事务不包含长度为k的大项集,则必然不包含长度为k+1的大项集。从而我们就可以将这些事务移去,这样在下一遍的扫描中就可以要进行扫描的事务集的个数。这个就是AprioriTid的基本思想

    3.4.5 其他的频集挖掘方法

    上面我们介绍的都是基于Apriori的频集方法。即使进行了优化,但是Apriori方法一些固有的缺陷还是无法克服:

    (1)可能产生大量的候选集。当长度为1的频集有10000个的时候,长度为2的候选集个数将会超过10M。还有就是如果要生成一个很长的规则的时候,要产生的中间元素也是巨大量的。

    (2)无法对稀有信息进行分析。由于频集使用了参数minsup,所以就无法对小于minsup的事件进行分析;而如果将minsup设成一个很低的值,那么算法的效率就成了一个很难处理的问题。

    下面将介绍两种方法,分别用于解决以上两个问题。

    [18]中提到了解决问题1的一种方法。采用了一种FP-growth的方法。他们采用了分而治之的策略:在经过了第一次的扫描之后,把数据库中的频集压缩进一棵频繁模式树(FP-tree),同时依然保留其中的关联信息。随后我们再将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关。然后再对这些条件库分别进行挖掘。当原始数据量很大的时候,也可以结合划分的方法,使得一个FP-tree可以放入主存中。实验表明,FP-growth对不同长度的规则都有很好的适应性,同时在效率上较之Apriori算法有巨大的提高。

    第二个问题是基于这个的一个想法:Apriori算法得出的关系都是频繁出现的,但是在实际的应用中,我们可能需要寻找一些高度相关的元素,即使这些元素不是频繁出现的。在Apriori算法中,起决定作用的是支持度,而我们现在将把可信度放在第一位,挖掘一些具有非常高可信度的规则。在[19]中介绍了对于这个问题的一个解决方法。整个算法基本上分成三个步骤:计算特征、生成候选集、过滤候选集。在三个步骤中,关键的地方就是在计算特征时Hash方法的使用。在考虑方法的时候,有几个衡量好坏的指数:时空效率、错误率和遗漏率。基本的方法有两类:Min_Hashing(MH)Locality_Sensitive_Hashing(LSH)Min_Hashing的基本想法是:将一条记录中的头k个为1的字段的位置作为一个Hash函数。Locality_Sentitive_Hashing的基本想法是:将整个数据库用一种基于概率的方法进行分类,使得相似的列在一起的可能性更大,不相似的列在一起的可能性较小。我们再对这两个方法比较一下。MH的遗漏率为零,错误率可以由k严格控制,但是时空效率相对的较差。LSH的遗漏率和错误率是无法同时降低的,但是它的时空效率却相对的好很多。所以应该视具体的情况而定。最后的实验数据也说明这种方法的确能产生一些有用的规则。

    3.4.6 提高效率的几种方法说明

    影响算法效率的因素主要有事务数据库的规模,扫描事务数据库的次数。所生成候选规则的数量.所以提高算法效率的各种算法都是从这三个方面考虑,另外可以使用一些能够并发执行的算法.

    1 减少事务数据库规模的方法首先是减少事务数据库的规模,这里有两种情况:第一,直接对事务数据库的规模消减;第二,在挖掘过程中对数据库的规模进行消减.直接对事务数据库的规模进行消减的算法首先是抽样算法。这在对算法的效率要求高的情况下经常使用,对数据库规模的消减必然造成所挖掘规则质量的损失,但是结果是效率的显著提高.为了减少这种损失,我们可以降低rainsup的取值,这样得到的高频项集会多一些,从而在整个数据库中进行验证,如果不合适,可以进行第二遍的扫描.总之。对数据库的扫描时间要少许多.另一种方法对数据库中某些项进行抽象,提高概念层次,例如不同品牌的商品在不关注其品牌的时候,那么可以认为不同品牌的东西是相同的,这样就可以减少项集的规模,对数据库进行处理,同样可以减少数据库的规模.在挖掘过程中对数据库规模进行消减,对生成的候选项集进行验证的时候,把无用或不相关的事务删掉,这样可以提高扫描的速度.删除可以依据前面给出的定理13.在判断志一候选项集的时候,如果事务的规模小于k,或者事务不包含任何(志一1)一高频项集,则该事务可以从数据库中删除.不会影响挖掘的结果,而减少了数据库的扫描,从而提高了算法的效率.另外在扫描数据库判断某个候选高频项集x 是否为高频项集的时候,如果根据扫描过的事务已经可以判断X,那么对X 的处理就可以完成,这样也可以减少数据库扫描时间,从而提高效率.

    2 减少扫描次数的方法

    第一种方法:首先扫描一遍数据库,找出所有的1一高频项集,在每个高频项集中记录包含该高频项集的事务的Tid,然后根据Tid计算所有的k一高频项集,k>1.关联规则挖掘算法Apriori的一种改进算法AprioriTid就使用了这种思想,只需要对数据库进行一次扫描.

    第二种方法:把数据库划分成”个互不相交的部分,求出每一部分的高频项集,再扫描一次数据库得到高频项集,可以减少对数据库的扫描次数.

    上面两种方法的结合可以产生另外一种方法,只需要对数据库进行两次扫描就可以找到高频项集.分两个阶段:首先,算法把数据库分成n个互不相交的部分.根据rainsup,找出局部项集支持数,可以找出局部高频项集.这个过程使用一种特殊的数据结构,每个项集记录包含该项集的事务记录的Tid.只需要扫描一次数据库就可以找到所有的局部高频走一项集,k=12,⋯.局部高频项集可能是也可能不是全局高频项集,全局高频项集最少会出现在某一个局部高频项集中,所以得到的所有局部高频项集就是候选全局高频项集,进行第二次

    数据库扫描就可以得到所有高频项集.

    3 还有一种动态项集计数方法:把数据库分成很

    多块,每一块都有一个起始点,可以在任何起点加

    人新的候选项集,与划分数据找候选项集的方法有

    些相似.

     

    3.6 多层和多维关联规则的挖掘

    随着数据仓库和OLAP技术研究的深入,可以预见大量的数据将经过整合、预处理,从而存入数据仓库之中。在当前,大多数的数据仓库的应用都是进行统计、建立多维以及OLAP的分析工作。随着数据挖掘研究的深入,已经有了OLAP和数据挖掘相结合的方法[20,21]

    首先一个有效的数据挖掘方法应该可以进行探索性的数据分析。用户往往希望能在数据库中穿行,选择各种相关的数据,在不同的细节层次上进行分析,以各种不同的形式呈现知识。基于OLAP的挖掘就可以提供在不同数据集、不同的细节上的挖掘,可以进行切片、切块、展开、过滤等各种对规则的操作。然后再加上一些可视化的工具,就能大大的提高数据挖掘的灵活性和能力。接着,我们来看一下多层和多维关联规则的定义。

    多层关联规则:对于很多的应用来说,由于数据分布的分散性,所以很难在数据最细节的层次上发现一些强关联规则。当我们引入概念层次后,就可以在较高的层次上进行挖掘。虽然较高层次上得出的规则可能是更普通的信息,但是对于一个用户来说是普通的信息,对于另一个用户却未必如此。所以数据挖掘应该提供这样一种在多个层次上进行挖掘的功能。

    多层关联规则的分类:根据规则中涉及到的层次,多层关联规则可以分为同层关联规则和层间关联规则。

    多层关联规则的挖掘基本上可以沿用“支持度-可信度的框架。不过,在支持度设置的问题上有一些要考虑的东西。

    同层关联规则可以采用两种支持度策略:

    (1)统一的最小支持度。对于不同的层次,都使用同一个最小支持度。这样对于用户和算法实现来说都比较的容易,但是弊端也是显然的。

    (2)递减的最小支持度。每个层次都有不同的最小支持度,较低层次的最小支持度相对较小。同时还可以利用上层挖掘得到的信息进行一些过滤的工作。层间关联规则考虑最小支持度的时候,应该根据较低层次的最小支持度来定。

    以上我们研究的基本上都是同一个字段的值之间的关系,比如用户购买的物品。用多维数据库的语言就是单维或者叫维内的关联规则,这些规则一般都是在交易数据库中挖掘的。但是对于多维数据库而言,还有一类多维的关联规则。例如:年龄(X“20...30”Ù职业(X,“学生  购买(X笔记本电脑”)在这里我们就涉及到三个维上的数据:年龄、职业、购买。根据是否允许同一个维重复出现,可以又细分为维间的关联规则(不允许维重复出现)和混合维关联规则(允许维在规则的左右同时出现)。年龄(X“20...30”Ù购买(X笔记本电脑”)  购买(X打印机”)这个规则就是混合维关联规则。

    在挖掘维间关联规则和混合维关联规则的时候,还要考虑不同的字段种类:种类型和数值型。对于种类型的字段,原先的算法都可以处理。而对于数值型的字段,需要进行一定的处理之后才可以进行。处理数值型字段的方法基本上有以下几种:

    (1)数值字段被分成一些预定义的层次结构。这些区间都是由用户预先定义的。得出的规则也叫做静态数量关联规则。

    (2)数值字段根据数据的分布分成了一些布尔字段。每个布尔字段都表示一个数值字段的区间,落在其中则为1,反之为0。这种分法是动态的。得出的规则叫布尔数量关联规则。

    (3)数值字段被分成一些能体现它含义的区间。它考虑了数据之间的距离的因素。得出的规则叫基于距离的关联规则。

    (4)直接用数值字段中的原始数据进行分析。使用一些统计的方法对数值字段的值进行分析,并且结合多层关联规则的概念,在多个层次之间进行比较从而得出一些有用的规则。得出的规则叫多层数量关联规则。

    OLAP中挖掘多层、多维的关联规则是一个很自然的过程。因为OLAP本身的基础就是一个多层多维分析的工具,只是在没有使用数据挖掘技术之前,OLAP只能做一些简单的统计,而不能发现其中一些深层次的有关系的规则。当我们将OLAPDataMining技术结合在一起就形成了一个新的体系OLAMOn-Line Analytical Mining[20]

    3.7 关联规则价值衡量的方法

    当我们用数据挖掘的算法得出了一些结果之后,数据挖掘系统如何知道哪些规则对于用户来说是有用的、有价值的?这里有两个层面:用户主观的层面和系统客观的层面。

    3.6.1 系统客观层面

    很多的算法都使用“支持度-可信度的框架。这样的结构有时会产生一些错误的结果。看如下的一个例子:假设一个提供早餐的零售商调查了4000名学生在早晨进行什么运动,得到的结果是2200名学生打篮球,2750名学生晨跑,1800名学生打篮球、晨跑。那么如果设minsup40%minconf60%,我们可以得到如下的关联规则:打篮球Þ晨跑(1)这条规则其实是错误的,因为晨跑的学生的比例是68%,甚至大于60%。然而打篮球和晨跑可能是否定关联的,即当我们考虑如下的关联时:打篮球Þ(不)晨跑 2)虽然这条规则的支持度和可信度都比那条蕴涵正向关联的规则(1)低,但是它更精确。 然而,如果我们把支持度和可信度设得足够低,那么我们将得到两条矛盾的规则。但另一方面,如果我们把那些参数设得足够高,我们只能得到不精确的规则。总之,没有一对支持度和可信度的组合可以产生完全正确的关联。

    于是人们引入了兴趣度,用来修剪无趣的规则,即避免生成“错觉”的关联规则。一般一条规则的兴趣度是在基于统计独立性假设下真正的强度与期望的强度之比,然而在许多应用中已发现,只要人们仍把支持度作为最初的项集产生的主要决定因素,那么要么把支持度设得足够低以使得不丢失任何有意义的规则,或者冒丢失一些重要规则的风险;对前一种情形计算效率是个问题,而后一种情形则有可能丢失从用户观点来看是有意义的规则的问题。

    [12]中作者给出了感兴趣的规则的定义(R-interesting),在[13]中他们又对此作了改进。在[10]中把事件依赖性的统计定义扩展到兴趣度的定义上来;[15]定义了否定关联规则的兴趣度。

    除了把兴趣度作为修剪无价值规则的工具,现在已有许多其他的工作来重新认识项集,如Brin[3]考虑的相关规则。在[4]中讨论了蕴涵规则(implication rule),规则的蕴涵强度在[0,¥]之间变化,其中蕴涵强度为1表示完全无关的规则,¥表示完备的规则,如果蕴涵强度大于1则表示更大的期望存在性。

    另一个度量值——“收集强度”(collective strength)[22]中被定义,他们设想使用大于期望值来发现有意义的关联规则。项集的收集强度[0,¥]之间的一个数值,其中0表示完备的否定相关性,而值¥表示完备的正相关性。详细的讨论可以在[10]中找到。

    3.6.2 用户主观层面

    上面的讨论只是基于系统方面的考虑,但是一个规则的有用与否最终取决于用户的感觉。只有用户可以决定规则的有效性、可行性。所以我们应该将用户的需求和系统更加紧密的结合起来。

    可以采用一种基于约束(consraint-based)[21]的挖掘。具体约束的内容可以有:

    (1)数据约束。用户可以指定对哪些数据进行挖掘,而不一定是全部的数据。

    (2)指定挖掘的维和层次。用户可以指定对数据哪些维以及这些维上的哪些层次进行挖掘。

    (3)规则约束。可以指定哪些类型的规则是我们所需要的。引入一个模板(template)的概念,用户使用它来确定哪些规则是令人感兴趣的而哪些则不然:如果一条规则匹配一个包含的模板(inclusive template),则是令人感兴趣的,然而如果一条规则匹配一个限制的模板(rextrictive template),则被认为是缺乏兴趣的。

    其中有些条件可以和算法紧密的结合,从而即提高了效率,又使挖掘的目的更加的明确化了。其他的方法还有:Kleinberg等人的工作是希望建立一套理论来判断所得模式的价值,他们认为这个问题仅能在微观经济学框架里被解决,他们的模型提出了一个可以发展的方向。他们引入并研究了一个新的优化问题——分段(Segmentation)问题,这个框架包含了一些标准的组合分类问题。这个模型根据基本的目标函数,对被挖掘的数据的价值提供一个特殊的算法的视角,显示了从这方面导出的具体的优化问题的广泛的应用领域。

    [5]Korn等就利用猜测误差(这里他们使用均方根来定义)来作为一些从给定的数据集所发现的规则的好处”(goodness)的度量,他们所定义的比例规则就是如下的规则:顾客大多数分别花费 1 : 2 : 5的钱在面包”:“牛奶”:“奶油上通过确定未知的(等价的,被隐藏的,丢失的)值,比例规则可以用来作决策支持。如果数据点线性地相关的话,那么比例规则能达到更紧凑的描述,即关联规则更好地描述了相关性。

    3.8 选择规则的方法

    规则的选取主要根据规则的重要性,可从主观和客观两个方面来进行度量,从而产生不同的选择方法.主观方法又可分为定性方法和定量方法.

    第一种方法:通过规则的可视化Ll ].属于主观定性方法,也是研究较多的方法.挖掘过程是自动进行的,挖掘结束应该把对结果进行处理,根据需要选择感兴趣的规则,删除不感兴趣的规则,从而达到选择感兴趣规则的目的.但是这种方法在挖掘过程中生成很多用户所不感兴趣的规则,对算法的效率有一定的影响.同时如果生成规则的数量过大,通过人工的方法不能够选择的话,用户可以把自己对于规则的一些经验知识输人给系统,系统根据用户的需求进行规则的选择,最后把结果显示给用户.

    第二种方法:通过规则模板可以选择感兴趣的规则.也是一种主观定性的方法.用户可以使用背景知识来指定所要挖掘的规则形式和不希望得到的规则形式.模板可以分为两类:含概模板与限定模板,前者用来描述用户所希望得到的规则形式,后者用来描述不希望得到的规则形式.使用规则模板可以减少挖掘过程中产生规则的数量,同时由于在挖掘过程中生成的规则数量少,减少了挖掘时间,提高了挖掘效率,也可以认为是一种提高效率的方法.

    第三种方法:根据对规则的关注程度来选择,把规则的重要性进行量化.对规则的重要性的量化描述可以有主观和客观两种.一般文献中对于客观关注程度的描述较多,而对于规则重要性的主观量化描述较少.在文献[2]中,作者给出了一种度量主观关注程度的方法,应用在挖掘中取得了好的效果.在挖掘过程中使用主观关注程度来减少无用规则的选择,仅仅使用客观关注程度有时候不能反映规则的重要程度,因为属性之间的重要性不会完全一样,对于不同的挖掘任务,各种属性的作用不会相同,需要用户指定属性的重要程度,在挖

    掘的过程中可以减少生成的规则的数量,同时提高算法的效率.

    第四种方法:利用对规则的客观关注程度.目前对规则的关注程度的研究主要是对规则的客观关注程度的研究.对于规则A B,主要使用支持度和置信度来描述,Agrawal提出了置信度P(BA)PiatesketShapiro提出了事件独立性P(AB)P(A)P(B)Symth提出了JMeasure函数等.Toivonen提出了根据规则的后件,对挖掘出的关联规则集合进行分组,选取分组的覆盖集合(cover rules)作为所关注的规则.

    第五种方法:通过设置足够大的支持度和置信度,例如Rinteresting方法,可以避免大量规则集.但是由于选择过大的支持度和置信度,可能会造成重要信息的丢失.HoschkaKlosgen通过属性及属性集部分排序来避免产生几种类型的冗余知识,如层次项目造成的冗余.第六种方法,通过计算规则之间的相关性消除冗余规则,例如生成规则{Milk} {BreadButter}{Milk}(Bread),后者就是冗余规则,因为前者已经包含了后者.可以通过考察规则之间的关系,对规则进行选择,消除冗余规则.还可以通过设置生成的规则的数量来直接限制生成的规则,从而实现间接选择规则.可以利用以往的挖掘结果作为当前挖掘的先验知识确定客观关注程度,从而达到选择规则的目的[21]

     

    3.9 小结

    本章主要介绍关联规则的内容及基本概念和基本算法,还有评价关联规则的方法。由于关于关联规则研究方向的文章比较多,已经没有太多的可以研究的空间。要取得突破,就必须有新的发现,最近负关联被提出来,而关于此研究的文章则不是太多,有一定的空间。

    第四章  正负关联规则研究

    4.1 概述

    很多的算法都使用“支持度-可信度”的框架。这样的结构有时会产生一些错误的结果。看如下表的一个例子。支持度与可信度的:

            买咖啡   不买咖啡  合计

    买牛奶       20       5        25

    不买牛奶     70       5        75

    合计         90       l0       l00

    由表可以了解到,如果设定最小支持度和最小可信度分别为0206,按照Agrawal的定义得到关联规则“买牛奶= 买咖啡(s=0.2c=0.8)” ,即80%的人买了牛奶就会买咖啡。但同时也可以得到“90%的人肯定会买咖啡”。换句话说,买牛奶这个事件对于买咖啡这个事件的刺激作用(80)并没有想象中的(90)那么大。反而是规则“买咖啡->买牛奶(s=0.7c=0.78)” 更具有实际的指导意义。

    4.2 研究现状

    (1)基于Apriori框架的算法往往效率不够高,但伸缩性好。基于FP-growth框架的算法效率高,伸缩性却不好。如何能结合这两者的长处是一个吸引人而又极富挑战性的问题。

    (2)数据挖掘既然是处理海量的数据,些许的误差应该是可以接受的。能不能找到能允许在一定的误差范围内但大大加速挖掘的算法是一个已经有人在研究但还远未完善的方向。

    (3)关联规则所挖掘的数据经常包含着用户隐密的信息。怎样在挖掘过程中保护用户的隐私从而让用户更愿提供真实数据是极有价值的研究问题。

    (4)基于最大频繁项日集的关联规则挖掘算法和基于精简集的挖掘算法能否结合,使两者的长处同时发挥作用,这是我正在继续研究的问题。

    (5)更好的关联规则的兴趣度量标准是一个老问题,但远未解决,值得探讨。

    (6)如何对事务数据库建立某种索引来加速挖掘应该是一种可行而又高效的力法,是一个重要的研究方向。

    (7)如何建立对数据集的特征描述的指标,从而有针对性地对不同特征的数据集选用不同的算法是一个很好而又很难的问题。

    4.3 关联规则具体研究

    4.3.1 关联规则挖掘的矩阵算法

        本算法通过构建新的矩阵结构来改进算法,对在其中出现的标为1,未出现的标为0,同时添加行和、列和。通过此减少了对数据库的少描次数。同时通过行和减少对高频集的较快挖掘发现,提高了效率。假设有如下的交易数据,具体应用如下:

    则具体过程如下:

    时间复杂度的定性分析:矩阵算法跨越了由低次到高次逐步杏找频繁子集的限制,在不知道低次k1频繁项的前提下同样可以直接计算k项集,而且k越大,搜索的记录范围越小,冈此效率越高,相反,低次频繁子集的查找速度相对高次而言相对较慢。因此矩阵算法相对而言适合k较大时的情况。

    空间复杂度的定性分析:由于存储的是0I这种布尔数据(以位方式存储即可),因而在样本记录集较大时通常会占用更少的空间[13]

    4.3.2 基于相关系数的正、负关联规则

    相关系数是两个随机变量间线性相关程度的一个度量。设 XY为两个变量,相关系数定义为:

     

    其中,cov(X Y)为变量 XY的协方差,D(X)D(Y)为变量X Y的标准差。|ρx.y|1,如果ρx.y =O则变量 XY不相关;如果ρx.y =+1,则变量 XY充分正相关;同样如果ρx.y =1,则变量X Y充分负相关[14]

    4.3.3 项集的相关性判断正负关联规则

    有人提出项集A B关联规则的相关性]可由式:

     

    corrAB , 有三种可能的情况:如果corrAB>1,那么 AB正相关;如果corrAB=1,那么 AB相互独立;如果corrAB<1,那么 AB负相关.容易证明项集 AB4种形式关联规则的相关性之间存在这样的关系:如果corrAB>1,则有corrAB < 1corrAB <1corrAB> 1;反之亦反之.因此在挖掘正、负关联规则时只要对项集的相关性进行判断就可以避免矛盾规则的出现,即当corrAB> 1时仅挖掘规则A BA B;当corrAB <1时仅挖掘规则A BA B;当corrAB=1时不挖掘规则[19]

     

    4.3.4 正、负关联规则间的置信度关系研究

    当同时研究项集AB间的正、负关联规则(A B A B A B A B)时,置信度的设置问题变得非常重要。当AB的支持度变化时,四种关联规则的置信度如何变化,它们之间有着怎样的联系,对此进行了详细讨论,结论对置信度的设置有重要价值

    为了讨论的方便,设s(A)s(B)很小时取值01,很大时取值09,下面按四种情况分别讨论。

    (1)s(A)s(B)都很小

    conf(A B)的值域是[01]

    conf(A B)的值域是[01]

    conf(A B)的值域是[001 1]

    conf(A B)的值域是[0891]

    (2)s(A)s(B)都很大

    conf(A B)的值域是[0891]

    conf(A B)的值域是[0011]

    conf(A B)的值域是[01]

    conf(A B)的值域是[01]

    (3)s(A)很小,s(B)很大

    conf(A B)的值域是[01]

    conf(A B)的值域是[01]

    conf(A B)的值域是[0891]

    conf(A B)的值域是[0011]

    (4)s(A)很大,s(B)很小

    conf(A B)的值域是[0011]

    conf(A B)的值域是[0891]

    conf(A B)的值域是[01]

    conf(A B)的值域是[01]

    总上所述,当同时研究正、负关联规则后,置信度的设置问题变得非常重要,它直接影响到结果中关联规则的数量,进而影响到用户选择所需规则的难易程度,单一的置信度约束已经不符合要求,而应根据实际应用为四种形式关联规则分别设定置信度;同时,四种形式关联规则的置信度之间存在着制约关系,在为其设定置信度时应综合考虑[15]

    4.3.5 挖掘正负关联规则

      本文除了支持度-可信度外添加了相关系数来挖掘同时对其数据进行了如下编码[16]

    4.3.6 布尔加权关联规则的几种开采算法及比较

    关联规则挖掘在许多领域已有广泛的应用,目前存在许多发现关联规则的算法。这些算法都认为每个项目对规则的重要性相同。但在实际应用中,用户会比较看重一些项目,因此,为了加强这些项目对规则的影响,提出了一些加权关联规则的算法,介绍了几种存在的算法,并对它们进行了分析比较。

    4.3.6 关联规则的增量式更新

    在关联规则挖掘的实际应用中存在着如下情况:

    (1)数据库或数据仓库是随时间而不断变化的,因而存在于其中的关联规则也是随之变化的,这就要求人们能够适时地更新已发现的关联规则。

    (2)用户在一个固定的数据库或数据仓库中挖掘关联规则时,为了得到真正令其感兴趣的关联规则,必然会不断调整最小支持度与最小置信度,此时同样需要对关联规则进行更新。

    把以上两种情况归纳为三个关联规则增量更新的主要问题:

    (1)在给定的最小支持度和最小置信度下,当一个新的数据集db添加到旧的数据库DB中时,如何生成dbDB中的关联规则。

    (2)在给定的最小支持度和最小置信度下,当一个数据集db从旧的数据库DB中删除时,如何生成DBdb中的关联规则。

    (3)给定数据库DB,在最小支持度和最小置信度发生变化时,如何生成数据库DB中的关联规则。所有的关联规则更新问题都可以归结为以上三种情况或它们的组合[24]

    DWCheung等人首先考虑了关联规则的高效更新同题.他们考虑的同题是给定交易数据库DB,候定最小支持度不变,当一个新的交易数据集db添加到DB中去时,如何生成DBdb中的关联规则.他们提出了增量式更新算法FUPFUP的基本框架和Apriori是一致的[22]

    4.3.6.1 FUP算法

    算法FUP的基本思想为:对任意一个k(k1)项集,若其DB和如中都是频繁项集,则其在dbDB中同样是频繁项集;若其在DBdb中都是非频繁项集,则其在dbDB同样是非频繁项集;若其仅在DB(db)中是频繁项集,则其支持数应该加上db(DB)中的支持数以决定它在db DB是否为频繁项集。算法FUP假设在DB中发现的频繁项集 (nL中最大元素的元素个数)已被保存下来。它需要对DBdb进行n次扫描,在第一次扫描时,FUP算法首先扫描db,将L1的元素仍为dbDB 中的频繁项集的元素记入L1 ,并生成候选频繁l项集C1C1中的元素为db中的频繁1项集减去L1然后扫描DB以决定C1中的元素是否为dbDB中的频繁项集,并将是dbDB中频繁项集的元素记入L1中。在第k(k>1)次扫描前,先对Lk-1AprioriGen函数生成候选频繁k项集Ck,并除去Lk中的元素,即Ck=Ck - Lk,对Lk进行剪枝,即对于XL ,若存在Y XYLk-1 - L k-1 ,则X肯定不是dbDB的频繁项集,应将其在Lk中删除;然后扫描db,将Lk中的元素仍为dbDB中的频繁项集的元素记入Lk ,记录候选频繁k项集Ck中的元素在db中的支持数;最后扫描DB,记录Ck中的元素在dbDB中的支持数,扫描结束时,将Ck中是dbDB中的频繁项集的元素记入Lk 中。算法在LkCk均为空时结束。

    4.3.6.2 改进算法EFUP

    这里首先声明算法中需要用到的符号定义。│X│表示对象的大小,若X为项集,则表示项集中的元素个数;若X为数据库,则表示数据库中记录的数目。DB为旧的数据库,db为新添加的数据库,D d分别代表新旧数据库中记录数目。nDB中最大的频繁项集的元素个数。 (1in)表示DB中的频繁i项集的集合。 表示DB 中所有频繁项集的集合。mdb中最大的频繁项集的元素个数。 表示db中的频繁i项集的集合。 (1≤ ≤m)表示db中的候选频繁i集的集合。 表示db中所有频繁项集的集合。PdbDB中最大的频繁项集的元素个数。 表示dbDB中的频繁项集的集合。 表示dbDB所有频繁项集的集合。X.sup表示项集的支持数。min_supmin_conf分别代表最小支持度和最小置信度。

    db添加到DB时,会发生以下两种情况:

    (1)一些DB 中的频繁项集变为dbDB中的非频繁项集;

    (2)一些DB中的非频繁项集变为dbDB中的频繁项集。

    根据频繁项集的定义,可以知道:

    (1)对任意一个项集XLX不是dbDB中的频繁项集(X L’),当且仅当 在dbDB中的支持数小于(D+d)×min_sup

    (2)对任意一个项集X L,若X L ,则Xdb中的支持数必然大于等于d×min_sup

    (3)对任意一个项集XL,若X L ,则对任意项集Y X,YL,必有Y L

    EFUP算法要求可以得到前一次对DB挖掘的结果(即频繁项集和其中元素的支持数)。由以上分析可知:

    (1)要验证,J中的项集 是否为dbDB中的频繁项集,只需知道Xdb中的支持数。

    (2)db添加到DB后新产生的频繁项集LN(LN LL,但LN L’)的候选频繁项集为db中的频繁项集Ldb

    所以可以对db采用类似于Apriori的算法,一方面验证L中的元素是否为dbDB中的频繁项集,另一方面生成其中的频繁项集Ldb,然后对DB进行一次扫描,验证Ldb中的元素是否为dbDB中的频繁项集。

    4.3.7 并行化的分组关联规则算法

    分组的构造以及分组后因连接步和剪枝步的简化而达到的效率的提高

    (1) Apriol i中的频繁一项目集记为L,改进算法将原来的频繁项L集进行分组,组数可以为大于2的数。

    (2) Apriori算法的剪枝思想:对候选k项目集,生成它的所有k-1项子集,判断是否是频繁项目集,每次判断都必须扫描频繁kl项目集的元素。分组后可以改进判断时所需扫描的频繁k-l项目集元索的数目[25]

    划分方法的数据挖掘:

    通过划分方法进行数据挖掘的过程如下所示,系统的总体设计包含三部分:

    (1) 在服务器端第一次扫描超市事务数据库中的表,按照超市事务数据库中不同项集的数量,以及兼顾客户端计算机硬件配置,对其进行数据分块,分块的大小选择要使得每个分块可以被放入主存。

    (2) 在各个客户端计算机上,利用并行技术分别访问服务器上的数据分块,求出各数据分块所对应的局部频繁项集,并将所求局部频繁项集存入服务器的一个指定表中。

    (3) 在服务器端,汇总各个分块数据生成的局部频繁项集,第二次扫描超市事务数据库中的总表,最终生成全局频繁项集。

    4.3.8 分布式的数据挖掘

    1 方案一

    为了找出所有全局频繁项目集,需要经过两个步骤来完成。过程如下:

    (1)全局频繁1项集可以通过扫描各局部数据库,并在各局部站点之间交换支持数得到。

    (2)挖掘全局频繁k项集(k>1)时,分为以下几个步骤:①采用Apnon_gen算法基于局部数据库产生局部频繁k项集。②求各局部频繁k项集的超集,并把它作为全局频繁k项集的候选数据集。③采用Hash技术。将某个候选数据集映射到某个唯一的站点,在该站点对其他各站点发送轮询请求,收集并计算该候选数据集的全局支持合计数,根据用户给定的最小支持度最终确定该候选数据集是否是全局大的。④将在某个站点得到的全局频繁k项集及其全局支持合计数向其他所有站点进行广播。⑤ 各个局部站点根据各自的局部数据库对全局频繁k项集的支持来确定是否进行下一重挖掘。

    其体系结构如下图所示。

    方案中由于采用了Hash技术,使各个站点之间的通信量得到了优化,平衡了各个局部站点的通信负荷。但因为采用了局部一局部的通信模式,为了统计某个候选数据集的全局支持合计数,每个站点都要向其他所有站点发送轮询请求。虽然每个站点的通信负荷比较均衡,但每个站点的通信量都较大,从而导致整体网络通信开销较大。为了进一步减少站点间的通信量,节约网络通信开销,提出了方案二。

    2 方案二

    方案二与方案一的不同之处在于引入了全局知识库的存储结构,并采用了局部一全局的通信模式。各个局部站点基于各个局部数据库产生局部频繁项目集,全局站点负责求出各局部频繁项目集的超集,统计其中每个项目的全局支持合计数,并最终确定全局频繁项目集。最后根据求出的全局频繁项目集和用户给定的最小可信度得出基于全局数据库的关联规则,并把它存储到全局知识库中。具体实现步骤如下:

    (1)全局频繁1项集可以通过扫描各局部数据库,并在各局部场地之间交换支持数得到。

    (2)挖掘全局频繁k项集(k>1)时,可分为以下步骤:①在各局部站点采用Apfiofigen算法基于各局部数据库产生局部频繁项目集;②各局部站点向全局站点发送各自的局部频繁项目集及其支持数;③全局站点将各局部站点发送的频繁项目集进行合并,得到全局频繁项目集的候选数据集;④全局站点将得到的候选数据集广播到各个局部站点,在各个局部站点确定本地的新增项目集(在候选数据集中但不在本地频繁项目集中的项目集)及其局部支持数;⑤ 各局部站点向全局站点发送各自的新增项目集及其局部支持数,并在全局站点进行相应的累加,求出全局频繁项目集的候选数据集中各个项目集的全局支持合计数。⑥ 全局站点根据用户给定的最小支持度筛选出全局频繁项目集。根据在全局站点求得的全局频繁项目集和用户给定的最小可信度,生成全局关联规则,并把它保存到全局知识库中,从而完成关联规则的整个挖掘过程。其体系结构如下图所示。

     

    3 两种方案的比较

    两种方案的相似之处在于两者均采用Apriorigen算法生成局部频繁项目集,并且都把各局部频繁项目集的超集作为求全局频繁项目集的候选数据集;两者的不同之处在于计算候选全局频繁项目集的全局支持合计数的方法和实现过程不同:①方案一是通过引入Hash技术,将各候选数据集映射到某个唯的场地,并在该场地向其他所有场地发送轮询请求,从其他所有场地回传该数据集的各局部支持数,在该场地进行相应的累加,从而求出该项目集的全局支持合计数的;②方案二是各局部站点首先向全局站点发送各自的局部频繁项目集及其局部支持数,然后在全局站点进行合并求出其超集,并向各局部站点进行广播,确定各局部站点的新增数据集,各局部站点向全局站点发送各自的新增项目集及其局部支持数,在全局站点进行累加,从而确定其全局支持合计数。两种方案的另一个不同之处在于两者的通信模式不同。方案一采用的是局部一局部的通信模式,在求局部频繁项目集时各局部站点可以是并行的、异步的,而在求候选项目集的全局支持合计数时则要求各站点同步。方案二采用的是局部一全局的通信模式,各个局部站点负责求出本地的频繁项目集,并与全局站点进行通信,实现了各局部站点的完全异步的通信模式。

    方案二中由于采用了局部一全局的通信模式,大大减少了各个局部站点的通信量,比方案一)具有更少的网络通信开销和更高的灵活性,但由于全局站点在关联规则挖掘的整个过程中具有核心地位,因而它对全局站点的安全、可靠和运行速度等性能要求较高[26]

    4.6 研究方向的理论意义和实用价值

    关联规则是发现交易数据库中不同商品(项)之间的联系,这些规则找出顾客购买行为模式,如购买了某一商品对购买其他商品的影响。发现这样的规则可以应用于商品货架设计、货存安排以及根据购买模式对用户进行分类。

    4.7 小结

    通过对上面的学习,认为可以对矩阵算法进一步优化,可以和负关联规则联系起来,添加非出现项,同样进行编码。用1表示出现,0没有。用编码进行压缩,比如0101100088代替。在计算时,也可以用与位的方法观看是那些位出现了。同样的数值代表了相同的频繁集。最后比较数值就可以。可以同时挖掘正负关联规则。可以与下面的矩阵的可视化结合。

    由于实际中有大量的数据,是否可以用稀疏矩阵来存贮的问题。也值得探究。同时也可以用来扩充到多维数据中。用另外的维表示权值等。

    第五章  可视化研究

    5.1 概述

    信息可视化和数据挖掘是两个可互为补充利用的相关研究领域。当信息可视化作为数据挖掘的技术之一时,同其它技术相比,它有一个独特之处:能极大地发挥用户的主动参预性。由于对数据进行了可视化,用户愿意进行探索(Explore),在探索过程中有可能发现意外的知识。

    5.2 研究现状

    (1)基于表的可视化技术:该方法的基本思想就是用表结构文字化描述关联规则。表中的每一行描述一条关联规则,每一列分别描述关联规则中的参数,包括规则的前项、后项、支持度和置信度。此方法的优点是能够利用表的基本操作,对感兴趣的列(如支持度)进行排序,或者过滤出前项和后项中包含特定项目的规则。但它存在的缺点是十分类似于关联规则原始的文字描述形式,不能利用图形和图像的表达能力以及人对于色彩和形状敏锐的感知能力,不利于用户方便深入地对结果进行观察和分析。

    (2)基于二维矩阵的可视化技术:该方法的基本思想是用个二维矩阵的行和列分别表示规则的前项和后项,并在对应的矩阵单元画图,可以是柱状图或条形图等,。不同的图形元素(如颜色或高度)可以用来描述关联规则的不同参数,如规则的支持度和置信度。二维矩阵法的优点是易于可视化一对一布尔关系的关联。

    (3)基于有向图的可视化技术:有向图法是另一种流行的关联规则可视化技术J。其基本思想是有向图中的结点代表项目,有向图中连接两个结点的边代表项目问的关联。当只需显示少量项目(结点)和少量关联规则(),此方法非常有效。但当项目数和关联规则数量增多时,有向图很快变得十分紊乱。此外,有向图法不能清楚地标注支持度和置信度等关联规则参数值。

    5.3 研究方向的理论意义和实用价值

      更有直观性。

    5.4 可视化具体研究

    5.4.1 矩阵表示

    矩阵的行代表项,列代表项的关联。每列中不同颜色的块分别代表规则的先行项和结果项,项的名称被标注在矩阵的右侧。规则的支持度和信任度用相应的条状图以不同的比例显示在阵列的末端[17]

    5.4.2 规则多边形

    前面所介绍的方法都是针对一维关联规则的,不能或者不能高效地显示多维关联规则。一种新的可视化技术— —规则多边形表示法非常适用于多维关联规则挖掘结果的显示。例如有以下多维关联规则:age(30-40)income(40K~50K)A ccupation(businessman)= buy(laptop)用规则多边形表示法可视化,所示。该方法可以清楚地表示关联规则的各个维,从图中用户能够简单直观地获知从特定条件最终会得到哪种后续结果。然而,规则多边形表示法当在需要同时显示多条多维关联规则时,效果会明显降低。此外支持度、信任度等元数据的标注也不太方便[17]

     

    5.4.3 平行坐标系

    用一系列等间隔的水平轴分别表示关联规则中出现的所有不同的项目,而每一条连接相应水平轴的垂直线段则表示一条关联规则。此外,利用图形和色彩信息清晰地描述规则的前项和后项,以及支持度和置信度的取值。图中,用原点表示前件,方形表示后件[18]

     

     

    5.5 小结

      通过挖掘,将其结果可视化。

    参考资料:

    [1] 陈京民编著.数据仓库原理、设计与应用.中国水利水电出版社,2004,1

    [2] 数据挖掘实践 ()Olivia Parr Rud.朱扬勇等译

    [3] 数据仓库与数据挖掘技术 夏火松主编.70-71,

    [4] 数据挖掘教程 ()Richard JRoiger()Michael WGeatz.翁敬农译。 4

    [5] 数据仓库及其在电信领域中的应用 段云峰等编著. 39,47,56

    [6] SQL Server 2000数据仓库应用与开发 罗运模等编著

    [7] 数据仓库技术指南 ()Lou Agosta.潇湘工作室译 258

    [8] http://www.pku-ht.com/

    [9] http://www.stcsm.gov.cn/learning/lesson/xinxi/20021125/lesson.Asp

    [10] 蔡伟杰 张晓辉 朱建秋 朱扬勇. 关联规则挖掘综述 2004

    [11] 边有兵 孙张亚. 一种改进的关联规则快速算法及其应用

    [12] http://www.cs.ust.hk

    [13] 曾万聃 周绪波 戴勃 常桂然 李春平. 关联规则挖掘的矩阵算法 计算机工程 20061, 45-47

    [14] 张倩王治和 张国治 基于相关系数的正、负关联规则挖掘算法 陕西理工学报 200512 3538

    [15] 董祥军 陈建斌 崔林 宋瀚涛 陆玉昌. 正、负关联规则间的置信度关系研究 计算机应用及研究 2005 第七期 34

    [16] Maria-Luiza Antonie Osmar R. Za¨ıane. Mining Positive and Negative Association Rules. Department of Computing Science, University of Alberta Edmonton, Alberta, Canada

    [17] 郎璟 王保保. 关联规则挖掘结果的可视化技术研究 电子科技2004年第10

    [18] 吉根林 韦索云 曲维光. 基于平行坐标的关联规则可视化新技术 计算机工程 200512月第24

    [19] Brin SMotwani RSilverstein CBeyond marketGeneralizing association rules to correlations[A]Processing of the ACM SIGM OD Conference 1 997[C]New YorkACM Press19972652

    [20] Agrawal Data Mining association rules between sets of items in large databasesInProceedings of ACM SIGMOD Conference on Management of DataWashingtonDC May 1993207216

    [21] 潘立武 王保保 李绪成 零售业销售数据关联规则挖掘算法关键思想研究 信阳师范学院学报(自然科学版) l6卷第120031 90-92

    [22] Cheung D W et atMaintenance of discovered association rules in large databasesan incremental updating technique InProceed of the 12th International Conference on Data EngineeringNew Orleans Louisana1999106~ 114

    [23] 肖劲橙,林子禹,毛超 关联规则在零售商业的应用 计算机工程 20042 301-306

    [24] 李宝东 宋瀚涛 关联规则增量更新算法研究 计算机工程与应用 2002 23 6-8

    [25] 张伟,郑涛,李辉 种并行化的分组关联规则算法计算机工程 200411 84-86

    [26] 李逸波 于吉红 白晓明 合理选择数据挖掘工具 计算机与信息技术 2005-08

    [27] 邹丽 孙辉 李浩 分布式系统下挖掘关联规则的两种方案 计算机应用研究 2006年第一期 77-78

    [28] R. Agrawal, et al. Mining association rules between sets of items in large databases. Proc. ACM SIGMOD int'l conf. management of data, Washington, DC, May 1993, 207216

    [29] R. Agrawal, R. Srikant. Fast algorithms for mining association rules. Proc. 20th int'l conf. very large databases, Santiago, Chile, Sept. 1994, 487499

    [30] J. S. Park, et al. Using a hash-based method with transaction trimming for mining association rules. IEEE Transactions on knowledge and data engineering, 1997, 9(5), 813825

    [31] A. Savasere, E. Omiecinski and S. Navathe. An efficient algorithm for mining association rules. Proceedings of the 21st international conference on very large databases, Zurich, Switzerland, Sept. 1995, 432444

    [32] Hannu Toivonen. Sampling large databases for association rules. Proceedings of the 22nd international conference on very large databases, Bombay, India, 1996, 134145

    [33] D. W. Cheung, et al. Maintenance of discovered association rules in large databases: an incremental updating technique. In: Proceedings of the 12th international conference on data engineering, New Orleans Louisiana, 1995, 106114

    [34] 冯玉才, 冯剑林. 关联规则的增量式更新算法. 软件学报, 1998, 9(4),301306

    [35] R. Agrawal, et al. Parallel mining of association rules. IEEE Transactions on knowledge and data engineering, 1996, 8(6), 962969

    [36] J. S. Park, et al. Efficient parallel data mining for association rules. Proc. Fourth int'l conf. information and Knowledge management, Baltimore, Nov. 1995

    [37] D. W. Cheung, et al. efficient mining of association rules in distributed databases. IEEE Transactions on knowledge and data engineering, 1996, 8(6), 910921

    [38] D. W. Cheung, et al. A fast distributed algorithm for mining association rules. Proc. of 1996 Int'l Conf. on Parallel and Distributed Information Systems (PDIS'96), Miami Beach, Florida, USA, Dec. 1996

    [39] J. Han, Y. Fu. Discovery of multiple-level association rules from large databases. Proc. of the 21st international conference on very large databases, Zurich, Switzerland, Sept. 1995, 420431

    [40] R. Srikant, R. Agrawal. Mining generalized association rules. In: Proceedings of the 21st international conference on very large databases, Zurich, Switzerland, Sept. 1995, 407419

    [41] G. Piatetsky-Shapiro. Discovery, Analysis, and Presentation of strong rules. In: G. Piatetsky Shapiro and W. J. Frawley eds. Knowledge discovery in database. AAAI/MIT Press. 1991, 229248

    [42] R. Srikant, R. Agrawal. Mining quantitative association rules in large relational tables. In: Proc. 1996 ACM SIGMOD int'l Conf. Management Data, Montreal, Canada, 1996, 112

    [43] 张朝晖, 陆玉昌, 张 钹. 发掘多值属性的关联规则. 软件学报, 1998, 9(11), 801805

    [44] R. Srikant, R. Agrawal. Mining association rules with item constrains. Proc. of the 3rd Int'l Conference on Knowledge Discovery in Databases and Data Mining, Newport Beach, California, August 1997, 6773

    [45] R. Ng, L. V. S. Lakshmanan, J. Han and A. Pang, Exploratory Mining and Pruning Optimizations of Constrained Associations Rules, Proc. of 1998 ACM-SIGMOD Conf. on Management of Data, Seattle, Washington, June 1998, 1324

    [46] L. V. S. Lakshmanan, R. Ng, J. Han and A. Pang, Optimization of Constrained Frequent Set Queries with 2-Variable Constraints, Proc. 1999 ACM-SIGMOD Conf. on Management of Data, Philadelphia, PA, June 1999

    [47] R. Ng, L. V. S. Lakshmanan, J. Han and T. Mah, Exploratory Mining via Constrained Frequent Set Queries, Proc. 1999 ACM-SIGMOD Conf. on Management of Data, Philadelphia, PA, June 1999
    [48] R. J. Bayardo Jr., R. Agrawal, and D. Gunopulos. Constraint-Based Rule Mining in Large, Dense Databases. In Proc. of the 15th Int'l Conf. on Data Engineering, 1999, 188
    197

    [49] Micheline Kamber, Jiawei Han, Jenny Y. Chiang, Metarule-Guided Mining of Multi-Dimensional Association Rules Using Data Cubes, Proceeding of the 3rd International Conference on Knowledge Discovery and Data Mining, Newport Beach, California, Aug. 1997, 207210

    [50] Y. Fu and J.Han, Meta-Rule-Guided Mining of Association Rules in Relational Databases, Proc. 1995 Int'l Workshop. on Knowledge Discovery and Deductive and Object-Oriented Databases(KDOOD'95), Singapore, December 1995, pp.3946

    [51] Wei-Min Shen, et al. Metaqueries for data mining. In: U. M. Fayyad, G. Piatetsky-Shapiro, et al eds. Advances in knowledge discovery and data mining. AAAI/MIT Press. 1996, 375398
    [52] R. Meo, G. Psaila, and S. Ceri. A new SQL-like operator for mining association rules. Proc. of the 22nd int. Conf. on very large databases, Bombay, India, 1996, 122
    133

    [53] J. Han, Y. Fu, K. Koperski, W. Wang, and O. Zaiane, DMQL: A Data Mining Query Language for Relational Databases, 1996 SIGMOD'96 Workshop on Research Issues on Data Mining and Knowledge Discovery (DMKD'96), Montreal, Canada, June 1996

    [54] R. J. Bayardo Jr., Efficiently Mining Long Patterns from Databases, Proc. of the ACM SIGMOD Conference on Management of Data, Seattle, Washington, June 1998, 8593

    [55] S. Brin, R.Motwani, and C. Silverstein. Beyond market basket: generalizing association rules to correlation. Proc. 1997 ACM-SIGMOD int. conf. management of data, Tucson, Arizona, May 1997, 265276

    [56] C. Silverstein, S. Brin, R. Motwani, and J. Ullman. Scalable techniques for mining causal structures. Proc. 1998 int. conf. Very Large Data Bases, New York, NY, August 1998, 594605
    [57] F. Korn, et al. Ratio rules: A new paradigm for fast, quantifiable data mining. Proc. 1998 int. conf. Very Large Data Bases, New York, NY, August 1998, 582
    593

    [58] B. Ozden, et al. Cylic association rules. Proc 1998 int. conf. Data Engineering, Orlando, FL, Feb. 1998, 412421

    [59] S. Ramaswamy, et al. On the discovery of interesting patterns in association rules, Proc. 1998 int. conf. Very Large Data Bases, New York, NY, August 1998, 368379

    [60] 铁治欣 陈奇 俞瑞钊 关联规则采掘综述 计算机应用研究 2000 Vol.17 No.1 P.1-5

    展开全文
  • 2018数据结构课程设计报告

    万次阅读 多人点赞 2018-03-24 16:32:59
    本文是一份数据结构课程设计报告,旨在为各位的课设设计提供一条思路。

    声明:本文只是一份数据结构课程设计报告,可为各位的课设设计提供简明思路,但它不属于软件设计流程中任何一个环节的说明文档,请勿将其当成需求分析说明书做要求或使用。该项目的内容是展示在CMD上而非图形界面,现在因为工作原因已不再接课设单子,大学的课题在Github上基本全都能找得到(只要别整什么太离谱的),但如果想交流学习的话还是没问题的,QQ:2788636917。

    一、引言

    a) 编写目的

    某大学软件工程专业的学生们在大二的时候都要做一份数据结构课程设计来检验自己的水平。为了凸显自己的能力,同学们所选的题目也是五花八门,令老师们看的头痛不已。今天这个课题,老师要求既要能快速浏览目前所有的课题和学生信息,又能对课题进行编辑修改,同时自带统计管理功能。该软件的使用者为该系统的开发者和负责课程设计的老师们。

    b) 项目背景

    该项目名称初步命名为:课程设计管理系统。分为六个模块:系统模块、数据插入模块、数据删除模块、数据修改模块、数据查询模块、数据库模块、数据模块和数据库连接模块。本项目的提出者和开发者均为计算机学院16级软件2班姚兴业。

    c) 术语说明

    一级界面:指菜单界面
    二级界面:指所有直接通过一级界面进入的界面,也可称为信息类别选择界面
    三级界面:指所有直接通过二级界面进入的界面,也可称为详细信息输入界面

    d) 参考资料

    在此处列出文档所引用的外部文档或其他项目资料

    二、任务概述

    a) 目标

    本项目旨在开发出一个可以帮助教师们进行简单的课设项目管理和评分的帮助性软件

    b) 运行环境

    • 系统需求:Windows 7及更高版本系统
    • 软件需求:安装有Microsoft Access 2007或以上版本
    • 硬件需求:该软件对硬件无明显需求,目前市面上主流的Windows系统计算机均可运行

    c) 需求概述

    本软件具备以下功能:
    i. 添加功能: 通过系统向用户提供的选择界面来正确的添加学生信息或课程设计信息。在添加时将会限定学号和编号的唯一性,即当添加的学生学号或添加的课题编号重复时,系统将给出适当的提示并要求用户重新输入信息。
    ii. 删除功能: 通过系统向用户提供的选择界面来帮助用户删除指定编号的信息。
    iii. 修改功能: 用户将可以通过学号或编号来找到指定的学生或课题信息(如果它们存在的话),并通过系统提供的选择界面来对信息进行修改。
    iv. 查询功能: 用户可以通过学号或编号来查询学生或者课题的信息,如果信息不存在,系统将会给出适当的提示。
    v. 显示全部功能: 一键选择显示全部的学生信息或课题信息。
    vi. 统计功能: 用户可以通过系统提供的选择界面来对当前已有的信息进行统计。
    vii. 读取功能: 允许用户通过该功能向指定的Access数据库文件读取数据。
    viii. 保存功能: 将当前数据保存至本地Access数据库文件中。

    d) 条件与限制

    本系统旨在方便老师们对数据的管理,同时为了能更有效地执行任务,用户应先将存在excel中的输入导入至Access数据库中以方便系统读取。

    三、 总体设计

    a) 处理流程

    系统启动后将会直接进入主界面中,用户可以根据自己需要输入指令执行相应功能,在事务处理完毕后,用户可以通过退出指令退出系统。

    b) 总体结构和模块

    系统总体结构如下图所示:

    这里写图片描述

    c) 功能分配

    i. 系统功能

    • 初始化系统
    • 刷新一级界面
    • 关闭系统

    ii. 添加功能

    • 进入二级界面
    • 根据指令打开三级界面
    • 输入数据
    • 返回一级界面

    iii. 删除功能

    • 进入二级界面
    • 根据指令打开三级界面
    • 确认编号/学号后删除数据
    • 返回一级界面

    iv. 修改功能

    • 进入二级界面
    • 根据指令打开三级界面
    • 选择要修改的信息
    • 执行修改
    • 返回一级菜单

    v. 查询功能

    • 进入二级菜单
    • 根据指令打开三级菜单
    • 根据编号/学号显示对应的信息
    • 返回一级菜单

    vi. 显示全部功能

    • 进入二级菜单
    • 根据指令显示全部学生信息或课题信息

    vii. 统计功能

    • 进入二级菜单
    • 根据指令进入三级菜单
    • 根据指令给出相关统计数据
    • 循环执行功能
    • 返回一级菜单

    viii. 保存功能

    • 刷新界面
    • 确认是否保存
    • 执行相应功能
    • 返回一级菜单

    ix. 读取功能

    • 刷新界面
    • 从Access数据库文件中读取数据
    • 刷新一级菜单

    四、接口设计

    a) 外部接口

    i. 用户界面: 采用经典的Windows指令台风格,通过最简单的指令输入形式执行相应功能。
    ii. 软件接口: 运行于Windows XP/7/8.1/10且具有Win32指令台的操作系统
    iii. 硬件接口: 支持市面上常见的或更高档的微机和笔记本电脑。

    b) 内部接口

    i. 系统模块: 系统启动时自动调用,初始化界面后等待用户输入
    ii. 数据插入模块: 由系统模块调用,启动后调用数据模块的增加功能
    iii. 数据删除模块: 由系统模块调用,启动后调用数据模块的删除和查询功能
    iv. 数据修改模块: 由系统模块调用,启动后调用数据模块的修改和查询功能
    v. 数据查询模块: 由系统模块调用,启动后调用数据模块的查询功能
    vi. 数据库模块: 由系统模块调用,启动后调用数据库连接模块。
    vii. 数据库连接模块: 由数据库模块调用,启动后调用打开拦截、SQL语句查询、关闭连接等功能。
    viii. 数据模块: 可由数据插入模块、数据删除模块、数据修改模块、数据查询模块等模块调用,启动后可根据需要调用增加、删除、修改、查询等功能。

    五、 数据结构设计

    a) 类结构设计

    (此处仅展示方法签名,具体的实现写在相对应的.cpp文件中)

    i. BinaryNode(二叉树节点)

    template<class DataType>
    struct BinaryNode
    {
    	DataType data;
    	BinaryNode<DataType> *leftNode, *rightNode;
    	BinaryNode<DataType>() { leftNode = rightNode = nullptr; }
    	BinaryNode(DataType &element)
    	{
    		leftNode = rightNode = nullptr;
    		data = element;
    	};
    };
    

    ii. BinaryTree(二叉排序树)

    template<class DataType>
    class BinaryTree
    {
    private:
    	BinaryNode<DataType> * root;
    	DataType findMin(BinaryNode<DataType> *bt);
    	void Release(BinaryNode<DataType> *bt);
    	void PreOrder(BinaryNode<DataType> *bt) const;
    	void InOrder(BinaryNode<DataType> *bt) const;
    	void PostOrder(BinaryNode<DataType> *bt) const;
    	BinaryNode<DataType>* isFind(DataType &element, BinaryNode<DataType> *bt);
    	void Delete(DataType &element, BinaryNode<DataType> *bt);
    	int length;
    public:
    	BinaryTree() { length = 0; root = NULL; }
    	~BinaryTree() { Release(root); }
    	void Release() { this->Release(root); }
    	void PreOrder();
    	void InOrder();
    	void PostOrder();
    	void Insert(DataType &element);
    	DataType isFind(DataType &element);
    	void Delete(DataType &element);
    
    	int Length() { return this->length; }
    };
    

    iii. CurriculumDesign(课程设计实体类)

    class CurriculumDesign
    {
    private:
    	string design_name;
    	string design_dataStruct;
    	string author;
    	Score design_score;
    public:
    	CurriculumDesign();
    	CurriculumDesign(string design_name, string design_dataStruct = "NULL",
    		string author = "NULL");
    	~CurriculumDesign();
    
    	string getInfo();
    	string writeToFile();
    
    	//getter & setter
    	string get_design_name() { return this->design_name; }
    	void set_design_name(string new_name) { this->design_name = new_name; }
    
    	string get_design_dataStruct() { return this->design_dataStruct; }
    	void set_design_dataStruct(string new_ds) { this->design_dataStruct = new_ds; }
    
    	string get_author() { return this->author; }
    	void set_author(string new_author) { this->author = new_author; }
    
    	double get_design_score() { return this->design_score.get_total(); }
    	void set_design_score(string type_score, double new_score);
    	void set_design_score(Score score);
    
    	// overload
    	friend bool operator<(CurriculumDesign &left, CurriculumDesign &right);
    	friend bool operator<(CurriculumDesign &left, double number);
    	friend bool operator>(CurriculumDesign &left, CurriculumDesign &right);
    	friend bool operator>(CurriculumDesign &left, double number);
    	friend bool operator==(CurriculumDesign &left, CurriculumDesign &right);
    	friend bool operator==(CurriculumDesign &left, double number);
    	friend ostream &operator<<(ostream &out, CurriculumDesign &temp);
    };
    

    iv. Student(学生实体类)

    class Student
    {
    private:
    	string stu_name;
    	int stu_ID;
    	string stu_class;
    	string design_name;
    public:
    	Student();
    	Student(int stu_ID, string stu_name = "NULL", string stu_class = "NULL",
    		string design_name = "NULL") :
    		stu_ID(stu_ID), stu_name(stu_name), stu_class(stu_class),
    		design_name(design_name) {}
    	Student(const Student &obj);
    	~Student();
    
    	// getter & setter
    	string get_stu_name() { return this->stu_name; }
    	void set_stu_name(string new_name) { this->stu_name = new_name; }
    
    	int get_stu_ID() { return this->stu_ID; }
    	void set_stu_ID(int new_ID) { this->stu_ID = new_ID; }
    
    	string get_stu_class() { return this->stu_class; }
    	void set_stu_class(string new_class) { this->stu_class = new_class; }
    
    	string get_design_name() { return this->design_name; }
    	void set_design_name(string new_name) { this->design_name = new_name; }
    
    	string getInfo();
    	string writeToFile();
    
    	// overload
    	friend bool operator<(Student &left, Student &right);
    	friend bool operator>(Student &left, Student &right);
    	friend bool operator==(Student &left, Student &right);
    	friend ostream &operator<<(ostream &out, Student &temp);
    };
    

    v. Management(管理类,Service部分)

    /**
     * 每添加一个学生信息就对应添加一个课题信息,课题的作者即为学生名
     * 课题不可删除,每删除一个学生就对应删除一个课题
     * 学生的信息最初先添加在链表里,在课题打分后再添加到二叉树中进行排序
     * /
    
    class Management
    {
    private:
    	BinaryTree<CurriculumDesign> *design; // 存储所有已打分的课设信息
    	StudentList *stu_list; // 存储所有学生的信息
    	CurriculumDesignList *design_list; // 存储所有课设的信息
    public:
    	Management();
    	~Management();
    
    	void Insert(Student &stu, CurriculumDesign &design);
    	bool Delete(int stu_ID);
    	string Edit(int stu_ID, int new_info);
    	string Edit(int stu_ID, string type_info, string new_info);
    	void SearchAllStudent();
    	void SearchAllDesign();
    	bool Search(int stu_ID);
    	bool Search(string design_name);
    
    	Student Get(int stu_ID);
    	CurriculumDesign Get(string design_name);
    	string* InfoToFile_Design();
    	string* InfoToFile_Student();
    	int numOfStudent() { return stu_list->Length(); }
    	int numOfDesign() { return design_list->Length(); }
    	int numOfMarkedDesign();
    	int numOfPassDesign();
    	void Mark(int stu_ID, Score score);
    	void MultipleMark();
    	void RankingList();
    
    	void ReadFile(string *str_stu, string *str_design);
    };
    

    vi. CurriculumDesignManagement (main函数部分方法)

    Management admin; // 管理类实例化对象
    
    void title(); // 标题
    void footer(); // 结束语
    void menu(); // 菜单
    void Insert(); // 添加信息
    void Delete(); // 删除信息
    void Edit(); // 修改信息
    void Search(); // 查询信息
    int Calc_numOfStudent() { return admin.numOfStudent(); } // 统计学生总人数
    int Calc_numOfMarkedDesign() { return admin.numOfMarkedDesign(); } // 统计已打分的课程数
    int Calc_numOfPassDesign() { return admin.numOfPassDesign(); } // 统计及格人数
    void SimpleMark();
    void MultipleMark();
    Score Grade();
    void Save(); // 保存文件
    void Load(); // 读取文件
    bool isNumber(string str); // 判断str是否为纯数字串
    int main();
    

    b) 数据库结构设计

    数据库采用Microsoft Access 2017,表结构设计如下:
    i. Student

    字段名 类型 字段长度 备注
    stu_name varchar 50 主键
    stu_class varchar 50
    stu_ID varchar 50
    design_name varchar 50

    ii.CurriculumDesign

    字段名 类型 字段长度 备注
    design_name varchar 50 主键
    design_dataStruct varchar 50
    author varchar 50 学生姓名
    design_score float -

    c) 数据结构与程序的关系

    i. 系统模块: 调用全局变量admin,根据用户输入的指令cmd来调用相应的函数
    ii. 数据插入模块: 根据指令cmd调用admin中的两条插入函数。
    iii. 数据删除模块: 根据指令cmd调用admin中的两条删除函数。
    iv. 数据查询模块: 根据指令cmd调用admin中的四条查询函数。
    v. 数据修改模块: 根据指令cmd调用admin中的两条编辑函数。

    六、 运行设计

    a) 运行模块的组合

    所有类与函数均用英文全称命名,类内参数采用“[类名缩写][信息类型][数据名]”的格式来命名。如:学生的基本信息姓名的参数名为“stu_info_name”。

    b) 运行控制

    本软件控制流程如下:首先由用户启动软件,之后根据屏幕上的提示输入指令,系统根据指令触发事件及调用相关模块。

    c) 运行时间

    每个功能都快的感受不出来

    七、 出错设计处理

    a) 本软件在系统关键处采用try-catch代码块将危险代码包围起来,保证用户触发异常时系统可以正常运行下去。
    b) 在用户执行删除或修改等破坏性操作时,系统将会提供确认机制。

    八、 安全保密设计

    此处留作日后使用,用户安全与软件安全相关部分均需记载于此。

    九、 维护设计

    本软件完全依照RUP过程开发并充分考虑了软件的可维护性,详细编写了概要设计文档,以利于未来的二次开发。

    十、GitHub链接

    有鉴于有人找我要这份课设的代码,故我将项目post到了我的Github项目中,需要的话直接clone下来就好,使用VS打开.sln文件即可加载整个项目,不过由于数据库已经丢失了,相关的部分可能需要同学们自己重新设计。

    课程设计管理系统(https://github.com/w8692736/CurriculumDesign.git)

    展开全文
  • 一份王者荣耀的英雄数据报告

    万次阅读 多人点赞 2020-01-15 12:28:12
    咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...

    咪哥杂谈

    本篇阅读时间约为 6 分钟。

    1

    前言

    前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。

    今天来实现一下,看看不同维度得到的结论。

    2

    环境准备

    本次实验用到的图形库为 pyecharts 。

    pip install pyecharts
    

    Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。

    而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

    github - pyecharts 官网文档

    以下实验环境,均处于 Jupyter Notebook 中,关于 Jupter Notebook 安装教程,移步:

    https://zhuanlan.zhihu.com/p/54302333

    知乎

    3

    数据分析的两个概念

    数据分析里,先来了解下两个比较基础的概念:维度(Dimensions) 和度量(Measures)。

    如果你用过可视化的工具,一定对其不陌生,比如 Tableau、Kibana等。

    简单的来说,度量描述的是数据表中的数值数据,而维度描述的则是类别数据。

    举个栗子。

    假设你家是开商店的,每个季度要对不同商品进行销售额统计。

    我们常见的一些有含义的名词、时间、地理位置等离散型数据适用于维度。

    那这里的商品名称,如苹果,梨,栗子等可以作为维度。

    连续型数据适用于度量,如数字。

    此时,这些不同商品的卖出数量,则作为度量。

    4

    荣耀分析

    明白了上述概念,下面分别定下不同的维度来进行分析做图。

    PS: 关于 pyecharts 的代码不进行贴出,后续给出源码地址。

    1. 王者荣耀中,英雄不同定位,英雄数量分别是多少?

    根据读取 Excel 中 position ,获取不同英雄定位的数量。

    图形:

    王者荣耀一共 97 个英雄,前几天更新了赛季,新增一名射手。实际上可以看到,官方游戏策划对“法师”还是比较青睐的。

    法师类英雄为什么多?

    猜测:在诸多 moba 游戏中,中单是所有位置可玩性最高的,也是全场能带动节奏的关键位置。不论从最早第一款 dota 还是到现在移动端的王者荣耀。

    中单选手的操作决定左右着游戏全局的走向,不论是前期,中期,还是后期。

    玩的好的中单玩家,中前期可以带节奏 carry 全场,带玩家走向胜利。

    比如我高中同学的貂蝉,1000多场,大部分场次拿此英雄就已经赢了一半了。

    2. 王者荣耀中,哪个英雄无装备下跑的最快?

    王者 97 个英雄里,你绝对想不到的居然是 盾山  和 梦奇  跑的是最快的(应该是最瘦状态的时候)。

    这个图清晰的显示了除了这两个英雄移动速度额外的快,其余的英雄其实相差不到哪里去。

    PS:对比下疾步之靴,最便宜的王者鞋子,看下它的属性。

    属性:

    • 唯一被动 神行:脱离战斗后增加 60 移动速度

    • 唯一被动 :+60 移动速度

                          

    3. 王者荣耀中,哪个坦克无装备下血量最多?

    坦克里的英雄,亚瑟是血量最多的。仔细看,这堆坦克的血量最低是八戒,差值 600 血量,要知道 600 的血量前期顶小半个红莲斗篷了

    红莲斗篷基础属性:

    • 物理防御:240点

    • 最大生命:1200点

    装备技能

    • 唯一被动:每秒对身边的敌军造成100点法术伤害

    再来看下平均值,关于平均值,在图中画出了一条线,此线是所有英雄算出来的平均数,可以看到只有2个坦克的初始血量设定低于平均值,分别是钟无艳和猪八戒。

    但不得不说,虽然低,但在对应的英雄技能上,有所弥补,比如钟无艳的防御套,八戒的回血功能。

    4. 王者荣耀中,哪个英雄无装备下物理防御最高?

    最高物理防御 150 ,庄周

    最低物理防御 83 ,小脆皮哥斯拉,啊不对,安琪拉,妹子最爱的英雄

    物理防御意味着什么呢?普通攻击对其造成的伤害,假设双方法师都没魔法值了,那么安琪拉一定是对 A 不过敌人的。。。(虽然傻子法师才会去普通攻击~)

    5. 哪些英雄推荐玩?

    根据 18183 游戏网提供的数据,画出以下雷达图,按照定位不同来看。

    用 pyecharts 画了一天的图,发现还是有缺点的,维度这一项,如果很多,用代码来实现是没有办法实现的!(研究一天没研究出来,看了官方文档也没找到。。)

    所以我只能在度量上加了一层英雄名称,以下雷达图在英雄名称是没有数值的,

    18183游戏网,法师推荐:

    最饱和属性,嫦娥

    18183游戏网战士推荐:

    最饱和属性,盘古

    18183游戏网坦克推荐:

    最饱和属性,猪八戒

    18183游戏网,射手推荐:

    最饱和属性,伽罗

    18183游戏网,辅助推荐:

    最饱和属性,瑶

    18183游戏网,刺客推荐:

    最饱和属性,荆轲

    综上所述,雷达图其实很容易就能看出哪些数值比较突出。

    瑶这个英雄现在在王者段位中,真的是一直被 ban,一般拿不到。阿轲是在白金左右段位的打野,很好上分。嫦娥其实一直在法师中很强势,只不过很少有人爱用她,算是一个法坦。

    那我自己找出的数据维度,暂时就这么多。

    5

    用到的几个 pandas 方法

    1. df['position'].value_counts() 

    Df读取某列的值,并且按照内容进行分组计数。如下:

    2. df[df['position']=='坦克']['name']

    筛选,position为坦克的英雄名称。如下:

    3. df['最大生命'].mean()

    Mean,平均值的意思,求最大生命的平均值,画出平均线。

    6

    总结

    以上,就是本次通过数据找出来的几个维度点。

    后台和一些朋友沟通交流了下,本次数据其实维度还是过于少,比如一些装备上的数据,没有进行爬取,英雄本身的等级成长值,也没有,如果你有更好的维度,欢迎留言区留言探讨~

    关于 notebook 的源代码,上传到 github 了,后台回复关键词 荣耀代码 即可获得! 


    往期精彩回顾

    视频下载神器和搜索云资源神器!

    Python处理Excel&CSV文件

    pyspider爬取王者荣耀数据(下)

    你点的每个在看,我都认真当成了喜欢

    展开全文
  • 摩拜共享单车数据分析项目报告

    千次阅读 2020-09-29 21:23:39
    文章目录摩拜共享单车数据分析项目报告项目背景数据探索数据挖掘数据分析时间维度空间维度用户维度 摩拜共享单车数据分析项目报告 项目背景 随着智能手机的普及和手机用户的激增,共享单车作为城市交通系统的一个...

    项目背景

    随着智能手机的普及和手机用户的激增,共享单车作为城市交通系统的一个重要组成部分,以绿色环保、便捷高效、经济环保为特征蓬勃发展。共享单车企业通过在校园、公交站点、居民区、公共服务区等提供服务,完成交通行业最后一块“拼图”,与其他公共交通方式产生协同效应。共享单车有助于缓解城市短距离交通出行和“最后一公里”难题,但共享单车由于其运营特点,对企业在城市投放和调度单车的规划管理方面,存在较大挑战。

    基于上述背景,本文基于上海摩拜单车的2016年8月份随机抽样大约10万条的开放订单数据进行分析,挖掘出数据背后的规律,用数据勾勒出摩拜共享单车的使用与用户出行现状,从而有助于摩拜共享单车企业更好地推出营销策略,定位新单车的投放区域,调控车辆布置,更好地服务用户。

    注:本项目的数据、代码和图表可戳:摩拜共享单车数据分析项目数据、代码、图表 下载

    数据探索

    这一步中我们统观数据的全貌,对数据有个大体的了解,对数据进行质量探索和特征分析。

    读取数据并查看数据集数据

    import pandas as pd
    from math import radians, cos, sin, asin, sqrt,ceil
    import numpy as np
    import geohash
    
    #数据读取
    data = pd.read_csv("./mobike_shanghai_sample_updated.csv")
    print(data.head(10))
    

    该数据集为摩拜共享单车企业提供的上海城区2016年8月随机抽样的10万多条用户骑行用车数据(订单数据),包含交易编号、用户ID、车辆ID、骑行起点经纬度、骑行终点经纬度、租赁时间、还车时间、骑行轨迹经纬度等数据。
    在这里插入图片描述

    查看数据集属性类型,在这里我们可以看出租赁时间和还车时间的数据类型为object类型,我们紧接着可以把它转化为datetime类型

    print(data.info())
    

    在这里插入图片描述

    data['start_time'] = pd.to_datetime(data['start_time'])
    data['end_time'] = pd.to_datetime(data['end_time'])
    print(data.info())
    

    查看数据集的空值分布情况,数据不存在空值

    print(data.isnull().sum())
    

    在这里插入图片描述

    数据挖掘

    该数据集虽然多达10万多条用车交易数据,但每一条用车交易数据里只有10个特征,并且该数据集和之前的电影数据集不同,之前的电影数据集每一个特征都是独立的信息字段,不和其他特征产生明显关联,而该数据集的特征之间拥有明显的相关性,我们可以通过关联组合特征之间的关系得到新的特征,或者从一个特征反映出来的多个方面组合出多个新的特征扩充数据集,掌握事物的多个方面,挖掘出数据更多潜在的规律,从而使得后面的数据分析可以进行更多维度的分析,得到对数据的更多认识。

    如何发现新特征:

    1. 租赁时间 + 还车时间 => 骑行时长
    2. 骑行起点经纬度 + 骑行终点经纬度 => 骑行的位移
    3. 摩拜单车骑行轨迹经纬度 => 骑行的路径
    4. 租赁时间 => 星期几(即每笔骑行订单发生在星期几) + 时间段(即每笔订单发生在一天24小时的哪个时间段)
    5. 骑行时长 => 订单金额(粗略估计)
    6. 每笔订单金额 + 每笔订单租赁时间 + 每笔订单用户ID=> 用户分级(RFM模型)
    7. 骑行起点终点经纬度 => 骑行起点终点所处的地区

    租赁时间 + 还车时间 => 骑行时长

    新增“lag”列,通过开始时间 - 结束时间计算得到骑行时长,并把时长单位统一为分钟。

    data["lag"] = (data.end_time - data.start_time).dt.seconds/60
    

    骑行起点经纬度 + 骑行终点经纬度 => 骑行的位移

    新增“distance”列,通过计算骑行起点和终点的经纬度得到骑行的位移,单位为千米。

    geodistance()封装的是通过两点经纬度求两点直线距离的数学公式。对背后公式的推导过程和数学原理感兴趣的可以戳 https://blog.csdn.net/sunjianqiang12345/article/details/60393437 了解。

    def geodistance(item):
        lng1_r, lat1_r, lng2_r, lat2_r = map(radians, [item["start_location_x"], item["start_location_y"], item["end_location_x"], item["end_location_y,"]]) # 经纬度转换成弧度
        dlon = lng1_r - lng2_r
        dlat = lat1_r - lat2_r
        dis = sin(dlat/2)**2 + cos(lat1_r) * cos(lat2_r) * sin(dlon/2)**2
        distance = 2 * asin(sqrt(dis)) * 6371 * 1000 # 地球平均半径为6371km
        distance = round(distance/1000,3)
        return distance
    #data按行应用geodistance()得到distance列的数值
    data["distance"] = data.apply(geodistance,axis=1)
    

    摩拜单车骑行轨迹经纬度 => 骑行的路径

    新增“adderLength”列,通过计算“track”列数据得到骑行路径。

    把骑行轨迹字符串按“#”分隔符分隔成列表,得到骑行轨迹的经纬度信息列表
    在这里插入图片描述
    通过不断两两轮询该骑行轨迹列表,每一次按顺序取出两个列表元素(前轨迹采样点的经纬度和后轨迹采样点的经纬度)按“,”分隔符分隔,得到四个值(前轨迹采样点的经度、前轨迹采样点的纬度、后轨迹采样点的经度、后轨迹采样点的纬度),组合成一个item字典传入给geodistance()计算出两点的位移,再把每一小段每一小段的位移累加起来得到骑行的路径。

    #通过摩拜单车的踪迹获取每次交易骑行的路径
    def geoaadderLength(item):
        track_list = item["track"].split("#")
        adderLength_item = {}
        adderLength = 0
        for i in range(len(track_list)-1):
            start_loc = track_list[i].split(",")
            end_loc = track_list[i+1].split(",")
            adderLength_item["start_location_x"],adderLength_item["start_location_y"] = float(start_loc[0]),float(start_loc[1])
            adderLength_item["end_location_x"],adderLength_item["end_location_y"] = float(end_loc[0]),float(end_loc[1])
            adderLength_each = geodistance(adderLength_item)
            adderLength = adderLength_each + adderLength
        return adderLength
    data["adderLength"] = data.apply(geoaadderLength,axis=1)
    

    租赁时间 => 星期几 + 时间段(24小时制)

    新增“weekday”(即每笔骑行订单发生在星期几)和“hour”(即每笔订单发生在一天24小时的哪个时间段)

    data['weekday'] = data.start_time.apply(lambda x: x.isoweekday())
    data['hour'] = data.start_time.apply(lambda x: x.utctimetuple().tm_hour)
    

    骑行时长 => 订单金额

    新增“cost”列,根据每笔订单的骑行时长,粗略估计订单金额,参照2016年摩拜收费标准,按每30分钟收取1元。

    data['cost'] = data.lag.apply(lambda x: ceil(x/30))
    

    订单金额 => 用户分级(RFM模型)

    由于我们拥有了每笔交易的用户id、消费金额、消费时间,我们可以考虑运用RFM模型,对用户进行分级,这里采取的模型是RFM模型。

    RFM模型是进行用户价值细分的一种方法,是用以研究用户的数学模型。

    • R(Recency)最近一次消费时间:表示用户最近一次消费距离现在的时间;
    • F(Frequency)消费频率:消费频率是指用户在统计周期内购买商品的次数;
    • M(Monetary)消费金额:消费金额是指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少;

    这3个维度,帮助我们把用户划分为标准的8类
    在这里插入图片描述
    其模型构建过程可分为如下步骤:

    • 计算RFM值

    R值:即每个用户最后一次租赁共享单车时间距9月1日多少天;(因为数据集只包含2016年8月份的数据,所以我们站在9月1的时间节点上统计每个用户最近一次消费距离现在的时间)

    F值:即每个用户累计租赁单车频次;

    M值:即每个 用户累积消费金额;

    #因数据集仅包含八月份发起的订单数据,故以9月1日为R值计算基准
    data['r_value_single'] = data.start_time.apply(lambda x: 32 - x.timetuple().tm_mday) 
    # 按每个用户id所有订单日期距9/1相差天数的最小值作为r值
    r_value = data.groupby(['userid']).r_value_single.min()    
    f_value = data.groupby(['userid']).size()    # 按每个用户id八月累积订单数量作为f值
    m_value = data.groupby(['userid']).cost.sum()    # 按每个用户id八月累积消费金额作为m值
    #把r值、f值、m值组合成DataFrame
    rfm_df = pd.DataFrame({'r_value':r_value,'f_value':f_value,"m_value":m_value})
    

    在这里插入图片描述

    • 计算RFM分数

    在这一步中我们给每个用户的RFM值打分,分值的大小取决于我们的偏好,RFM值越高,其RFM得分也越高。RFM模型中打分一般采取5分制,这里采取根据RFM值的区间划分,进行RFM分值的设置。

    rfm_df["r_score"] = pd.cut(rfm_df["r_value"],5,labels=[5,4,3,2,1]).astype(float)
    rfm_df["f_score"] = pd.cut(rfm_df["f_value"],5,labels=[1,2,3,4,5]).astype(float)
    rfm_df["m_score"] = pd.cut(rfm_df["m_value"],5,labels=[1,2,3,4,5]).astype(float)
    

    在这里插入图片描述

    • 划分用户维度

    现在r_score、f_score、m_score在1-5几个数之间,如果把这3个值进行组合,像111,112,113…这样可以组合出125(5 * 5 * 5)种结果,但过多的分类和不分类本质上是差不多的,所以在划分用户维度这一块,我们简化分组结果。我们通过判断每个客户的R、F、M分数是否大于其平均值,来简化分组结果。每个客户的RFM值和RFM平均值对比后只有0和1(0表示小于平均值,1表示大于平均值)两种结果,整体组合下来共有8个分组(2 * 2 * 2)。

    #后面*1是为了把布尔值false和true转成0和1
    rfm_df["r是否大于均值"] = (rfm_df["r_score"] > rfm_df["r_score"].mean())*1
    rfm_df["f是否大于均值"] = (rfm_df["f_score"] > rfm_df["f_score"].mean())*1
    rfm_df["m是否大于均值"] = (rfm_df["m_score"] > rfm_df["m_score"].mean())*1
    #把每个用户的rfm三个指标统合起来
    rfm_df["class_index"] = (rfm_df["R是否大于均值"]*100) + (rfm_df["f是否大于均值"]*10) + (rfm_df["m是否大于均值"]*1) 
    
    def transform_user_class(x):
        if x == 111:
            label = "重要价值用户"
        elif x == 110:
            label = "消费潜力用户"
        elif x == 101:
            label = "频次深耕用户"
        elif x == 100:
            label = "新用户"
        elif x == 11:
            label = "重要价值流失预警用户"
        elif x == 10:
            label = "一般用户"
        elif x == 1:
            label = "高消费唤回用户"
        elif x == 0:
            label = "流失用户"
        return label
    rfm_df["user_class"] = rfm_df["class_index"].apply(transform_user_class)
    

    在这里插入图片描述
    至此,RFM模型会把用户划分为标准的8类,其8类所对应的含义如下
    在这里插入图片描述
    把得到的用户分类结果按用户ID拼接到原有数据中,命名为“user_class”列

    data = data.merge(rfm_df["user_class"], on = 'userid', how = 'inner')
    

    骑行起点终点经纬度 => 骑行起点终点所处的区块

    在这一步中我们把骑行起点终点的经纬度转换为GeoHash编码字符串。

    GeoHash将二维的经纬度转换成GeoHash编码字符串,每一个字符串代表了某一矩形区域。这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串。GeoHash本质上是一个哈希函数,但和其他的一些哈希函数会尽力避免哈希碰撞不一样,GeoHash根据经纬度范围把不同的经纬度哈希碰撞到同一字符串。

    Geohash能够提供任意经纬度的分段级别,一般分为1-12级。Geohash编码字符串越长,表示的区域范围越精确,GeoHash编码字符串长度所对应的区块范围。
    在这里插入图片描述
    针对摩拜共享单车的短途骑行特点,我们选择GeoHash6位编码进行转换。

    在转换之前需要安装geohash

    pip install geohash
    

    并去python/Lib/site-packages/的目录下,把Geohash文件夹重命名为geohash,然后修改该目录下的init.py文件,把from geohash改为from .geohash,然后才能正常导入(这是个bug)。

    import geohash
    #经纬度转geohash
    def transform_start_geohash(item):
        return geohash.encode(item["start_location_x"], item["start_location_y"],6)
    
    def transform_end_geohash(item):
        return geohash.encode(item["end_location_x"], item["end_location_y"],6)
    data["geohash_start_block"] = data.apply(transform_start_geohash,axis = 1)
    data["geohash_end_block"] = data.apply(transform_end_geohash,axis = 1)
    

    查看一下转换后的GeoHash编码字符串

    print(data.loc[:,["geohash_start_block","geohash_end_block"]])
    

    在这里插入图片描述
    查看扩充后的数据集

    查看扩充后的数据集并保存

    print(data.head(10))
    data.to_csv("./data_dig.csv",index = None)
    

    扩充后的数据集增加了如下信息字段:

    lag(骑行时长)、distance(骑行位移)、adderLength(骑行路径)、weekday(骑行的星期日期)、hour(骑行时间段)、cost(本次骑行的消费金额)、r_value_single(订单发起时间距离9月1日的天数)、user_class(用户分级)、geohash_start_block(骑行起点所在区块的GeoHash编码字符串)、geohash_end_block(骑行终点所在区块的GeoHash编码字符串)。
    在这里插入图片描述

    数据分析

    针对经数据挖掘扩充后的数据集,我们从以下维度分析:

    时间维度
    • 骑行时长分布分析
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    import pandas as pd
    
    #读取数据
    data = pd.read_csv("./data_dig.csv")
    
    #骑行时长分布
    lag_data = data["lag"].value_counts()
    lag_c = (
        Bar()
        .add_xaxis(lag_data.index.tolist())
        .add_yaxis("骑行时长",lag_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行时长分布图"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    lag_c.render_notebook()
    

    在这里插入图片描述
    由图表我们观察到数据存在明显的长尾,呈现右偏态分布(正态分布和偏态分布都是正常现象,为什么数据呈现偏态分布?因为人们使用共享单车出行这一行为本身就含有“偏心”,倾向于短期出行);x轴的数据范围非常大,造成这样的结果有一部分是由于数据存在异常记录,由图表x轴的数据范围跨度,我们观察到有存在骑行时长长达955分的骑行记录,而连续骑行955分以上显然是不正常的,这样的数据记录可能是用户骑行忘记关锁造成的。

    针对数据中骑行时长数据存在异常的处理,我们考虑新增骑行速度“speed”一列(骑行路径 / 骑行时长),通过大致剔除骑行速度存在明显异常(骑行速度一般在12-20km/h)的记录而去除掉用户骑行后忘记关锁造成的异常记录。然后再重新绘制直方图观察骑行时长的数据分布情况。

    #新增骑行速度,通过剔除骑行速度存在异常的记录处理异常数据,得到新的骑行时长
    data['speed'] = data['adderLength'] / (data['lag'] / 60)
    data = data[-(((data['speed'] < 12) | (data['speed'] > 20)) )]
    lag_data = data["lag"].value_counts().sort_index()
    len(lag_data)
    lag_c = (
        Bar()
        .add_xaxis(lag_data.index.tolist())
        .add_yaxis("骑行时长",lag_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行时长分布图"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    lag_c.render_notebook()
    

    如图所示,长尾明显减弱
    在这里插入图片描述
    如图所示,用户的每次骑行时间多集中分布在30分钟之内,我们可以针对这骑行时长分布情况,多多推出30分钟左右的时间满减优惠券。

    • 24小时骑行订单数分布分析
    hour_data = data["hour"].value_counts().sort_index()
    hour_c = (
        Bar()
        .add_xaxis(hour_data.index.tolist())
        .add_yaxis("骑行时长",hour_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行时长分布图"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    hour_c.render_notebook()
    

    在这里插入图片描述
    由图可以看出:

    23-5点这段时间,人们大多在休息,使用共享单车出行的订单数很少;6点开始,订单数逐渐开始增多;在7-9点、17-20点上下班时段,出现订单数的小高峰,分别是早高峰和晚高峰;11-14点时段,出现局部午高峰,这和中午外出就餐或者休息时间活动有一定关系。

    整体趋势表明,共享单车的骑行交通在很大程度上是服务于人们的通勤出行的。

    • 工作日和非工作日的24小时骑行订单数分布分析

    上面计算的24小时骑行订单数的分布情况忽略了工作日和非工作日的区别,而工作日和非工作日人们的通勤出行情况是有所不同的,那么在工作日和非工作日,骑行订单数的24小时分布情况分别是什么样的呢?

    #分别提取非工作日和工作日的订单数据
    isweekday_data = data[(data["weekday"]==6) | (data["weekday"]==7)]
    noweekday_data = data[~((data["weekday"]==6) | (data["weekday"]==7))]
    
    #找出数据集中包含多少天非工作日的数据和多少天工作日的数据
    isweekday_num = isweekday_data["weekday"].value_counts().shape[0]
    noweekday_num = noweekday_data["weekday"].value_counts().shape[0]
    
    print("数据集中工作日的天数:" + isweekday_num)
    print("数据集中非工作日的天数:" + noweekday_num)
    #工作日5天,非工作日2天
    
    #分别计算出工作日、非工作日每个小时的平均订单量
    isweekday_hour_data = isweekday_data.groupby("hour").count()["orderid"]/isweekday_num
    noweekday_hour_data = noweekday_data.groupby("hour").count()["orderid"]/noweekday_num
    
    isAndNoweekday_hour_c = (
        Bar()
        .add_xaxis(hour_data.index.tolist())
        .add_yaxis("工作日24h订单数分布",noweekday_hour_data.values.tolist())
        .add_yaxis("非工作日24h订单数分布",isweekday_hour_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="工作日和非工作日的24h订单数分布"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    isAndNoweekday_hour_c.render_notebook()
    

    在这里插入图片描述
    绿色柱状表示工作日内每小时平均订单量的分布。同上述每小时总订单量分布情况相似:23-5点这段时间,使用共享单车出行的订单数很少;6点开始,订单数逐渐开始增多;在7-9点、17-20点上下班时段,出现订单数的小高峰,分别是早高峰和晚高峰;11-14点时段,出现局部午高峰。

    紫色柱状为非工作日内每小时平均订单量的分布。非工作日骑行交通以非通勤交通为主,与工作日的分布情况比较,分布相对平缓,没有明显的早晚高峰现象。

    空间维度
    • 骑行距离(路径)分布分析
    #骑行距离单位为千米
    adderLength_data = data["adderLength"].value_counts().sort_index()
    adderLength_c = (
        Bar({"theme": ThemeType.MACARONS})
        .add_xaxis([round(i,2) for i in adderLength_data.index.tolist()])
        .add_yaxis("骑行距离",adderLength_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行距离分布图"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    adderLength_c.render_notebook()
    

    在这里插入图片描述
    骑行距离分布图粗略显示出主要的骑行距离大概集中在3千米左右的范围内。但也存在远距离甚至40公里以上的骑行,可考虑为异常数据;或者可以理解为其他特殊的骑行现象。对数据剔除异常值,首先我们得先识别出异常值。在统计学中,常常用箱型图来判断异常值,箱型图无需对数据进行正态分布要求,适用范围广。而在用箱型图识别异常值之前,我们需要先认识下箱型图。

    箱形图因为形状类似一个箱子而得名,它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。通过箱形图可以很直观的读出一组数据的最大值(上外限)、最小值(下外限)、中位数Q2、上四分位数Q3、下四分位数Q1、异常值(上内限之外和下内限之外的值)。注意图中的上限和下限指的是上内限和下内限,而在绘制箱型图中常常只有上外限(最大值)和下外限(最小值)被显示出来,但我们可以通过公式Q3 + 1.5*IQR计算上内限,通过公式Q1-1.5 * IQR计算下内限。

    https://img-blog.csdnimg.cn/20200528202202431.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pha3Nvbl9wb29y,size_16,color_FFFFFF,t_70
    通过箱型图上下内限划分异常值的数学原理如下:以正态分布为例,假如一组数据服从正态分布, X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的(异常值),基本上可以把区间(μ-3σ,μ+3σ)看作是随机变量X实际可能的取值区间,这称之为正态分布的“3σ”(3 sigma)原则。而箱型图的上下内限范围恰好处在(μ-3σ,μ+3σ)之间,由此可以判断处在箱型图上下内限之外的数据为异常值。

    img
    我们绘制箱型图,快速判断共享单车的骑行距离数据中的异常值,从而快速去除其异常值。
    在这里插入图片描述
    由图我们观察到绘制出来的箱形图的箱体很扁和下须线非常短,这说明骑行距离的数据按从小到大排序的分布的前75%是十分集中的;而上须线非常长,这说明整个数据集的范围跨度很大,后25%的数据分布十分分散。这一规律也在上面的条形图中反映了出来。

    通过图表的提示弹框,我们知道了此箱型图的分布情况:Q1下四分位数3.76、Q3上四分位数12.27,从而计算出IQR四分位距为8.51,上内限为:25.035,下内限为负,我们不予考虑。处于上内限以外的数据是异常值。所以我们考虑把骑行距离大于25.035千米的都视为异常数据,做一层过滤,再绘制骑行距离分布图,从而更清晰地观察骑行距离的分布。

    adderLength_data = data[data["adderLength"]<=25.035]["adderLength"].value_counts().sort_index()
    
    adderLength2_c = (
        Bar({"theme": ThemeType.MACARONS})
        .add_xaxis([round(i,2) for i in adderLength_data.index.tolist()])
        .add_yaxis("骑行距离",adderLength_data.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="骑行距离分布图"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    adderLength2_c.render_notebook()
    

    在这里插入图片描述
    可以看出用户使用共享单车的骑行距离(路径)一般在2千米以内,人们对共享单车的需求定位是短途出行,共享单车运营企业可以针对方圆两千米内缺乏大型交通枢纽的居民住宅区、居民娱乐文化区投放共享单车。

    • 从衡量每辆共享单车的工作量,找出最可能坏的单车

    比较每辆共享单车的工作量可以从三个方面衡量:共享单车的使用次数、共享单车的骑行时间、共享单车的骑行路程。

    但从每辆单车的使用次数去衡量单车的工作量,是有失偏颇,这样会忽略掉单车每一次使用的骑行时长因素,有些单车的使用次数多但每一次的骑行时长短,有些单车的使用次数少但每一次的骑行时长长。

    从单车的骑行时间去衡量每辆单车的工作量似乎更加公正一点,但这样的前提是数据集已经清除了诸如用户忘记关锁等原因造成的异常记录数据。因为如果有单车被用户使用过后忘记关锁,造成10小时都在“骑行”,在从单车的骑行时间去衡量每辆共享单车的工作量时,这样的单车是第一批被拎出去检修的,但它们的工作量并不是最大的。

    相比之下,从骑行路程去衡量每辆单车的工作量会更加公正一点,所以这里选择了从骑行路程去衡量每辆单车的工作量,从而检索出需要被拎出来检修的单车。

    这里以骑行时长作为工作量依据,统计每辆单车的骑行路径,筛选出骑行路径前15的车辆ID,作为需要检修的单车名单,当然筛选出的车辆数量也可以自由定义。

    #找出骑行路程前15名的单车
    workload_data = data.groupby("bikeid").sum()["adderLength"].sort_values(ascending=False).head(15)
    workload_data = pd.DataFrame({'bikeid':workload_data.index,'adderLength':workload_data.values})
    
    table = Table()
    headers = ["bikeid", "adderLength"]
    rows = workload_data.values.tolist()
    table.add(headers, rows)
    table.set_global_opts(
        title_opts=ComponentTitleOpts(title="骑行路程前15的共享单车")
    )
    table.render_notebook()
    

    在这里插入图片描述

    • 找出单车紧缺的地区,从而确定新单车的投放地点

    找出单车紧缺的地区的分析思路:

    选取订单数量最多的8月31日的订单数据作为计算数据

    1. 计算同样经纬度的位置上的单车迁出数:按照bikeid进行排序,一个bikeid有
      多个订单,选取最早时间段的订单数据,对选取的订单数据的起点经纬度进行两次groupby,再调用count()统计同样经纬度的地点上有多少辆单车被骑走。
    2. 计算同样经纬度的位置上的单车迁入数:按照bikeid进行排序,一个bikeid有
      多个订单,选取最晚时间段的订单数据,对选取的订单数据的终点经纬度进行两次groupby,再调用count()统计同样经纬度的地点上有多少辆单车被骑回。
    3. 计算迁入数减去迁出数的差值,如果某地的单车差值小于0,表示某地的单车“有去无回”。通过统计这些单车数量存在亏损较多的地点多分布在哪个地区,确定新单车的投放地点。

    找出单车紧缺的地区的具体分析步骤:

    对原有数据的副本进行对经纬度保留两位小数的转换,从而把原有经纬度相差0.01度以内的经纬度都划分为同一经纬度(实际上是在对经纬度分类),扩大统计的地理范围,简化计算的复杂度,在绘图时避免落点堆积。

    当然选择保留几位小数是要有考量的,当保留2位小数后得到的经纬度一样时,其地球上真实的经纬度相差不会超过0.01度,地表距离相差不会超过1公里。这个值如果过大(0.1度,10公里)过小(0.001度,100米)都不合适。

    #对经纬度保留两位小数
    def change_xy(item):
        item["start_location_x"] = round(item["start_location_x"],2)
        item["start_location_y"] = round(item["start_location_y"],2)
        item["end_location_x"] = round(item["end_location_x"],2)
        item["end_location_y"] = round(item["end_location_y"],2)
        return item
    data = data.apply(change_xy,axis = 1)
    

    选取订单数量最多的8月31日的订单数据作为计算数据,按照bikeid进行排序,一个bikeid有
    多个订单,选取出最早时间段的订单数据,对选取的订单数据的起点经纬度进行两次groupby,再调用count()统计同样经纬度的地点上有多少辆单车被骑走

    data_selected = data[data["date"]==31]
    #一辆自行车一天骑行最早的记录
    early_order = data_selected.groupby(["bikeid"]).apply(lambda t: t[t.start_time==t.start_time.min()])
    out_num = early_order.groupby(["start_location_x","start_location_y"]).count()["bikeid"]
    

    在这里插入图片描述
    把选取的8月31日数据按照bikeid进行排序,一个bikeid有
    多个订单,选取出最晚时间段的订单数据,对选取的订单数据的终点经纬度进行两次groupby,再调用count()统计同样经纬度的地点上有多少辆单车被骑回

    #一辆自行车一天骑行最晚的记录
    last_order = data_selected.groupby(["bikeid"]).apply(lambda t: t[t.start_time==t.start_time.max()])
    #每个区块被骑回来多少单车
    in_num = last_order.groupby(["end_location_x","end_location_y"]).count()["bikeid"]
    in_num
    

    把数据进行组合得到一个DataFrame(negative_block_data),组合后出现的空值用0填补,计算被骑出去单车数量和被骑回来单车数量的差值,计算出的结果存放在新列“gap”中,筛选出有去无回单车数量达5辆的区块数据

    block_out_in_df = pd.DataFrame({"out":out_num,"in":in_num})
    block_out_in_df.fillna(0,inplace=True)
    
    block_out_in_df["gap"] = block_out_in_df.apply(lambda item: item["in"]-item["out"],axis = 1)
    #找出有去无回单车数量达-5辆的经纬度地区
    negative_block_data = block_out_in_df[(block_out_in_df["gap"]) < -4].sort_values(by=["gap"])
    

    在这里插入图片描述
    目前的问题是negative_block_data还只有经纬度,没有地理位置,我们需要进行“逆地理编码”,把经纬度转换为详细的地理位置。这一步我们选择使用高德地图的API进行转换,但是在使用API前需要注册高德账号申请key(密钥)。

    高德开放平台:https://lbs.amap.com/api/webservice/summary,进入控制台—>应用管理—>我的应用—>创建新应用——>…。即会拥有一个专属的key。在调用高德地图的API时,需要附上这个key。
    在这里插入图片描述
    API的URl:https://restapi.amap.com/v3/geocode/regeo,以get的形式向该API获取数据,经纬度信息和key等请求参数放入parameters,一起传送过去。

    def parse_loc(location):
        location_str=str(location[0])+','+str(location[1])
        parameters = {'output': 'json', 'location': location_str, 'key': '42e2546ff2e9a3ac3aa3c001eaebe6ea','extensions':'all'}
        base = 'https://restapi.amap.com/v3/geocode/regeo'
        response = requests.get(base, parameters)
        answer = response.json()["regeocode"]["formatted_address"]
        return answer
        
    location = []
    for i in negative_block_data.index:
        item_result = parse_loc(i)
        location.append(item_result)
    negative_block_data["location"] = location
    
    #新单车投放地点名单
    print(negative_block_data)
    #保存成csv文件
    negative_block_data.to_csv("./negative_block_data.csv")
    

    加上地理位置后整理出的单车紧缺地区名单(一部分)如图
    在这里插入图片描述
    单车紧缺地区的名单数据包含的数据分别是经度、纬度、某地被骑走的自行车总数、某地寄放的自行车总数、某地缺少的自行车数值以及地名。

    整理出单车紧缺地区的名单,我们需要把单车紧缺的地区在地图上标点,绘制地理位置散点图,在这一步中我们采用的是folium。folium是python的一个用来绘制地图,并在地图上打点,画圈,做颜色标记的工具类,使用folium可以制作漂亮的,动态交互的地图。folium还支持交互,比如鼠标点击的地方显示需要展示的内容等等。

    安装folium模块命令:

    import folium
    
    #数据导入
    import pandas as pd
    data = pd.read_csv("negative_block_data.csv", encoding='GBK')
    print(data)
    

    folium默认绘制的是世界地图,我们也可以指定一个坐标(经纬度),来进行地图中心点初始化,因为是针对上海的摩拜单车数据分析,所以这里指定的是上海中心地标[31.233705, 121.471632]。

    #创建地图对象
    import folium
    from folium import plugins
    shanghai_map = folium.Map(location=[31.233705, 121.471632])
    folium.Marker([31.233705, 121.471632], popup='<p style="color: green">上海人民广场</p>',icon=folium.Icon(icon='cloud',color='green')).add_to(shanghai_map)
    marker_cluster = plugins.MarkerCluster().add_to(shanghai_map)
    
    #互动效果-弹出提示popup,实例中,点击一个点,就会弹出当前点击位置的缺少单车数量以及地点名。
    
    for name,row in data.iterrows():
         folium.Marker([row[1], row[0]], popup=folium.Popup('<b>单车数量:</b>{0}<br><b>地点:</b>{1}'.format(int(row["gap"]), row["location"]),max_width=1000),
                  tooltip='点击查看数据').add_to(marker_cluster)
            
    #保存到本地并用浏览器打开
    shanghai_map.save('lackOfBike.html')
    

    注意:

    • folium的地理位置散点图更适合作展示,考虑到加载的顺畅性,不建议读取太大的数据。
    • 其组件会读外网的jquery,如果所在的网络不能访问google可能效果无法展示。解决办法是把渲染生成的html文件里面的jquery的cdn地址替换成国内的镜像:
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    

    换成

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    

    在这里插入图片描述

    • 找出单车聚集和紧缺的地区,确定单车调度(调出和调入)的地点

    单车紧缺的地区名单已在上面统计了出来,接下来我们需要统计有空闲单车聚集的地区,其统计思路和上面找出单车紧缺的地区,从而确定新单车的投放地点基本一致。

    #找出有空闲单车数量达5辆的经纬度地区
    positive_block_data = block_out_in_df[(block_out_in_df["gap"]) > 4].sort_values(by=["gap"])
    #获取经纬度地区对应的地理位置
    location2 = []
    for i in positive_block_data.index:
        item_result = parse_loc(i)
        location2.append(item_result)
    positive_block_data["location"] = location2
    #保存数据
    positive_block_data.to_csv("./positive_block_data.csv")
    

    整理出的有空闲单车聚集地区名单(一部分)如图
    在这里插入图片描述
    接下来我们需要在地图上对单车紧缺和空闲地区进行标点,仍然是采用folium来绘制地理位置散点图。

    import pandas as pd
    import folium
    from folium import plugins
    #导入数据
    data_negative = pd.read_csv('negative_block_data.csv')
    data_positive = pd.read_csv('positive_block_data.csv')
    
    m = folium.Map(location=[31.233705, 121.471632])      
    folium.Marker([31.233705, 121.471632], popup='<p style="color: green;width:100px;height:50px;font-size:20px" >上海中心点</p>',icon=folium.Icon(icon='cloud',color='blue')).add_to(m)
    marker_cluster = plugins.MarkerCluster().add_to(m)
    #缺少单车的地点,数量绘制坐标点
    for i in range(0,len(data_negative.iloc[:,0])):
        x=data_negative.iloc[:,1][i]
        y=data_negative.iloc[:,0][i]
        test = folium.Html("<b>缺少的单车:{}</b></br><p>地点:{}</p>".format(int(data_negative["gap"][i]),data_negative["location"][i]),script=True)
        popup = folium.Popup(test, max_width=1000)
        folium.Marker([x,y],popup=popup,icon=folium.Icon(color='red')).add_to(m)
    #富余单车的地点,数量和绘制坐标点
    for i in range(0,len(data_positive.iloc[:,0])):
        x=data_positive.iloc[:,1][i]
        y=data_positive.iloc[:,0][i]
        test = folium.Html(
            "<b>富余的单车:{}</b></br><p>地点:{}</p>".format(int(data_positive["gap"][i]),data_positive["location"][i]),
            script=True)
        popup = folium.Popup(test, max_width=1000)
        folium.Marker([x,y],popup=popup,icon=folium.Icon(color='green')).add_to(m)
    
    m.save('shanghai_map.html')
    

    在这里插入图片描述
    红点:代表紧缺摩拜共享单车的地点,绿点:代表有摩拜共享单车富余的地点。

    由图表我们可以观察到单车的缺少的地点和单车多余的地点,我们可以从有多余单车的地点将单车调度到缺少单车的地点。

    用户维度

    根据RFM模型进行用户分层,从8个维度进行划分后的用户对应的用户特点如图所示
    在这里插入图片描述
    针对用户类型“user_class”进行统计,统计出各类型用户各有多少人数,绘制出条形图。

    user_class_data = data.loc[:,["userid","user_class"]].drop_duplicates()
    user_class_num = user_class_data["user_class"].value_counts()
    user_c = (
        Bar({"theme": ThemeType.MACARONS})
        .add_xaxis(user_class_num.index.tolist())
        .add_yaxis("各类型用户的数量",user_class_num.values.tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="各类型用户的数量"))
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    )
    user_c.render_notebook()
    

    在这里插入图片描述
    由图所示,新用户的数量位居第二,和第一名的数量相差无几,可以看出,摩拜共享单车的业绩是处于上升阶段的,我们需要对这些用户时不时推送优惠活动,建立与新用户的联系,使其向忠实用户转化;流失用户的数量位居第三,如何制定用户唤回策略也是摆在摩拜面前的一个关卡。

    频次深耕用户、高消费唤回用户和重要价值流失预警用户的数量极少,这说明2016年摩拜单车还是个新企业,其用户结构还不完善。我们可以和有关官方组织合作举办公路自行车马拉松比赛,成为比赛赞助商,提供自行车比赛车辆,从而吸引参赛者更多使用摩拜单车,提高摩拜单车品牌知名度,稳固用户结构。

    各个类型用户的平均消费金额如下
    在这里插入图片描述
    从图中可以看到重要价值用户的平均消费金额位居第一,但其用户数量却仅居第四,与前两名还有一段差距,我们需要采取营销策略提高这部分用户的数量,这类用户的用户特点是最近购买、高频、高消费,说明其对共享单车的使用需求高,我们可以在比如工业区等企业聚居密集、居民区等用车频繁的区域投放单车,扩大消费潜力用户的数量。

    展开全文
  • 本文仅针对公共安全管理领域,区别于警务实战中的数据建模、比对碰撞、数据关联、情报研判等应用,对公安数据分析报告做如下定义:公安数据分析报告是指在公共安全管理领域,通过对事物多维数据的全方位分析,揭示...
  • 基于R语言的数据分析报告

    千次阅读 多人点赞 2021-01-29 20:11:41
    基于R语言的数据分析报告 学号:20215102 姓名:蔡倓 一、数据说明 本文进行数据分析所使用的数据是共享单车运营数据,记录了共享单车租赁的时间、地点、环境(包括季节,温度,湿度)等数据。该数据集来自 kaggle ...
  • 大众点评数据分析报告

    万次阅读 2017-10-09 14:58:15
    特别说明:本篇可视化分析报告数据来源为大众点评,没有特别、任何有针对性的分析目标,是作者为求职所特别准备的。 所有源码&图片:github.com/cyoutetsu/data_report城市和地区餐厅数量直观来看,城市中餐厅的...
  • 2010年左右,还是在上学的时候,学过一门课程叫《数据仓库与数据挖掘》,那还是属于传统数据的时代,我们会讨论什么是数据仓库?什么是数据集市?数据仓库和数据库有什么区别?等等,当我还在苦苦学习这些之时,...
  • 03 SQL查询数据 实验报告

    千次阅读 2018-07-30 01:03:51
    03 SQL查询数据 实验报告  广州大学学生实验报告  ...
  • UCloud数据方舟评测报告

    千次阅读 2015-11-27 10:14:10
    UCloud数据方舟评测报告 一、测试环境: ucloud云主机CentOS6.5 2C4G 一台 二、测试对象: ucloud数据方舟 三、测试公司及部门: 广州云移信息科技有限公司研发中心云平台I部运维组(蒋川) 四、测试内容: ...
  • 数据结构课程设计报告

    千次阅读 2014-06-22 09:14:45
    进一步熟悉VC++开发环境,熟悉用C++完成一个应用程序的设计过程,掌握有关编辑、调试和整合程序的方法和技巧。 通过此设计,了解《算法与数据结构》课程的知识结构;熟悉各算法的实现与使用;体会数据结构在问题...
  • 注:本文于2019年1月31日发表于微信公众号 谈数据(learning-bigdata) 在和一些客户、同事聊数据的时候,发现好多人对于数据相关的一些概念、作用并不是很清楚。这里我针对自己工作接触和学习积累的一些内容给大家...
  • 如何写好一份数据分析报告

    千次阅读 2020-07-01 20:22:00
    三、数据分析报告的写作原则四、数据分析报告的种类1、专题分析报告2、综合分析报告3、日常数据通报五、数据分析报告的结构1、标题页2、目录3、前言4、正文5、结论与建议6、附录六、注意事项 很多人在写数据分析报告...
  • 报告汇总之c语言数据结构报告篇(三) 家谱的查找 代码区 #include <stdio.h> #include <stdlib.h> //创建一个二叉链 typedef struct node { char data; struct node* lchild; struct node* rchild; }...
  • 某公司基于FineBI数据决策平台的试运行分析报告
  • 数据挖掘综述报告

    千次阅读 2013-10-16 09:36:49
    1.数据挖掘产生于发展:  在金融业方面, 数据挖掘的应用突出表现在信用评估和防止欺诈等方面。PaoloGiudici和OliviaParrRud对利用神经网络、logistic回归和决策树方法进行信用评估的相关问题进行了阐述。...
  • 数据结构实验报告 链表

    万次阅读 2016-04-17 17:57:09
    二、实验仪器及环境:PC计算机 windows 7操作系统 CodeBlocks10.05三、实验内容及结果(按照具体实验题目,按照如下格式书写)1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。 2.遍历单向...
  • 如何写好一份数据分析报告

    万次阅读 2017-09-15 10:43:55
    数据分析报告数据分析过程和思路的最后呈现,得出分析的结论并给出解决方案。其本质上是在写一篇有理有据,逻辑性强的议论文。一份数据分析报告由以下几个...在标题的命名过程中,现在有一份关于数据分析师招聘和薪酬
  • 06 数据备份与恢复 实验报告

    千次阅读 2018-07-30 01:09:19
    06 数据备份与恢复 实验报告  广州大学学生实验报告  开课学院及实验室:计算机科学与工...
  • “智能家居”产品数据分析报告 一、目的 ------以艾特公司作为目标分析公司------ 公司不断壮大发展,产品的多元化、发布地区、销售方法等一直是每个产品应该注意到的问题,我们进行以下分析: 搜索各类智能产品的...
  • 数据结构实验报告(一)学生信息管理系统

    千次阅读 多人点赞 2020-01-12 10:58:03
    大二计算机学生报告的汇总 进入计算机专业以来每天的必要工作就是写报告,...报告汇总之c语言数据结构报告篇(一) 学生信息管理系统 代码区 代码说明:此代码所运用的软件是ios系统的x-code #include <stdio.h...
  • 三、实验环境 TC或VC++ 四、实验步骤 1、从键盘输入上述8个整数,存放在数组quick[8]中,并输出值。 2、输出各种排序算法每一趟排序的结果,观察关键字次序的变化。 (1)直接插入排序算法如下: void Insertion...
  • 在当前环境内安装有mysql5.6单实例,引擎类型为innodb,表内数据存储所使用表空间类型为独立表空间。未进行数据库备份,未开启binlog。 导致数据丢失的原因是由于人为误操作使用Delete命令进行删除数据时未添加...
  • EBS数据迁移和报告工具-iSetup

    千次阅读 2010-09-27 19:04:00
    用途:迁移数据转换数据保存配置报告当前配置比较生产环境和测试环境数据的差异
  • 数据报告成品展示(本文) 描述性数据分析 关键字提取分析 评论情感分类建模 LDA主题模型分析 下面是本文的写作框架: 1. 分析背景 1.1 分析原理—为什么选择分析酒店网络评论 ​ 随着互联网的发展, 我们的生活也...
  • 数据库实验报告 数据查询

    万次阅读 2018-06-17 22:29:16
    桂 林 理 工 大 学实 验 报 告班级 软件2班 学号 3162052051734 姓名 梁振宇 同组实验者 实验名称 数据查询 日期 2018年 06 月05 日 一、实验目的:1. 观察查询结果, 体会SELECT语句实际应用;2. 要.....
  • 价值百万的企业大数据分析报告是如何炼成的?

    千次阅读 多人点赞 2017-03-15 14:08:43
    很多企业往往会花高额价钱来请咨询公司对企业的整体经营情况做一个分析,生成一个报告。...现如今企业有了更多的数据来源途径和获取数据手段,一份有效的企业数据分析报告显然能够对企业产生很大的价值。
  • 数据结构实验报告 栈和队列

    万次阅读 多人点赞 2016-04-26 20:30:03
    二、实验仪器及环境:PC计算机 windows 7操作系统 CodeBlocks10.05三、实验内容及结果1.采用链式存储实现栈的初始化、入栈、出栈操作。 2.采用顺序存储实现栈的初始化、入栈、出栈操作。 3.采用链式存储实现...
  • 没有密密麻麻的文字我们还是延续看图说话的风格杭州世平信息科技有限公司专业的数据安全防护专家带你解读《Gartner最新数据安全行业报告》1为什么“数据安全”能够在安全界众多细分市场中脱颖而出,集万千投资商的...
  • R语言数据可视化实验报告

    千次阅读 2020-03-06 18:07:28
    一、实验目的与要求 1.掌握基本绘图系统、Lattice绘图系统、ggplot2绘图系统...实验指导书:《大数据挖掘实验教程》。 三、实验内容(具体的表内容参照实验指导书) 使用基本绘图系统graphics包绘制图形 使用L...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 279,730
精华内容 111,892
关键字:

关于环境的数据报告