根本题目
工业生产过程中会产生大量的数据,比如电压、温度、流量等等,它们随时间推移而不停产生,这些数据在多数环境下是正常的,否则生产无法正常举行;少数环境下,数据是非常的,生产服从会低落乃至发生事故。在庞大变乱(如事故)发生之前,通常会在运行数据上有所表现,比如电流突然上升,后续很可能断电,造成一些不须要的丧失,假如及时发现电流增大这一信号,及时找到缘故起因并处理则可以将丧失降到最小。因此及时发现非常数据并报警,提示操作职员举行相应的操作,可以提高生产服从并克制事故发生。
当前工业界常用的非常发现机制很简单,一样寻常是凭经验设置一个范围,当仪表凌驾该范围时就以为是非常。这种方式过于简单粗暴了,经常会发生漏报(范围设置过宽)或误报(范围设置过窄)。由于生产过程是动态的,产生的数据也是动态的,简单的设置范围不可能适用于全部的生产状态,如下图:

左侧安稳期和右侧安稳期都是正常状态,假如左侧出现点1,右侧出现点2,它们都应该被判断为非常点,但假如简单的用固定范围来判断,这两个点都在固定范围内(图中的上下限),判断就会出错,所以须要动态的去判断某个点是否非常。
动态的判断非常,容易想到的方法是使用呆板学习方法来动态发现非常。但呆板学习是有监督方法,须要大量已知的非常数据,而实际场景通常并没有这些现成的数据,还须要人工标记出来。但是工业仪表产生的数据量对于人来说是个天文数字,依赖人工来标记不现实,而且人工标记也很难保证精确性,还要再去校对,工作量无比巨大,结果也就没有可操作性。所以只能使用无监督学习方法完成非常发现任务。
算法思绪
没有标记好的非常数据,无监督方法怎么定义“非常”呢?
先来看一份数据:

先来看人是怎么发现非常的。

人观察这段数据后,发现的非常如上图,各段缘故起因如下:
① 变化过快;
② 值过小。
非常大致是这几类:值过大或过小和变化过快。它们有个共同的特点,出现的环境比力少。我们不惆怅出一个抽象的说法:经常出现的环境是正常,没出现过大概很少出现的环境可以定义为非常。
那么发现非常的任务就转换为发现不常出现的环境,判断数据是否不常出现,就是看当前数据相较于之前一段时间内的数据是否不常出现。使用之前一段时间数据学出一个模子E,用它来判断当前数据是否非常。比如之前一段时间的数据在110内,那么当前时候的数据在这个范围内就以为是正常,假如当前时候的数据不在该范围内(比如等于11或0),则以为是非常。而110这个范围就是通过历史数据学出的模子E。拿着模子E就能算出当前数据是否非常了,即:

如许数据过大大概过小的非常就可以被发现了。
但是这种方法不一定能发现变化过快的非常数据,如下图:

上述方法可以发现(b)©中的非常,但对于(d)中的非常就无能为力了,那该怎样发现呢?
(d)中的环境就是变化过快,我们来看看能否用“变化快慢”这个数学量来发现非常。

上图中曲线C就是“变化快慢”曲线,他是使用原值X衍生得到的,用刚才先容的方法对C来发现非常即可发现变化过快这类非常。
由此看来,只要找到符合的数学量来表征这些数据的某些特性,就可以区分出常见和不常见的状态。比如下图:

红框中的非常就是幅度非常,值和变化率都处于正常范围,只是幅度变小了,此时须要一个表征幅度的数学量来发现非常。
仅仅是天生是否非常还不敷,非常还应区分非常的程度,比如1~10范围内是正常的,当前时候是11的非常度就应该小于当前时候是15的非常度,也就是说超限的幅度越大,非常度越大。这就要改造上面模子E,让它的判断结果返回一个连续值,使其能表征超限幅度越大,非常度越大。
实践结果
把上面思绪写成代码,就可以完成非常发现了。比如动态算出值过大过小的非常度,SPL代码大要如下:
| A | 1 | =file(C1).import@tc().(tag1) | 2 | =A1.(if(#<=100,,threshold(~[-100:0],"up",4))) | 3 | =A1.(if(#<=100,,threshold(~[-100:0],"down",4))) | 4 | =A1.m(101 | 5 | =A2.m(101 | 6 | =A3.m(101 | 7 | =A4.(max(0,~-A5(#),A6(#)-~)/(A5(#)-A6(#))) | SPL有很强盛的集合运算本领,实现区间上的阈值盘算很方便。这段代码仅是个表现,并不完备,此中还调用了盘算阈值的函数,而这个函数在不同场景要使用不同的盘算方法,很难通用起来。这个题目富足大,值得专门撰文讨论,但并不是本文重点,所以就不再列出了,这并不影响理解此中的原理。
盘算结果示比方下:

图中Value是数据,Value_up是动态上限,Value_low是动态下限,warn是非常度。从图中可以看出,算法准确发现了值过小的非常。
假如观察变化率,大要的SPL代码:
| A | 1 | =file(C1).import@tci() | 2 | =A1.((ss=if(#<=D1,~[0 1],~[-D1:0]),slope(ss))) | 3 | =A2.(if(#<=D2,,threshold(~[-D2:0],"up",3))) | 4 | =A2.(0) | 5 | =A2.m(D2+1 | 6 | =A3.m(D2+1 | 7 | =A4.m(D2+1 | 8 | =A5.(max(0,~-A6(#),A7(#)-~)/(A6(#)-A7(#))) | 类似地,A2中使用了动态盘算“变化快慢”这一数学量的方法,后续的代码和前面判断值的非常度时类似。
“变化快慢”发现非常结果如下:

从图中证实算法是有效的,变化过快的地方可以准确发现。
值和“变化快慢”乃至更多特性数据都可以用来发现非常,可以单独使用也可以综合使用,只要通过某种数学方式将他们归并成一个表征综合非常度的量即可。
关联题目
工业生产过程中,有些仪表之间是相互关联的,比如温度升高、压力上升;阀门开度增长、流量增大等等。有时只看单个仪表并不能阐明团体非常了,须要观察相互关联仪表的非常环境,才能确定整个体系是否真的出题目了。就比如打喷嚏、嗓子疼、流鼻涕、发烧同时发生时,我们就可以说这个人感冒了,假如只是单一症状,如嗓子疼,可能只是由于这个人高声说话喊破嗓子了,并不能断定这个人感冒了。
我们已经可以盘算单个仪表的非常度了,将相互关联的仪表看成一组,同时观察他们各自的非常度,用某种数学方式将他们的非常度聚合起来,就可以得到这组仪表的非常度了。
算法思绪
怎样将一组仪表的非常度聚合呢?
先来看一组数据:

这里有五个仪表的曲线,红色部门为该仪表非常的部门。
照旧先来看看人对时段①②③非常的分析环境:
时段①:只有1个仪表非常且非常度不大,该时段聚合后的非常度应该不大;
时段②:有3个仪表非常,但强度不大,聚合的强度应该也不大;
时段③:有4个仪表非常,而且强度较大,报警强度应该大。
将一组仪表的非常度聚合起来,容易想到的办法就是将全部仪表的非常度匀称。但是这意味着对全部仪表等量齐观,即各个仪表划一紧张。实际上可能并不是如许,还以感冒为例,发烧这一症状要比嗓子疼和打喷嚏紧张得多,须要给它赋予更高的权重。仪表也是类似的,有些仪表丈量的指标非常关键,有些可能不太紧张,为每个仪表分别赋予权重才能得到更准确的聚合非常度。
那么,权重从何而来?
简单有效的办法是工艺专家提供,可有时专家也不确定各个仪表权重的详细数值,假如能由盘算机自动算出各个仪表的权重就更好了。
那么,又怎么自动算权重呢?
先来看个故事:

上图是二战时盟军返航飞机弹孔分布图,从图中可以看到,这些弹孔分布并不匀称,翅膀上比力多,引擎上比力少。当时军方广泛以为,应该镌汰装甲总量,然后在受攻击最多的部位增长装甲,如许飞机可以轻一点,但是防护作用不会减弱,由于防御的服从提高了。但是,这些部位须要增长多少装甲,他们并不清晰,于是找到瓦尔德(哥伦比亚大学的统计研究学家),希望得到答案。但是,瓦尔德彻底否定了他们的想法,给出了相反的答案。
瓦尔德以为,须要加装装甲的地方不应该是留有弹孔的地方,反而是没有弹孔的地方,即飞机的引擎。
瓦尔德说,飞机各部位被击中的概率应该是均等的,但是引擎上的弹孔却比别的部位少,这阐明那些被击中引擎的飞机根本没有时机返航。我们看到的数据,都来自乐成返航的飞机,这阐明即便翅膀被打得千疮百孔,仍能安全返航。
军方立刻按照瓦尔德的建议改进了飞机,取得了良好的结果。
这就是“幸存者毛病”。我们不能只思量看到的数据(返航的飞机),更应该思量看不到的数据(未返航的飞机)。
为了克制幸存者毛病,各仪表权重的分配方法应该依照如许的原则:历史上经常非常且非常度大的仪表(相当于机翼)权重小,不常发生非常且非常度小的仪表(相当于引擎)权庞大。根据如许的原则,使用一些数学方法盘算各仪表的权重,末了使用权重与各仪表的非常度盘算出聚合后的非常度。
实践结果
用SPL实现上述算法的关键代码:
| A | 1 | =file("Adata.csv").read() | 2 | =A1.(~.array()) | 3 | =A2.(if(#<=100,null,weight(A14,~[-100:0]))) | 4 | =A2.to(101 | 5 | =A3.to(101 | 6 | =A4.((~**A5(#)).sum()) | 这里,A3中盘算权值的方法也是要随环境而定的。
盘算结果示比方下:

最下面一条曲线是五个仪表聚合后的非常度,此中粉色部门表现非常,从图中可以看出非常根本符合我们的判断,即非常仪表数量越多且非常度越大,聚合后的非常度越强。
进一步的关联题目
多仪表的非常度可以使用单仪表的非常度来聚合盘算,假如全部仪表非常度都是0,那么聚合后的非常度肯定也是0。那是不是就阐明装备工作很正常呢?
试想如许一种环境,有两个关系密切的仪表A和B,仪表A上升时B也上升,A下降B也下降,假如两个仪表都在各自正常的范围内,但是出现了A上升B却下降的环境,此时是不是也应该被以为是非常呢?如下图:

图中红框就是这种环境,这肯定要算作非常,但是前面说的聚合办法并不能办理这类题目,须要换一个角度来思考怎样办理这类题目。
既然一组仪表之间存在某种关系,那么多数环境下都会保持这种关系,只有少数环境下会失去关系,回到我们单仪表发现非常的思绪上——没出现大概不常出现的环境是非常。那么,只要有办法表征多个仪表共同状态中不常出现的程度,也就可以发现这种关联的非常了。
算法思绪
照旧先让人来观察仪表形成曲线图

观察后,人能给出红框中的数据大要属于非常数据。但是,两个曲线是否有关联关系,从这个图中是观察不到的。统计学知识告诉我们,可以用散点图来观察曲线之间的关联性,如下: 
图中横纵坐标分别是两个仪表的数值。如许就一览无余了,两个仪表的数据多数都聚集在一起,只有少数分散在边沿。根据我们的判断尺度——没出现大概不常出现的环境是非常,就可以判断图中红圈中的数据为非常。然后,只要使用数学方法把这些散点找出来并算出他们的非常度即可。
实践结果
用SPL实现的关键代码:
| A | 1 | =file("Jdata.csv").read() | 2 | =A1.(~.array()) | 3 | =A2.(if(#<=100,,join_o(~[-100:0],0.7,1.5))) | 4 | =A3.to(101,) | 5 | =A4.(if(~(1)>~(2),0,(~(2)-~(1))/~(2))) | A3格中关联方法同样要根据环境来确定。
盘算结果示比方下:
先来看我们造的那组数据:

图中红色部门是多仪表联合算法发现的非常。
相应的散点图是如许:

图中红色点就对应前面走势图中的红色曲线部门,也就是非常数据。
再来看刚才的实际数据:

图中红色部门是基于刚才说的多仪表散点图方法发现的非常。
相应的散点图如下:

图中红色点对应曲线走势图的红色曲线部门。
可以看出,这个办法可以较准确地发现这些数据的非常。
为简单起见,上述两组数据都只有两个仪表,只是为了方便读者理解,更多仪表同样可以用这个办法来发现非常,只是把两维空间扩展到N维空间,算法并没有太大不同,只是没法画出图了。
末了,还要再重申一下:这里的代码只是表现性的,并不完备。实际环境中详细函数盘算式的选择会各自不同,同时还要思量数据归一化、离群值剔除、非常累积等各种题目,完备代码就会很长,通盘列出讲解会占用过大篇幅也没太大须要。有爱好的读者可以和我们接洽讨论,本文的重点照旧表明原理。
开发这类算法经常须要做大量实行来选择符合的函数盘算式并调解参数,SPL编程的高效性就会发挥巨大的作用,在同样的时间内可以或许实行更多种方案。
资料
来源:https://blog.csdn.net/weixin_39709134/article/details/127400242
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |