基于Java+SVM+ID3的基于工业大数据的故障诊断模型设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于Java+SVM+ID3的基于工业大数据的故障诊断模型设计与实现

文章目录:


  • 基于Java+SVM+ID3的基于工业大数据的故障诊断模型设计与实现(毕业论文+程序源码)
  • 1、项目简介
  • 2、资源详情
  • 3、关键词
  • 4、毕设简介
  • 5、资源下载
  • 6、更多JAVA毕业设计项目

1、项目简介

  1. 在工业设备的运行过程中,自然磨损、设备超载、操作不当等多种原因会导致设备的性能发生下降,甚至于产生故障或者是异常。而通过对设备加装传感器进行监控,获取到设备的实时信息并且加以梳理计算,就可以得到设备各个部位的实时运行状态,从而实现对设备的监控。而如果出现了设备故障现象,则可以通过对历史数据进行数据挖掘、清洗形成故障模型,导入设备的最新运行数据进行故障诊断。
  2. 设备的故障诊断方法可以按照诊断依据分为三种:基于机理模型的方法,基于数据驱动的方法,基于知识工程的方法[1]。本文将采用基于数据驱动的方法中的基于分类的方法进行故障模型的构建。同时为了对比不同分类方法的性能,本文采用了两种分类方式进行比较。
  3. 本文主要研究工作和成果如下:
    (1)建立了以决策树算法为基础的故障诊断模型;
    (2)实现了以支持向量机为核心的数据驱动方法。对支持向量机的核心原理进行了研究,以风力涡轮机齿轮箱的健康数据、故障数据进行了SVM的分类检测,实现了简单的故障诊断;
    (3)比对了两种策略的精度以及其他的一些的性能度量。

2、资源详情

项目难度:中等难度

适用场景:相关题目的毕业设计

配套论文字数:29165个字128页

包含内容:全套源码+配整论文

开题报告、论文答辩、课题报告等ppt模板推荐下载方式:

HMM 模型 JAVA 源代码_支持向量机


3、关键词

故障诊断;工业大数据;数据驱动;决策树;支持向量机


4、毕设简介

提示:以下为毕业论文的简略介绍,项目完整源码及完整毕业论文下载地址见文末。

1 绪论
1.1 选题背景和意义
在计算机行业还未能发展到如今这般规模的时候,人们只能选择抽样的数据、局部的数据和片面的数据,纯粹靠经验、理论、假设和价值观去发现、理解未知领域的规律。而这样做的结果,就是对真实现象的抽象归纳与演绎推理,这就不可避免的包含了各种主观上的因素。同时由于样本的局部性,很多推理归纳出来的结果与实际现象具有极大的偏差。
而如今的所谓大数据,通常都指数据量在“太字节(TB)”即2的40次方以上,一般情况下难以收集、存储、管理以及分析的数据。而且随着科技进步,大数据对于“大”的含义还在不断地刷新。但是大数据不仅仅只关乎于数据量的大小,而且还与其他的因素有着千丝万缕的关系。
大数据其真正的意义在于:我们可以通过各式各样的传感器,实现与真实世界更加紧密、准确的连接。在得到实时数据后进行整合、挖掘、云计算,去逐步的逼近真实世界,挖掘出那些未曾被我们发现的隐藏规律,建立更加符合真实的数学模型,这是大数据的魅力所在。而在大数据的庞大篇幅中,工业大数据占据着相当重要的地位。工业大数据是智能制造的关键技术,它是联通物理世界与信息世界的桥梁,是推动生产型制造向服务型制造转型的动力之一[2]。
而在工业领域,工业大数据的一大发展方向就是故障诊断,数据的产生和记录贯穿于一台设备从投入生产到损耗的全过程,而通过一定数量的智能传感器,我们可以监控某些生产设备的所有信息,使设备在生产线的实时状态远程监控成为可能,这一方面改善了工作人员的工作环境,另一个更为重要的方面就是提高了设备发生故障或者异常时候的反应速度以及排除故障的效率。
伴随着工业生产水平发展的突飞猛进,工业设备精度越来越高,结构越来越复杂,所以在车间内很多设备的故障都未能得到及时的发现和解决,这一点很容易对工厂造成巨大的损失.由于设备愈加复杂所导致的设备故障信息数据呈现指数型增长,而运行时所产生的海量数据,采用传统基于机理模型的方式已经很难负载如此巨量规模的数据分析,进行故障诊断了。
此外,工业设备结构极其复杂,不同模块之间可能会产生故障的交集,人工分析或者是传统的先验知识故障检测手段已经无法准确、迅速的完成故障的诊断。因此,结合工业大数据对工业设备所产生的海量数据进行数据挖掘分析建立故障诊断模型,对于提高设备维护效率、迅速有效解决故障、降低维修费用有巨大意义。

1.2 国内外研究现况及发展趋势
省略

1.3 主要研究内容

(1) 研究数据挖掘算法,采集数据进行模型构建,并且可以根据新的数据进行模型改进、重构;

(2) 研究数据处理方法,如离散化等方法提高故障模型的精度;

(3) 设计人机交互界面,提供显示、检索等功能;

(4) 研究模型的改进方案,如决策树中的“剪枝”方法,对模型进行精简,减少模型构建所消耗的资源。

2 故障诊断的总体设计方案

2.1 故障模型的要求

故障模型应该是基于历史数据构建的,由于我们的模型是基于数据驱动,所以对于机械设备方面的先验知识需求量远小于基于机理模型和基于知识工程的构建方式。另外,我们的模型要能接受新的运行数据,对于数据进行测试,从而进行故障诊断的最终目的。

在精度上,模型的精度应该随着数据的不断完善而改进,构建模型所使用的数据越多,那么我们的模型的泛化程度就越高,对于各种实际情况的解读能力就会进一步提升。另外故障模型的基础是基于工业大数据,对于工业大数据的各个环节都会在具体实现环节中一一对应。

HMM 模型 JAVA 源代码_支持向量机_02

图2-1 工业大数据技术架构

2.2 决策树建立故障树模型
2.2.1 信息熵
假设当前样本集D中有N个样本,而整个样本有k个分类,每个分类对应的样本数量为N_i,那么对于每个分类,他们各自占据的信息量(也可以理解为样本分类的频率)为:
█(P(x_i )=N_i/N (i=1,2,3···k)#(2-1) )
结合每一个分类的信息量,则此样本总体的信息熵为:
█(Ent(D) = - ∑_(i=1)^k▒〖P(x_i )*log⁡(P(x_i )) 〗#(2-2) )
2.2.2 信息增益
假设当前样本集D中有N 个样本,每个样本都有一些属性,假设我们目前取属性A作为我们计算信息增益的属性。
根据属性A,我们可以用属性A的不同取值(假设有v种),将整个样本集D分为v个子样本集D_i (i=1,2,3···v),每个样本子集的样本数为N,那么每一个样本子集的频率为:
█(P(D_i ) = Ni/N = |Di|/|D| (i=1,2,3···v)#(2-3) )
那么该样本集的A属性的信息增益即为:
█(Gain(D,A) = Ent(D)- ∑_(i=1)^v▒〖(P(D_i )*Ent(D_i)〗#(2-4) )
2.2.3 ID3算法
ID3是一种以自顶向下递归的方法构造决策树的贪心算法。其决策树的基本生成策略如下:
(1)树以整体样本作为单个节点开始;
(2)如果当前节点中,所有的样本都属于同一类,则该节点成为叶节点,并标记为当前样本的类;
(3)否则,使用前面提到的信息增益作为判断信息,选择信息增益最大的一个属性作,该各个属性值将成为该节点往下进行分支的依据。在这里,我们假设所有的属性都是可分的,即所有的属性都可以在一个离散值集合内取到,如果该属性为连续值,则该属性必须离散化处理[8];
(4) 基于测试属性的每一个属性值创建一个分支,并将该属性值相同的样本划分到该分支对应的样本子集;
(5)使用类似的方法,递归地形成每个分支延伸对应的样本决策树。一旦一个属性出现在一个节点上,就不必在该节点的后代上考虑这个属性。
ID3算法虽然简单易用,但是也有很多缺陷:
(1) ID3算法缺乏对于连续值的处理手段,而在现实生活中,很多的应用环境都是采集到的连续值;
(2)计算信息增益的时候对于样本频率P(xi)有极大的依赖性,有时候会对模型造成很大的偏差;
(3)对噪声较为敏感,所谓噪声也就是一些在生成模型的时候就给定的错误数据;
(4)采用递归的方式形成模型,而且整个决策树的生成过程对于数据多次读取存写,所以算法较为低效,而且无法应用于大数据量的场合下。

下面是利用这些概念获得故障树的过程:

HMM 模型 JAVA 源代码_支持向量机_03

图2-2 ID3算法生成决策树流程图
为了提高决策树的模型精度,去除掉模型创建时一些错误数据的干扰,有两种剪枝方法可以用于提高决策树的正确分类能力:
(1)预剪枝方法(prepruning),该方法通过提前停止树的向下延伸而对树剪枝。在各个节点向下分支之前,判断通往该分支的样本子集中的判断正确率进行对比,如果在当前节点的正确率高于分支后的子节点,那么就停止生长,这就是预剪枝的主要思想。该方法很多的分支都未曾“展开”,降低了过拟合的风险,而且还显著减少了决策树的训练时间和花销;但是另外一方面,一些分支虽然不能提升整体的泛化性能,但是由其再次展开的分支却有可能导致性能显著提高,而且预剪枝的“贪心”本质给这种方法带来了欠拟合的风险。
(2)后剪枝方法(postpruning),顾名思义,该方法是预先生成一颗完整的决策树,然后从每一个叶节点往上查看父节点,计算如果该父节点进行剪枝成为叶节点后是否会提高判定精度来决定是否剪枝。这种方式直到无法提高决策树性能为止。对比预剪枝方法,后剪枝方法保留了更多的分支。一般情况下,后剪枝方法的欠拟合风险比较小,泛化性能优于预剪枝方法生成的决策树。但是由于后剪枝方法是在决策树生成后在进行的,所以在训练时间和花销上会比预剪枝方法高得多。

2.3 支持向量机二分类原理

2.3.1 SVM原理

支持向量机(Support Vector Machine,SVM)是一种经典的二分类模型算法,基本模型定义为特征空间中最大间隔的线性分类器,其学习的优化目标便是间隔最大化,因此支持向量机本身可以转化为一个凸二次规划求解的问题。

对于二分类的支持向量机学习器,假设数据是线性可分的,这时分类学习的目标就是找到一个合适的超平面来将所有样本分割成两个类别,将不同类别的样本分割到两个区域内。

下图中的点集是低维数据样本表示,而这些数据对应的超平面就是中间那根线。对于点来说,线毫无疑问是处于高维的超平面了。随着维数增加,超平面总是比数据的维数多一维。

HMM 模型 JAVA 源代码_HMM 模型 JAVA 源代码_04

图2-3 二维超平面

但是这样的超平面可能存在多个,我们应该寻找的最优超平面该如何获取呢?

HMM 模型 JAVA 源代码_java_05

图2-4 存在多个划分超平面将两类训练样本分开

直观上看的话,我们应该寻找位于两类训练样本“正中间”的超平面作为我们的最优超平面,因为这个超平面对于整个训练样本局部扰动的“容忍”性能最好。换言之,这个超平面所产生的分类结果是最鲁棒的,对于未知的数据的分类能里最强。

在样本空间中,超平面可以通过如下线性方程表示:

█(ω^T x+b=0#(2-5) )

其中w = (w1;w2;w3;…;wd)是当前数据产生的超平面的法向量,它决定了超平面在高维空间内的方向。b为超平面的位移,决定了超平面与其所在空间的原点之间的距离。既然有了可以用数学方式表达的超平面,那么样本空间中任意一点到超平面的距离也就可以表示为:

█(r=|ω^T x+b|/‖ω‖ #(2-6) )

假设超平面能够正确分类,即对于(x_i,y_i) ϵ D,则有:

█({_(ω^T x + b ≤ -1 ,〖 y〗_i= -1;)T x + b ≥ +1 ,〖 y〗_i= +1;)#(2-7) )

经过计算,我们可以筛选距离超平面最近的几个训练样本,使得上式中的等号成立,这几个样本就称之为支持向量,两个异类(在超平面两侧)支持向量到超平面的距离之和为:

█(γ=2/‖w‖ #(2-8) )

这个距离就被称作“间隔”(margin):

HMM 模型 JAVA 源代码_课程设计_06

图2-5 支持向量与间隔

显而易见的,我们的最终目标,就是找到具有最大间隔的超平面作为最优超平面。那么此超平面需要符合下列特点:
█(max┬(w,b)⁡〖2/‖ω‖ 〗 #(2-9) )
s.t.〖 y〗i (〖 ω〗^T x + b ) ≥ 1, i=1,2…,m;
由此可知,为了得到具有最大间隔的最优超平面,只需要最小化‖w‖^2即可。于是,上式可以改写为:
█((min⁡ )┬(w,b)⁡〖1/2 〖‖ω‖^2〗
〗#(2-10) )
s.t.〖 y〗i (〖 ω〗^T x_i + b ) ≥ 1, i=1,2…,m;
这就是“支持向量机”(Support Vector Machine,SVM)这一方法的基本型。
2.3.2 对偶问题
由支持向量机方法的基本型,我们可以知道这是一个带约束的凸二次规划问题,解决这个问题的较高效的办法是:转化为对偶问题(dual problem)。
具体的解决方式为给每条约束添加拉格朗日乘子 ∂_i≥0, 则上述问题的朗格朗日函数可写为:
█(L(ω,b,α)= 1/2 〖‖ω‖^2〗
± ∑_(i=1)^m▒〖α_i (1-y_i (ω^T x + b)) 〗#(2-11) )
其中α_i=(α_1;α_2;…;α_m),由拉格朗日乘数法的思想,令L(ω,b,α)对ω和b 的偏导为0可以的得到:
█(ω= ∑_(i=1)^m▒〖α_i y_i x_i ,〗#(2-12) )
█(0= ∑_(i=1)^m▒〖α_i y_i ,〗#(2-13) )
利用两个式子代入到L(ω,b,α)中可以消去ω和b,就得到了关于基本型的对偶问题:
█(max┬α⁡∑_(i=1)^m▒〖α_i-1/2 ∑_(i=1)m▒∑_(j=1)m▒〖α_i α_j y_i y_j x_i^T x_j 〗〗#(2-14) )

█( s.t. ∑_(i=1)^m▒〖α_i y_i=0 ,〗#)

α_i≥0, i=1,2,3,…,m.

通过求解出的α_i,我们可以计算得出ω和b,从而得到最终具体的模型:

█(f(x)= ω^T x+b= ∑_(i=1)^m▒〖α_i y_i x_i^T x+b .〗#(2-15) )

█(ω^= ∑_(i=1)^m▒〖α_i y_i x_i^ 〗#(2-16) )
█(b*=-max┬(i:y_i=-1)⁡〖〖ω
〗^T x_i+min┬(i:y_i=1)⁡〖〖ω*〗T x_i 〗 〗/2#(2-17) )

在上述的解答过程中,因为基本型有着不等式的约束条件,所以需要满足KKT(Karush-Kuhn-Tucker)条件:

█(α_i ≥ 0 ;#(2-18) )

█(y_i f(x_i ) - 1≥0 ;#(2-19) )

█(α_i (y_i f(x_i ) – 1)=0 .#(2-20) )

于是对于任何的训练样本,都要有α_i = 0 或者 y_i f(x_i )= 1的限制条件。且必须是满足y_i f(x_i )= 1的样本才会出现在最大间隔边界上,说明这一个样本是支持向量。这一点也就代表着,训练完成后大部分的训练样本都不需要进行保留,只需要留下支持向量的那些样本即可。因为非支持向量的α_i都等于0,去除之后不会对模型产生什么影响。

模型建立完毕之后,在对新的数据点进行分类时,实际上就是将这个新的数据点x^*代入到分类函数 f(x)= ∑_(i=1)^m▒〖α_i y_i x_i^T x+b〗 中,若f(x)得出来的结果大于0,则为正类,否则为负类。

2.3.3 SVM核函数

假如训练样本线性不可分,放到我们最开始的例子里面的意思就是:我们无法用一条直线将所有的样本正确分类为两类。如下面的“异或”问题:

HMM 模型 JAVA 源代码_java_07

图2-6 异或问题

HMM 模型 JAVA 源代码_课程设计_08

图2-7 非线性映射

对于这种情况,我们可以将原始空间的训练样本映射到一个更高维度的特征空间,使得样本在这个特征空间内线性可分[9]。
令ϕ(x)表示将x映射到高维空间中的特征向量,那么对比前面线性可分的模型表示,同理可以得到相应的高维空间模型为:
█(〖f(x)= ω〗^T ϕ(x)+b#(2-21) )
同理可得:
█((min⁡ )┬(w,b)⁡〖1/2 〖‖ω‖^2〗_ 〗#(2-22) )
s.t.〖 y〗i (〖 ω〗^T ϕ(x_i) + b ) ≥ 1, i=1,2…,m.
同样可以得到对偶问题,如下:
█(max┬α⁡∑
(i=1)^m▒〖α_i-1/2 ∑_(i=1)m▒∑_(j=1)m▒〖α_i α_j y_i y_j ϕ(x_i )^T ϕ(x_j ) 〗〗#(2-23) )
s.t. ∑_(i=1)^m▒〖α_i y_i=0 ,〗
α_i≥0, i=1,2,3,…,m.
映射后的特征空间维数可能会很高,会极大地加大我们训练时间和内存开销,直接计算〖ϕ(x〗i^T)ϕ(x_j) 不一定可行。为了避开这个不稳定的区域,我们可以假设存在这样一个函数:
█(κ(x_i,x_j )= <ϕ(x_i ),ϕ(x_j )= 〖ϕ(x_i )〗^T ϕ(x_j )#(2-24) )
即在高维特征空间中映射向量的内积,与在原始样本空间中通过核函数κ(x_i,x_j )计算后的结果等效。这就是“核技巧”。上述式子可以改写为:
█(max┬α⁡∑
(i=1)^m▒〖α_i-1/2 ∑_(i=1)m▒∑_(j=1)m▒〖α_i α_j y_i y_j κ(x_i,x_j ) 〗〗#(2-25) )

s.t. ∑_(i=1)^m▒〖α_i y_i=0 ,〗
α_i≥0, i=1,2,3,…,m.
求解之后可以得到:
█(f(x)= ω^T ϕ(x)+b= ∑_(i=1)^m▒〖α_i y_i κ(x_i,x_j )+b .〗#(2-26) )
在线性不可分的情况中,核函数的选择是影响SVM模型的性能至关重要的因素。在明确特征映射的形式之前,我们并不知道具体选择哪一种核函数,而且核函数的选择也隐式的定义了特征空间。如果在模型的构建过程中选择了错误的核函数,那么由此建立的支持向量机模型的性能将会下降许多。
下列几种常用的核函数:
表2-1 常用核函数表达式及其参数说明
名称 表达式 参数
线性核 κ(x_i,x_j )= x_i^T x_j
多项式核 κ(x_i,x_j )=(x_i^T x_j )^d d ≥ 1 为多项式的次数
高斯核 κ(x_i,x_j )= exp⁡(-‖x_i-x_j ‖2/(2σ2 )) σ > 0 为高斯核的带宽
拉普拉斯核 κ(x_i,x_j )= exp⁡(-‖x_i-x_j ‖^ /σ^ ) σ > 0
SIGMOD核 κ(x_i,x_j )= tanh(βx_i^T x_j+θ) Tanh 为双曲正切函数
β>0,θ<0

此外,函数相互组合也可以得到核函数:

如果κ_1 和 κ_2 都是核函数,那么对于任意正数γ1,γ2其线性组合:

█(γ1κ_1+γ2κ_2#(2-27) )

也是一个核函数;

如果κ_1 和 κ_2 都是核函数,那么核函数的直积:

█(κ_1⊗κ_2 (x,z)=κ_1 (x,z) κ_2 (x,z)#(2-28) )

也是一个核函数;

如果κ_1 是一个核函数,那么对于任意函数g(x):

█(κ (x,z)= g(x) κ_1 (x,z)g(z)#(2-29) )

也是一个核函数。

3 具体方案设计

3.1 数据获取

目前主要的数据获取手段是通过互联网上的共享数据集,当前已经获得的数据集合有两个,其中一个用于初步测试,一个用于最终模型构建:

一个是来自罗马的一家通信科学研究所:Semeion Research Center of Sciences of Communication

该数据主要用于测试模型,数据特性如下:

HMM 模型 JAVA 源代码_支持向量机_09

图3-1 钢板数据集属性

第二个数据集来自Github上一个Fault Diagnosis项目的自带的风力涡轮内部齿轮箱数据集。该Github项目地址为:Gearboxdata/Gear-Box-Fault-Diagnosis-Data-Set

该数据集内的数据分为两类,即正常运行数据和故障/异常状态下的数据。每一类数据下又按照0-90的不同载荷百分比,每10个百分点负载一个层次分为10种运行状态。合共20个文件,一共2021119条记录,每条记录包括载荷百分比在内一共5个属性。

HMM 模型 JAVA 源代码_HMM 模型 JAVA 源代码_10

图3-2 风力涡轮齿轮箱数据集属性

这些数据虽然是连续的,但是经过一定的修改,比如固定为小数点后一位精度,这样可以很轻易的将其离散化,虽然对于精度有一定的影响,但是为了是的数据更为集中,不会出现一条数据记录就是一个分支的情况,离散化势在必行。而且后期新增了基于信息熵的离散化功能,可以很方便的进行区间划分从而提高预测的准确率。
数据整理我采用的是C++编码来实现的,因为C++对于数据读取有较好的速度支持,而且格式化能力也比较完善。主要的代码如下(GearData.cpp):

for (int i = 0; i < 10; ++i)
{
    file="/Users/zhangzhaobo/Documents/Graduation-Design/Data/BrokenTooth Data/b30hz"+hz[i]+".txt";
    ifstream in(file);
    while(in>>data[0])
    {
        out<<setprecision(2)<<data[0]<<"\t\t";
        for (int i = 1; i < 4; ++i)
        {
            in>>data[i];
            out<<setprecision(2)<<data[i]<<"\t\t";
        }
        out<<endl;
    }
    cout<<file<<" is done!"<<endl;
    in.close();
}

3.2 数据存取

3.2.1 本地环境

如此大量的数据,采用文本读取这种方式很容易出现错误,所以结合数据库知识,最终选定了Mysql数据库作为工业大数据架构的数据存储层。

在安装好Mysql之后,建立Graduation_Design数据库,在其中建立了gear表格作为风力涡轮齿轮箱数据的存储表。表格信息如下:

mysql> show columns from gear;

HMM 模型 JAVA 源代码_HMM 模型 JAVA 源代码_11

图3-3 齿轮箱数据存储格式

数据的存入与读取都是依赖于Java的一个外部包mysql-connector-java.jar(JDBC),导入至本地项目后可以调用JDBC中的内置类,通过实例化一个数据库连接对象进行数据的存取。为了封装驱动,连接,会话等JDBC内容,新建了一个Mysql_Connect类提供数据库连接(Connect()),会话(getStatement()),断开连接(Dis_Connect())三个数据库常用的功能。
存储的过程中,由于数据量的问题,如果采用单条记录提交一次的方式进行两百万条数据的存储,那么一共需要两个小时,但是采用JDBC自带的批处理操作Batch,可以将这个时间减少一半。具体操作如下:

String INSERT = getInsertQuery(id, Name, line);
statement.addBatch(INSERT);
id++;
count++;
//执行批量执行
if (count>40000) {
    statement.executeBatch();
    count = 0;
}

通过批处理操作,每一次与数据库的交互都能提交四万条数据,可以极大地减少Mysql连接,认证等的时间花销,提高存储效率。
而读取数据的时候,由于Decision Tree算法与Support Vector Machine算法需要的数据结构不同,所以定义了两个数据读取类,分别为:ReadData.java与SVMReadData.java,在ReadData.java中定义了静态方法getSelectQuery()提供给所有需要生成查询语句的类调用。
另外每一个数据库读取类都提供了readTrainData()和readTestData()两类读取方式,提供给用户有选择的从数据库中读取出指定数量大小的数据记录。
数据读取的时候还需要一个Parameter类进行辅助,在这个类里面可以定义训练集与验证机的比例,训练集或者验证集的大小。每一个Parameter类内部定义了静态变量:训练样本数,测试样本数,以及二者之间的比例三个变量值。三者之间相互调节,并且因为静态变量的特性作用于全局。这样做的好处是不论在项目中定义多少个Parameter实例化对象,只需要在任意处调用调节方法进行修改,就可以直接作用于全局,保证不同方案之间的数据量一致性。

3.2.2 大数据平台环境
【实验环境】 HPC高性能计算机集群
【操作系统】 Linux RedHat
【硬件配置】 2*8核CPU,64GBDDR3内存,300GB本地SAS磁盘,千兆以太网卡,InfiniBand网卡,Lustre文件系统,RedHat Enterprise Linux6.2,内核版本2.6.32
【计算框架】 Hadoop

3.3 决策树实现
3.3.1 连续属性值离散化
因为获取的数据为浮点数表示的连续值,如果给每个取值开一个分支显然不可行,就算是将精度降低到0.1,那么五个属性延展开来最后还是会超过上亿种分支的可能,显然这个数量级对于及于决策树的分类问题是很不友好的,所以在进行模型构建之前需要进行数值离散化处理。
离散化常用方法为二分法。给定样本集D与连续属性a,二分法试图找到一个划分点t将样本集D在属性a上分为a ≤ t与a > t。但是这一点对于我们的数据规模和跨度不合适,所以采用一种基于熵的离散化方法[10]。
当频率(或概率)分布具有最大的属性值个数时,熵(或信息)被最大化[11]。当我们单独将某一个属性所有的值与对应的分类结果拿出来做一个单属性样本集X的时候,我们可以自定义若干个区间对属性进行区间分割,然后根据前面的信息熵的计算公式,计算出这个样本集的信息熵H(X)。另外根据凸函数的性质:
█(f(λx_1+(1-λ) x_2 )≤λf(x_1 )+(1-λ)f(x_2 )#(3-1) )
由参考文献中提到的离散化算法(EADC),可以将每个连续属性离散化为若干区间,区间数目由数据本身决定(但是最小区间划分数目为10个),之后找到合并两个区间后使得合并前后熵差最小,然后保存划分点,继续合并直到达到最佳平衡为止。是否达到最佳平衡的度量公式为:
█(h=(k_max-1)H§-H_max §(k-2)#(3-2) )
式中,kmax表示最大区间数,Hmax§表示最大熵值。在实际操作中,对其进行简化,取40个划分区间下的对应值。
连续属性离散化之前,决策树的数据精度设置为1,正确率一直在30%左右;离散化后,数据精度设置为0.1,正确率随着训练数据量增长而增长。训练数据量为1000条左右时正确率为35%左右,当数据量提升到20000条左右时,准确率有53%左右,而SVM数据因为不需要划分区间,所以正确率的增长与数据量的线性关系并不明显,从1000条数据到两万条数据仅仅波动了1%的正确率不到。可见决策树的正确率的提高,在初期更加依赖于训练数据量的积累。

整个离散化的过程如下:

从本地数据库读取设备运行记录数据,格式化后以实参形式传入到EADC离散化方法中;

在离散化方法中,针对单一的属性,取出其所有的值和分类数据,并且按照属性值进行排序;

排序后根据初始区间数划分区间,并且利用公式(2-2)的熵的计算公式,计算出改属性的初始熵,并且将度量数值Ck 预设为0 ;

先遍历整个区间集合,依次尝试合并两个相邻区间,记录每一次使合并前后的熵差,最后选择熵差最小的两个相邻区间进行合并,并且重置划分点,保存合并后的熵值;

根据上面的公式(3-2)提供的度量公式,计算出当前合并和后的度量值 Ck-1 = h;

如果Ck-1 > Ck ,那么令k = k - 1,跳回到第(4)步循环进行区间遍历、合并、计算;

如果Ck-1 < Ck ,保存当前的区间划分,结束区间划分进程;

将最后的区间划分点返回至EADC方法调用者,由其对实际数据根据划分点进行离散化处理。

离散化流程图如下:

HMM 模型 JAVA 源代码_支持向量机_12

图3-4 连续属性值离散化流程图

3.3.2 样本初始化
决策树的核心算法是ID3算法,其他的数据结构,数据处理等都是辅助内容,但是样本初始化在整个体系中也是举足轻重的。
首先定义属性名列表attribute,也就是四个传感器的位置和负载百分比,然后是在此基础上增加一个分类属性名重新定义一个列表attributr_Names,作为读取数据库内容时候的列名:
String[] attribute = new String[] {“Sensor1”,“Sensor2”,“Sensor3”, “Sensor4”, “Load”};
String[] attribute_Names = new String[] {“Sensor1”,“Sensor2”,“Sensor3”,“Sensor4”,“Load”, “category”};

当属性列表定义完毕之后,就会进入Decision Tree算法的样本读取方法,readSample()。在这个方法中,通过在前面数据库模块定义的ReadData类中的readTrainData()方法读取出数据之后进行样本整合。具体的操作为:

定义一个Sample类,内含属性名及其对应的属性值;

对读取出来的二维数组逐行读取,每一行定义为一个Sample实例;

按照所有实例的分类,定义与分类数目相同的链表,读取当前样本的分类,并且将当前Sample添加到相应的链表上去。如果没有这个分类,就新添加一条链表。

最后返回的数据结构为类别为键,包涵所有此类样本的链表为值的键值对Map。

样本初始化整体流程如下:

HMM 模型 JAVA 源代码_数据_13

图3-5 样本初始化流程图

3.3.3 生成决策树

在样本初始化完毕后,就进入生成决策树的阶段。调用定义的generateDecisionTree()方法,传入样本集和属性列表。就可以得到一颗基于此样本集,用ID3算法构建的故障树了。

//生成决策树

Object decisionTree = generateDecisionTree(samples,attribute);

在这个方法当中,ID3算法担任了求出信息增益最大的属性的责任。整个generateDecisionTree()方法采用递归的方式,不断地向下延伸分支,直到将当前节点归类为叶节点才会停止。

流程解释如下;

(1) 判断是否当前分支的样本数目,如果为空或者分类只有一种,那么将当前样本的类别作为叶节点的分类;

(2) 如果属性用完,或者是同一个属性值对应的样本子集中无法通过数目将此节点归类,那么采用后验分布进行归类;

(3) 如果上述条件都不满足,那么就使用ID3算法计算出当前的分支属性,并且读取该分支属性的各个属性值构成分支向下延伸(进入递归),直到遇到上述的条件成为叶节点为止;

(4) 当满足生成叶节点的条件时,则递归止步于当前节点,当前节点作为叶节点返回至其父节点,直至抵达根节点为止。

整体流程如下:

HMM 模型 JAVA 源代码_数据_14

图3-6 决策树生成流程示意图

至此,整个决策树就已经训练完毕了。我们从这一系列的操作中得到了一个Tree类的实例对象。每一个Tree都是由一个根节点和一系列的分支组成,除了叶节点不是Tree类型外,其他的子节点都是Tree类型。这一点也为我们提供了一个良好的搜索环境。只要检测当前节点是否为Tree类型,就可以判定是否已经搜索到了子节点了,这一特性在后面的数据测试中将会用到。

而在上面生成决策树时用到的ID3方法,下面进行详细的解释:

传入一个样本集,一个属性列表;

样本集形式为分类与此分类对应的所有样本,注意此处为分类而不是属性值;

对每一个属性值进行信息增益的计算,具体的实现方式为:

读取当前属性值,拿到一个键值对,【所属类别–>样本集】

解析键值对,分解出key和value,其中key为类别,value为此类别所有的样本

对于Value里边读出来的每个样本,分别读取当前属性下的值,然后建立起来当前属性值相同的所有样本的样本集;

建立起了所有属性值对应的样本子集后,再在此样本子集的基础上按照分类的不同进行子集划分,相当于是二次划分样本集;

最终得到的数据结构如下:

HMM 模型 JAVA 源代码_课程设计_15

图3-7 ID3信息增益计算的数据结构
根据上面的数据结构,计算每一个属性值的信息熵,然后结合所有的属性值计算出这个属性所对应的信息增益,最后得到信息增益最大的那个属性,即可将此属性的下标,对应的信息增益以及由这个属性所衍生出来的样本集打包成一个数组返回。
至此,ID3算法执行完毕,返回一个数组供generateDecisionTree()方法选择下一个分支的属性,并且递归调用自身产生子树分支。

3.3.4 数据测试类

数据测试类接受一个模型obj,一个属性名列表Attr_Name,一个测试数据(属性值)列表TestData,这三个参数用于测试数据;另外由于需要对外开放测试结果,还接受一个字符串变量line用于递归返回最终结果。下面是TestData.java的定义:

public static String TestData(Object obj, Object[] Attr_Name, Object[] TestData,String line) {

基于既定的决策树模型,从根节点出发,根据传入的测试数据选择分支,一路向下,直到抵达叶节点,或者无法找到向下的分支为止。流程解释如下:

判断传入的obj类型是否为Tree,如果不为Tree,代表着已经到了叶节点,可以根据当前节点的值来找到对应的分类;

如果obj是Tree类型,找到obj对应的属性名,然后根据属性名找到测试数据的值,同时新建立一个未曾使用的属性名列表和对应的测试数据列表(长度等于原来的列表减一);

遍历当前节点的每个分支,找到属性值等于测试数据的那一条;

将分支对应的子树以及(2)中建立的两个新列表,还有line传入新的TestData()中,递归调用,返回line;

数据测试类被定义为静态类,所以可以直接在GUI后台程序中调用而不用考虑是否定义实例。在GUI中的命令处理环节,有两个部分运用到了TestData()这个方法,一个是test,这个命令可以单独对一组数据进行测试;而另外一个autotest则是对已经加载好的数据测试文件进行解读后,直接批量测试,最后得出准确率,结合SVM下的准确率一起显示在消息提示栏。每一次测试数据的整体流程图如下:

HMM 模型 JAVA 源代码_课程设计_16

图3-8 数据测试流程
3.4 支持向量机实现
SVM由于其复杂性较高,而且网络上已经有了相当成熟的软件包可以直接取用,所以我最后借鉴了台湾大学林智仁教授的LibSVM包中的Java部分。
这个包的对外内容由四个,分别是svm_toy,svm_scale,svm_train,svm_predict。我用到的是后面两个svm_train 和 svm_predict。其中svm_train是训练模型用到的实现代码,svm_predict是在实际使用过程中使用模型进行数据分类的实现代码。
为了配合GUI的显示,将这些内容整合到了一个类:ZZB_SVM.java中,确保可以全面的调用这些包内的方法并且返回需要的数值。代码如下:

import java.io.IOException;
import java.text.NumberFormat;

public class ZZB_SVM {
    public static Float main() throws IOException {
        SVMReadData sr = new SVMReadData();
        Parameter par = new Parameter();
        String trainFileName = sr.readTrainData(par);
        String testFileName = sr.readTestData(par);
        //训练使用的数据以及训练得出生成的模型文件名。
        String[] trainFile = { trainFileName, "model.txt" };
        //测试数据文件,模型文件,结果存放文件
        String[] predictFile = { testFileName, "model.txt","predict.txt" };
        System.out.println("........SVM Start..........");
        long start=System.currentTimeMillis();
        svm_train.main(trainFile); //训练
        System.out.println("Usage of Time : "+(System.currentTimeMillis()-start));
        //预测
        float x = svm_predict.main(predictFile);
        return x;
    }

该类的main()方法最终将返回一个测试正确率的浮点数。静态方法main()的调用位置在人机交互界面类GUI.java中调用并且显示。

在对LibSVM的使用过程中,均使用默认的选项进行模型训练。下面是对于SVM分类建模过程有较大影响的参数解释:

SVM类型设置(SVM type):默认为C-支持向量分类机,参数C是惩罚系数,C的数值与对错误分类的惩罚成正比例关系。因此,惩罚系数对于模型预测的精度有较大的影响;

核函数设置(kernel type):默认为径向基函数 (Radial Basis Function,简称为RBF函数),在本次试验中采用高斯核函数,见表2-1中第三条;

gamma:核函数中的gamma函数设置,此背景下默认为0.25;

eps:允许的终止判据,类似迭代精度(默认0.001)

shrinking:是否使用启发式,0或1(默认为1)

3.5 人机交互界面设计

人机交互界面采用一个名为GUI.java的类来实现,其采用Java的awt和Swing两个专用于GUI编程的自带库来实现各个组件。在ZZB_JCS.java的main方法中定义一个GUI.java的实例化对象后,其以线程的方式独立于主线程存在,不过在主线程运行完毕之前会将构建的决策树模型以及其他一些会在人机交互中用到的变量,通过定义的静态方法传入到GUI的实例对象中,从而实现从后台到前台的过渡。

GUI整体由一个大框架,12个Label文字标签、1个文字输入栏,3个按钮组成。初步效果如下:

HMM 模型 JAVA 源代码_课程设计_17

图3-9 人机交互界面展示

另外配有两个菜单栏提供功能显示:

HMM 模型 JAVA 源代码_java_18

图3-10 菜单栏

3.5.1 界面组件介绍

在主程序的后半段,会将决策树算法处理数据后生成的决策树模型传入到GUI线程实例中,然后在此基础上,将决策树模型分段在GUI上展示。Line1-Line10就是用于展示决策树模型的。最上方的“指令输入框”作为提示,表示下面的输入框的作用。在文本输入框中键入对应的指令即可调用不同的系统命令执行包括测试数据,自动加载测试数据,退出,决策树展示换行等不同的功能。部分命令按钮会在首次加载GUI的时候以弹窗形式告知。

HMM 模型 JAVA 源代码_数据_19

图3-11 初始化人机交互指令提示弹窗

按照提示,在命令框中输入“HELP”会显示所有的命令:

HMM 模型 JAVA 源代码_数据_20

图3-12 help命令弹窗
底部的两个按钮则是用于查看决策树模型的辅助按钮。Button-CLEAR用于直接清空Label的输出,恢复到模型展示初始状态,也就是初始化的时候的样子,效果等同于在命令输入框输入clear这条指令。而Button-NEXT则是等同于在命令框输入next这条指令的效果,调取下一个十行决策树模型展示。
在最底部还有一个Label,这个Label用于响应如test,Load等无法直接在界面组件上展示效果的各种命令。如果命令错误,那么在底部会显示Error报错;如果是进行数据测试,那么会在最后这一条Label上展示出结果;如果是如加载数据的“Load”指令,则会在底部显示加载结果。
省略

4 性能分析

4.1 性能度量

本次设计采用了两套方案,我们就需要评估方法来对性能进行评估以便我们选择更好的模型构建方式。性能测试采用“测试集”来测试模型对于新样本的分类能力。最后以测试集上的误差来作为实际误差的近似。

测试集的获取的方式有几种,本次采用“留出法”。即将一个样本集D划分为两个,一个作为模型训练集S,一个作为模型测试集T,满足D=S∪T且S∩T=∅,常见的划分方式为分层抽样数据后取出三分之一到五分之一作为测试集。这一点模型通过Parameter这个类中的静态变量来定义。

private static int rate = 2;

private static int trainNum = 20000;

private static int testNum = trainNum/rate;

所有的数据数量都来自于这个类中的静态变量。

在GUI界面中提供了autotest进行批量的数据测试,最终结果显示在消息栏。里面有DecisionTree的精度和SVM的精度表示。而由【错误率+精度=1】就可以知道错误率。

另外,还引入查准率(precision)P和查全率(recall)R的概念。对于二分类问题,分类结果的混淆矩阵和上述两种概念的定义如下:

表3-1 混淆矩阵

HMM 模型 JAVA 源代码_支持向量机_21

查全率P定义:
█(P=TP/(TP+FP)#(4-1) )

查准率R定义:

█(R=TP/(TP+FN)#(4-2) )

4.2 决策树性能度量

决策树的精度对数据数量很敏感,数据量少的时候精度较低,数据量提升之后精度会随之提高。而SVM则对数据的数量要求较低,在连续属性离散化的部分曾介绍过。下面是用各种大小的训练数据量下得出来的“数据量-精度”图:

HMM 模型 JAVA 源代码_数据_22

图4-1 决策树“数据量-精度”关系图

下图中分别显示了精度(Accuracy)、查全率(Precision)、查准率(Recall)在各种数据下的对应值。

HMM 模型 JAVA 源代码_支持向量机_23

图4-2 三种度量与数据量的关系图

从两图分析可知:
整体上决策树的预测结果精度与数据量有关,据趋势可以看出来,数据量越大,预测精度就会越高;
数据量与查全率的关系不大,查全率是尽可能将更多的情况考虑到的数值度量;
可以看到查准率随着数据量的提高甚至略有下降趋势,查准率表示对预测结果正确性要求的度量;
在数据量较大的时候,查全率与查准率二者之间会产生矛盾。如果希望将大部分的正例都选出来,那么可以通过提高选取的样本数量提高来实现,但是这样的话就会使得查准率降低,如我们上面图形中所示;而如果希望查准率高,那么就尽量让选中正例的范围变大,因为我们有连续属性离散化的过程,所以当数据较多时,离散化区间较多,区间细分程度更高,以至于查准率会稍有降低。

4.3 支持向量机性能度量

支持向量机的性能度量主要是精度,在运行时间上SVM比决策树同等数据量规模下所花费的时间更多,所以主要对比二者之间的精度。

相比于决策树,SVM显然受数据量的规模影响小得多,而且SVM由于其本身性质,对于错误数据的敏感程度取决于惩罚系数的大小。所以哪怕错误的数据不是很多,在很多情况下也会造成较大的影响。

下面是SVM的精度与数据量的关系图:

HMM 模型 JAVA 源代码_课程设计_24

图4-3 SVM “数据量-精度”图

从图中分析,对比决策树从30%~60%的波动,SVM 50%~60%的精度波动范围显然受数据量的影响较小,但是从整体趋势上看,SVM的精度也会随着数据量的增大微弱的提高。

另外,下表中利用多项式拟合与对数拟合进行了整体趋势的推导,可以预见决策树在数量级更高时有更好的表现:

HMM 模型 JAVA 源代码_支持向量机_25

图4-4 决策树、SVM精度拟合曲线

5 结论
5.1 全文总结
本次设计内容总体达到了预期进度,成功的建立了故障诊断的模型和人工交互界面。并且通过划分训练集和测试集,实现了对故障或者异常情况的推理。
本次设计所采用的数据均为连续性数据,在支持向量机的模型中影响不大, 但是对于决策树模型的精度影响十分之大。后来经过EADC算法的离散化处理,决策树模型的精度有了很大的进步。而且在性能分析中提到:决策树对于数据量十分敏感,在运行环境的最大承载能力下,决策树的精度能达到58%左右,而且上升趋势仍然十分明显。由此可见如果将决策树模型应用于实际生产环境,辅之以足够的运算能力,也会有一定的实际应用价值。同时因为模型的计算过程较快,所以数据的更新迭代可以周期性的展开,确保数据驱动所使用的数据都是近期的历史数据,紧随着生产设备的实际情况而更新。不用过多的拘泥于过往的先验知识。
当然,基于数据驱动模型的缺陷也是显而易见的:对于未曾出现过的故障类型或者是异常数据,就会有无法处理或者是判定错误的现象,在这一点上钟福磊的混合故障诊断模型显然更加具有实用性。
另外借鉴与LibSVM的支持向量机模型由于其集成度很高,内部相当完善,所以在数据量的变化过程中具有较好的表现。但是由于其在运算时所需要的时间与内存等相较于决策树模型更多,而且其精度与数据量的关系远没有决策树那么明显。
所以在实际的应用中,决策树适合于数据量较大,对于精度要求高,易于理解的场合中。而且本次设计的GUI界面配套了决策树的输出,利于操作人员理解使用。而SVM更加适合于数据量较小,但是对于精度有一定要求的场合。

致谢
省略

参考文献
[1] 钟福磊. 工业大数据环境下的混合故障诊断模型研究[D].西安电子科技大学,2015.
[2] 卫凤林,董建,张群.《工业大数据白皮书(2017版)》解读[J].信息技术与标准化,2017(04):13-17.
[3] 王建民.工业大数据技术[J].电信网技术,2016(08):1-5.
[4] 张鹏. 基于卡尔曼滤波的航空发动机故障诊断技术研究[D]. 南京: 南京航空航天大学, 2009.

[5] 徐德民, 刘富樯, 张立川等. 基于改进连续-离散无迹卡尔曼滤波的水下航行器故障诊断 [J]. 西北工业大学学报, 2014, 32(5): 756-760.

[6] Frank P M. Fault diagnosis in dynamics systems using ana-lytical and knowledge-based redundancy: a survey and some new results[J]. Automatica, 1990, 26(3): 459-474.
[7] Reis M S, Gins G. Industrial Process Monitoring in the Big Data/Industry 4.0 Era: From Detection, to Diagnosis, to Prognosis[J]. Processes, 2017, 5(3): 35.
[8] 张媛.采用数据挖掘技术中ID3决策树算法分析学生成绩[J].科技信息,2009(06):537
[9] 周志华 著.机器学习[M], 北京: 清华大学出版社, 2016年1月. (ISBN 978-7-302-206853-6)
[10] 贺跃,郑建军,朱蕾.一种基于熵的连续属性离散化算法[J].计算机应用,2005(03):637-638+651.
[11] COVER TM, THOMAS JA. Elements of information theory[M].New York: John Wiley & Sons, 1991.
[12] 鲁峰, 黄金泉, 孔祥天. 基于变权重最小二乘法的发动机气路故障诊断[J]. 航空动力学 报, 2011, 26(10): 2376-2381.

[13] 朱霄珣. 基于支持向量机的旋转机械故障诊断与预测方法研究[D].华北电力大学,2013.
[14] 易辉. 基于支持向量机的故障诊断及应用研究[D].南京航空航天大学,2011.
[15] 王振华,杜宇波.基于ESMD和SVM的滚动轴承故障诊断[J].现代制造技术与装备,2018(01):122+124.
[16] Yang Li,Yan Qiang Li,Zhi Xue Wang. Fault Diagnosis of Automobile ECUs with Data Mining Technologies[J]. Applied Mechanics and Materials,2011,1069(40).
[17] Xiao Rong Cheng,Qiong Wang. An Improved ID3 Algorithm for Power Equipment in Green Power Engineering[J]. Applied Mechanics and Materials,2013,2488(340).
[18] Huan Huang,Natalie Baddour,Ming Liang. Bearing fault diagnosis under unknown time-varying rotational speed conditions via multiple time-frequency curve extraction[J]. Journal of Sound and Vibration,2017
[19] Guo Ping Li,Qing Wei Zhang,Ma Xiao. Fault Diagnosis Research of Hydraulic Excavator Based on Fault Tree and Fuzzy Neural Network[J]. Applied Mechanics and Materials,2013,2308(303).
[20] 盛博, 邓超, 熊尧等. 基于图论的数控机床故障诊断方法[J]. 计算机集成制造系统, 2015, 06: 1559-1570.
[21] 李晗, 萧德云. 基于数据驱动的故障诊断方法综述[J]. 控制与决策, 2011, 26(1): 1-9+16.
[22] 刘强, 柴天佑, 秦泗钊. 基于数据和知识的工业过程监视及故障诊断综述[J]. 控制与决策, 2010, 25(6): 801-807+813.
[23] Zhang, Liangwei. Big Data Analytics for Fault Detection and its Application in Maintenance[J], 2016
[24] Jay Lee, Hung-An Kao, Shanhu Yang. Service innovation and smart analytics gor Industry 4.0 and big data environment[J]. Percedia CTRP, 2014, 16:3-8.
[25] 邳文君,宫秀军.基于Hadoop架构的数据驱动的SVM并行增量学习算法[J].计算机应用,2016,36(11):3044-3049.
[26] 赵华,苏东,乔文生.TBM主变速箱的状态监测与故障诊断[J].建筑机械化,2003(06):44-45+43.
[27] 徐牧. 基于SVM的变压器故障诊断研究[D].安徽理工大学,2017
[28] 罗雨滋,付兴宏.数据挖掘ID3决策树分类算法及其改进算法[J].计算机系统应用,2013,22(10):136-138+187.