2021五一杯c题数据驱动的异常检测与预警问题

2021五⼀杯c题数据驱动的异常检测与预警问题
2021五⼀杯C题数学建模
数据驱动的异常检测与预警问题
推动⽣产企业⾼质量发展,最根本的底线是保证安全、防范风险,⽽⽣产过程中产⽣的数据能够实时反映潜在的风险。附件1为某⽣产企业某⽇00:00:00-22:59:59由⽣产区域的仪器设备记录的时间序列数据(已经进⾏数据脱敏),本题未给出数据的具体名称,这些数据可能是温度、浓度、压⼒等与安全密切相关的数据。
请依据附件1数据,建⽴数学模型,完成以下问题:
问题1:附件1所给出的数据都可能存在波动,且所有波动都在安全值范围内。有些波动可能是正常性波动,例如随着外界温度或者产量变化的波动,或者可能是传感器误报,这些波动具有规律性、独⽴性、偶发性等特点,并不能产⽣安全风险,我们视为⾮风险性异常,不需要⼈为⼲预;有些波动具有持续性、联动性等特点,这些异常性波动的出现是⽣产过程中的不稳定因素造成的,预⽰着可能存在安全隐患,我们视为风险性异常,需要⼈为⼲预、分析和评定风险等级。请建⽴数学模型,给出判定⾮风险性异常数据和风险性异常数据的⽅法。
问题2:结合问题1的结果,建⽴数学模型,给出风险性异常数据异常程度的量化评价⽅法,要求使⽤百分制(0-100分)对每个时刻数据异常程度进⾏评价(分值越⾼表⽰异常程度越⾼)。应⽤所建⽴的模型和附件1的数据,到数据中异常分值最⾼的5个时刻及这5个时刻对应的异常传感器编号(每个时刻只填写5个异常程度最⾼的传感器编号,异常传感器不⾜5个则⽆需填满;如果得分为0,可以不⽤填写异常传感器编号),并给出数学模型对所得结果进⾏评价。
问题3:为了提前发现未来⽣产过程中可能存在的风险隐患,请建⽴风险性异常预警模型,预测当⽇23:00:00-23:59:59可能产⽣的风险性异常。结合问题2中给出的风险性异常程度量化评价⽅法,指出23:00:00-23:59:59中四个时间段(见表2),每个时间段内的最⾼异常分值及对应的异常传感器编号(只填写5个异常程度最⾼的传感器编号,异常传感器不⾜5个则⽆需填满;如果得分为0,可以不⽤填写异常传感器编号)。
问题4:根据问题2和问题3中的结果,建⽴数学模型对该⽣产企业整个⽣产系统的安全性进⾏评价,请在00:00:00-23:59:59内每隔30分钟,⽤0-100分进⾏安全性评分,0分表⽰安全性最低,100分表⽰安全性最⾼(包括00:00:00-23:00:00的得分和23:00:00-23:59:59的预测得分),并⽤适当的⽅法对所给评分的结果进⾏评价和敏感性分析。
模型的建⽴与求解(部分):
为了按照真实的⽐重给各个波动的主成分,需要使⽤临近分析法对主成分进⾏加权,NCA 是⼀种基于邻域分量的特征选择⽅法,在有监督的机器学习⽅法中,通过 NCA 多步跌代算法对⽤于分类的特征向量进⾏分析,以此获得不同的特征向量的分类中的权重⼤⼩,可根据权重的⼤⼩对原始的特征向量进⾏进⼀步筛选,进⼀步对数据进⾏降维,对整个训练⽹络进⾏优化。在第⼀问中我们已经通过 PCA 降维算法对传感器数据进⾏了排序和权重计算,在本问中进⼀步 利⽤ NCA 对影响等级的特征向量的排序和权重进⾏进⼀步的讨论,以此来得出风险性异常数据异常程度的量化评价⽅法。
Matlab 2018 有⽤于 NCA 近邻分析的⼯具箱,函数命令为 fscnca(x,y),其中 x 代表特征向量,y 代表样本标签(权重),因为 NCA 是⼀种迭代算法,在进⾏运算时需要对⼀些参数进⾏设置,包括迭代⽅法,最⼩批量处理等。考虑到样本的数量和计算精度的要求,对 NCA 计算参数的设置如下,为提⾼计算精度⽹络的迭代⽅式采⽤ SGD 随机梯度下降的计算⽅式,最⼩计算批量(MiniBatchSize)为 50,PassLimitd 等于 10,调谐⼦集合为 150,迭代周期为 20。⽹络运⾏迭代过程中
loss 不断减⼩,直到稳定达到误差要求。其迭代过程如下图所⽰:
程序代码
import  math
import  random
random .seed (0)
def  rand (a ,b ): #随机函数
return  (b -a )*random .random ()+a
def  make_matrix (m ,n ,fill =0.0):#创建⼀个指定⼤⼩的矩阵
mat = []
for  i in  range (m ):
mat .append ([fill ]*n )
return  mat
return mat
#定义sigmoid函数和它的导数
def sigmoid(x):
return1.0/(1.p(-x))
def sigmoid_derivate(x):
return x*(1-x)#sigmoid函数的导数
class BPNeuralNetwork:
def__init__(self):#初始化变量
self.input_n =0
self.hidden_n =0
self.output_n =0
self.input_cells =[]
self.hidden_cells =[]
self.output_cells =[]
self.input_weights =[]
self.output_weights =[]
self.input_correction =[]
self.output_correction =[]
#三个列表维护:输⼊层,隐含层,输出层神经元
def setup(self,ni,nh,no):
self.input_n = ni+1#输⼊层+偏置项
self.hidden_n = nh  #隐含层
self.output_n = no  #输出层
#初始化神经元
self.input_cells =[1.0]*self.input_n
self.hidden_cells=[1.0]*self.hidden_n
self.output_cells=[1.0]*self.output_n
#初始化连接边的边权
现实主义法学
self.input_weights = make_matrix(self.input_n,self.hidden_n)#邻接矩阵存边权:输⼊层->隐藏层
self.output_weights = make_matrix(self.hidden_n,self.output_n)#邻接矩阵存边权:隐藏层->输出层#随机初始化边权:为了反向传导做准备--->随机初始化的⽬的是使对称失效
for i in range(self.input_n):
for h in range(self.hidden_n):
self.input_weights[i][h]= rand(-0.2,0.2)#由输⼊层第i个元素到隐藏层第j个元素的边权为随机值
for h in range(self.hidden_n):
for o in range(self.output_n):
self.output_weights[h][o]= rand(-2.0,2.0)#由隐藏层第i个元素到输出层第j个元素的边权为随机值#保存校正矩阵,为了以后误差做调整
self.input_correction = make_matrix(self.input_n , self.hidden_n)
self.output_correction = make_matrix(self.hidden_n,self.output_n)
#输出预测值
def predict(self,inputs):
看门狗芯片#对输⼊层进⾏操作转化样本
for i in range(self.input_n-1):
self.input_cells[i]= inputs[i]#n个样本从0~n-1
#计算隐藏层的输出,每个节点最终的输出值就是权值*节点值的加权和
for j in range(self.hidden_n):
团队管理的重要性total =0.0
for i in range(self.input_n):
total+=self.input_cells[i]*self.input_weights[i][j]
# 此处为何是先i再j,以隐含层节点做⼤循环,输⼊样本为⼩循环,是为了每⼀个隐藏节点计算⼀个输
出值,传输到下⼀层            self.hidden_cells[j]= sigmoid(total)#此节点的输出是前⼀层所有输⼊点和到该点之间的权值加权和
for k in range(self.output_n):
total =0.0
for j in range(self.hidden_n):
total+=self.hidden_cells[j]*self.output_weights[j][k]
self.output_cells[k]= sigmoid(total)#获取输出层每个元素的值
return self.output_cells[:]#最后输出层的结果返回
return self.output_cells[:]#最后输出层的结果返回
#反向传播算法:调⽤预测函数,根据反向传播获取权重后前向预测,将结果与实际结果返回⽐较误差def back_propagate(self,case,label,learn,correct):
#对输⼊样本做预测
对二甲苯self.predict(case)#对实例进⾏预测
output_deltas =[0.0]*self.output_n #初始化矩阵
for o in range(self.output_n):
error = label[o]- self.output_cells[o]#正确结果和预测结果的误差:0,1,-1
output_deltas[o]= sigmoid_derivate(self.output_cells[o])*error#误差稳定在0~1内#隐含层误差
hidden_deltas =[0.0]*self.hidden_n
for h in range(self.hidden_n):
error =0.0
for o in range(self.output_n):
error+=output_deltas[o]*self.output_weights[h][o]
hidden_deltas[h]= sigmoid_derivate(self.hidden_cells[h])*error
#反向传播算法求W
#更新隐藏层->输出权重
for h in range(self.hidden_n):
for o in range(self.output_n):
change = output_deltas[o]*self.hidden_cells[h]
#调整权重:上⼀层每个节点的权重学习*变化+矫正率
self.output_weights[h][o]+= learn*change + correct*self.output_correction[h][o] #更新输⼊->隐藏层的权重
for i in range(self.input_n):
for h in range(self.hidden_n):
change = hidden_deltas[h]*self.input_cells[i]
self.input_weights[i][h]+= learn*change + correct*self.input_correction[i][h]
self.input_correction[i][h]=  change
#获取全局误差
error =0.0
for o in range(len(label)):
error =0.5*(label[o]-self.output_cells[o])**2#平⽅误差函数
return error
def train(self,cases,labels,limit=10000,learn=0.05,correct=0.1):
for i in range(limit):#设置迭代次数
error =0.0
for j in range(len(cases)):#对输⼊层进⾏访问
label = labels[j]
case = cases[j]
error+=self.back_propagate(case,label,learn,correct)#样例,标签,学习率,正确阈值
def test(self):#学习异或
cases =[
[0,0],
[0,1],
[1,0],
[1,1],
]#测试样例
labels =[[0],[1],[1],[0]]#标签
四川康定地震self.setup(2,5,1)#初始化神经⽹络:输⼊层,隐藏层,输出层元素个数
for case in  cases:
print(self.predict(case))
if __name__ =='__main__':sciencechina
nn = BPNeuralNetwork()
解题最重要⼀步:
print("call博主q:917267119")

本文发布于:2024-09-22 05:29:29,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/470129.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   波动   结果   风险性   传感器   输出   权重   预测
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议