ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

NRD安全估计算法的仿真过程及思考

2021-09-21 17:07:16  阅读:129  来源: 互联网

标签:仿真 量测 err 攻击 检测 噪声 NRD 算法


文章目录

算法思考

算法原理

本质上说,NRD其实就是一维的(标量的)卡方检测+标准Kalman滤波+恢复算法。因此其攻击检测原理与标准卡方检测一致,都是考量两种分布的一致性情况,一致性越差,结果参量越大。于是就可以通过这种方法检测出攻击下的分布和期望的分布的不同,进而检测出攻击的发生。
因此可以这样理解:
受到非隐匿攻击,量测值显而易见的会发生分布的变化,这可以被检测出来,无需多言。
受到了(零均值)隐匿攻击后,基于卡方检测的攻击检测依然是有效的,因为量测值同样可能会发生期望值的偏移,进而以一定概率引发分布的变化,使得攻击得以检测出来,从这个角度讲,NRD对隐匿攻击的检测的思想与RWD相同。

仿真背景

模型设置

与RWD的仿真类似,为了简单,使用一个不相关双通道两传感器的模型,两个传感器每时刻独立地观测两个状态量,并进行融合。
使用背景同样为智能电网,电网中的参数变化缓慢,一般可以认为是稳定系统,因此设定状态转移矩阵A为单位矩阵,系统参数波动仅由噪声引起。

攻击设置(与RWD中完全相同)

我们设置第2个传感器受到攻击,第1个传感器不受攻击。

攻击发生在30 ~ 50 和 70 ~ 90时刻。

同时为了考量虚警和漏警,我们进行多次重复试验。

依照文献设置,分为三种情况:
1、隐匿攻击
设置攻击功率(标准差)=量测噪声功率(标准差)=1.1
2、非隐匿攻击
设置攻击功率(标准差)=2.6
量测噪声功率(标准差)=1.1
3、极端非隐匿攻击
设置攻击功率(标准差)=5
量测噪声功率(标准差)=0.1

代码

%Project: 不相关&双通道&二维&新型残差检测器
%Author: Jace
%Data: 2021/09/21
%--------------------准备---------------------
close all;
clear all;
clc;
%------------------初始化参数---------------------

N=100;%设定采样点数,即持续时长

%攻击检测相关参数
H=3;%检测阈值

gk1=zeros(1,N);%检测量
gk2=zeros(1,N);%检测量

%噪声相关参数
P0=0.01;%初始状态噪声协方差
Q=[0.01,0.0;0.0,0.01];%设定系统噪声
R1=0.1;%设定局部观测1噪声
R2=0.1;%设定局部观测2噪声
w=sqrt(Q)*randn(2,N);
v1=sqrt(R1)*randn(1,N);
v2=sqrt(R2)*randn(1,N);

%攻击相关参数
attack1=0;%攻击1是否开启
attack2=1;%攻击2是否开启

atk1=sqrt(R1)*randn(1,N);%隐匿攻击1
atk2=sqrt(R2)*randn(1,N);%隐匿攻击2,通过设置此处来变更攻击类型

%系统模型参数
A=[1,0;0,1];%状态转移矩阵
H1=[1,0];%局部量测1量测矩阵
H2=[0,1];%局部量测2量测矩阵

%----------------初始化分配空间-------------------------
%真实状态值初始化
x=zeros(2,N);%物体真实状态值(分配空间),2*N维矩阵
x(:,1)=[10+P0*randn(1);20+P0*randn(1)];%物体初始真实状态值

%误差协方差初始化
p1=[1,0;0,1];%局部滤波1误差协方差初始值
p2=[1,0;0,1];%局部滤波2误差协方差初始值
p=[1,0;0,1];%全局滤波误差协方差初始值

%两个传感器量测值初始化
z1=zeros(1,N);%量测值1
z1(1)=H1*x(:,1);%观测1真实值初始值,第一列的列向量取出第一行,成为标量

z2=zeros(1,N);%量测值2
z2(1)=H2*x(:,1);%观测2真实值初始值,第一列的列向量取出第二行,成为标量

%各滤波器估计值初始化
xkf1=zeros(2,N);%局部估计状态1
xkf1(:,1)=x(:,1);%局部估计状态1初始化为第一列的列向量

xkf1NRD=zeros(2,N);%局部估计状态1备份
xkf1NRD(:,1)=xkf1(:,1);

xkf2=zeros(2,N);%局部估计状态2
xkf2(:,1)=x(:,1);%局部估计状态2初始化为第一列的列向量

xkf2NRD=zeros(2,N);%局部估计状态2备份
xkf2NRD(:,1)=xkf2(:,1);

xkfNRD=zeros(2,N);%全局估计状态
xkfNRD(:,1)=x(:,1);%全局估计状态初始化为第一列的列向量

I=eye(2);%2*2单位矩阵

Alarm=zeros(2,N);
%----------------NRD------------------------
for k=2:N
    %系统模型
    x(:,k)=A*x(:,k-1)+w(k);
    %量测模型,标量
    z1(k)=H1*x(:,k)+v1(k);
    z2(k)=H2*x(:,k)+v2(k);
    
    %注入攻击
    if attack1==1
        if k>=30&&k<=50||k>=70&&k<=90
            z1(k)=z1(k)+atk1(k);
        end
    end
    
    if attack2==1
        if k>=30&&k<=50||k>=70&&k<=90
            z2(k)=z2(k)+atk2(k);
        end
    end
          
    %----------------标准Kalman过程------------------------
    %估计误差协方差预测更新
    p_pre1=A*p1*A'+Q;
    p_pre2=A*p2*A'+Q;
    %增益矩阵预测更新
    K1=p_pre1*H1'/(H1*p_pre1*H1'+R1);
    K2=p_pre2*H2'/(H2*p_pre2*H2'+R2);
    %状态值预测更新
    x_pre1=A*xkf1NRD(:,k-1);
    x_pre2=A*xkf2NRD(:,k-1);
    %备份先验估计值,用于存在攻击时的状态恢复
    xbup1=x_pre1;
    xbup2=x_pre2;
    %状态值量测更新
    xkf1(:,k)=x_pre1+K1*(z1(k)-H1*x_pre1);
    xkf2(:,k)=x_pre2+K2*(z2(k)-H2*x_pre2);
    %估计误差协方差量测更新
    p1=(I-K1*H1)*p_pre1;
    p2=(I-K2*H2)*p_pre2;
    %局部滤波的估计值记录
    xkf1NRD(:,k)=xkf1(:,k);
    xkf2NRD(:,k)=xkf2(:,k);
    
    %----------------攻击检测NRD算法部分------------------------
    Sigrk1=H1*p1*H1'+R1;
    Sigrk2=H2*p2*H2'+R2;
    gk1(k)=(z1(k)-H1*xkf1(:,k))^2/Sigrk1;
    gk2(k)=(z2(k)-H2*xkf2(:,k))^2/Sigrk2;
    
    %----------------利用备份状态值重新估计,NRD恢复过程------------------------
    if gk1(k)>H
        Alarm(1,k)=1;
        z1back=H1*xkf1NRD(:,k-1);%量测值回退到上一时刻的估计值
        %局部滤波1的重新估计(利用备份)
        xkf1NRD(:,k)=xbup1+K1*(z1back-H1*xbup1);
    end  
    if gk2(k)>H
        Alarm(2,k)=1;
        z2back=H2*xkf2NRD(:,k-1);%量测值回退到上一时刻的估计值
        %局部滤波2的重新估计(利用备份)
        xkf2NRD(:,k)=xbup2+K2*(z2back-H2*xbup2);
    end  
    
    %----------------融合部分------------------------
    %两个局部滤波不相关条件下的简单全局融合
    p=inv(inv(p1)+inv(p2));%融合后的估计误差协方差
    xkfNRD(:,k)=p*(inv(p1)*xkf1NRD(:,k)+inv(p2)*xkf2NRD(:,k));%融合后的状态估计值
end

%--------------------------误差计算--------------------------------
%初始化
messure_err_x1=zeros(1,N);
messure_err_x2=zeros(1,N);
kalman_err_x1=zeros(1,N);
NRD_err_x1=zeros(1,N);
kalman_err_x2=zeros(1,N);
NRD_err_x2=zeros(1,N);
for k=1:N
    %量测误差
    messure_err_x1(k)=abs(z1(k)-x(1,k));
    messure_err_x2(k)=abs(z2(k)-x(2,k));
    %Kalman估计偏差
    kalman_err_x1(k)=abs(xkf1(1,k)-x(1,k));
    kalman_err_x2(k)=abs(xkf2(2,k)-x(2,k));
    %NRD估计偏差
    NRD_err_x1(k)=abs(xkfNRD(1,k)-x(1,k));
    NRD_err_x2(k)=abs(xkfNRD(2,k)-x(2,k));
end

%噪声图
figure;
subplot(2,2,1)
plot(w(1,:));xlabel('采样时间');ylabel('噪声');
title('第1状态值过程噪声');
subplot(2,2,2)
plot(w(2,:));xlabel('采样时间');ylabel('噪声');
title('第2状态值过程噪声');
subplot(2,2,3)
plot(v1);xlabel('采样时间');ylabel('噪声');
title('第1状态值第1传感器量测噪声');
subplot(2,2,4)
plot(v2);xlabel('采样时间');ylabel('噪声');
title('第2状态值第2传感器量测噪声');

%局部滤波器1
figure;
t=2:N;
plot(t,x(1,t),'-k.',t,z1(t),'-b.',t,xkfNRD(1,t),'-r.',t,xkf1(1,t),'-g.');
legend('第1状态值','第1量测值','第1状态量NRD估计值','第1状态量Kalman估计值');
xlabel('采样时间');ylabel('位置');
title('局部滤波器1跟踪状态');

%局部滤波器2
figure;
t=2:N;
plot(t,x(2,t),'-k.',t,z2(t),'-b.',t,xkfNRD(2,t),'-r.',t,xkf2(2,t),'-g.');
legend('第2状态值','第2量测值','第2状态量NRD估计值','第2状态量Kalman估计值');
xlabel('采样时间');ylabel('位置');
title('局部滤波器2跟踪状态');

%局部滤波器1误差
figure;
hold on,box on;
plot(messure_err_x1,'-b.');
plot(kalman_err_x1,'-g.');
plot(NRD_err_x1,'-r.');
legend('量测','Kalman估计','NRD估计');
xlabel('采样时间');ylabel('误差');
title('局部滤波器1误差');

%局部滤波器2误差
figure;
hold on,box on;
plot(messure_err_x2,'-b.');
plot(kalman_err_x2,'-g.');
plot(NRD_err_x2,'-r.');
legend('量测','Kalman估计','NRD估计');
xlabel('采样时间');ylabel('误差');
title('局部滤波器2误差');

%量测值记录
figure;
hold on,box on;
plot(z1);
plot(z2);
xlabel('采样时间');ylabel('数值');
legend('量测1','量测2');
title('量测值记录');

%检测记录
figure;
t=2:N;
subplot(2,1,1)
plot(t,gk1(t),'-b.',t,Alarm(1,t),'-r.');
legend('攻击检测衡量值1','是否存在攻击1');
title('检测攻击1');
subplot(2,1,2)
plot(t,gk2(t),'-b.',t,Alarm(2,t),'-r.');
legend('攻击检测衡量值2','是否存在攻击2');
title('检测攻击2');

效果及分析

隐匿攻击

分析

对于隐匿攻击的情况,本文献对NRD算法强调的与RWD类似,都是说算法能够有效检出出现攻击的传感器,而不是精确定位时刻,并高度缓解误差,事实上,类似于RWD算法中的分析,NRD算法的估计误差也与标准Kalman基本相同。

噪声设置

在这里插入图片描述

追踪效果

在这里插入图片描述

估计误差

在这里插入图片描述

量测值记录

在这里插入图片描述

攻击检测

在这里插入图片描述

检测率

在客观的设置无攻击和有攻击的传感器量测噪声标准差都是1.1的情况下进行200次循环实验,得到的检测率和虚警率,可以看出有88.5%的检测率,即11.5%漏警概率;同时有32.5%虚警率,由此可以证明算法有效。
在这里插入图片描述

在这里插入图片描述

非隐匿攻击

分析

在这种情况下,本文强调的依然是对受攻击传感器的检出而非攻击时刻检出。但是由于卡方检验的特性,非隐匿攻击会产生明显的分布变化,使得在这种情况下NRD的效果仍然是要稍好于RWD,这在仿真效果中也得到了印证。

噪声设置

在这里插入图片描述

追踪效果

在这里插入图片描述

估计误差

在这里插入图片描述

量测值记录

在这里插入图片描述

攻击检测

在这里插入图片描述

检测率

在客观的设置无攻击和有攻击的传感器量测噪声标准差都是1.1的情况下进行200次循环实验,得到的检测率和虚警率,可以看出有95.5%的检测率,即4.5%漏警概率;同时有8.5%虚警率,由此可以证明算法有效。
在这里插入图片描述
在这里插入图片描述

极端非隐匿攻击

分析

这种情况是NRD比较擅长的,较大的攻击功率带来客观的分布变化,使得NRD检测率大大提高,估计误差比标准Kalman的算法有客观的下降。

噪声设置

在这里插入图片描述

追踪效果

在这里插入图片描述

估计误差

NRD误差明显好于Kalman
在这里插入图片描述

量测值记录

在这里插入图片描述

攻击检测

在这里插入图片描述

检测率

同样在客观的设置无攻击和有攻击的传感器量测噪声标准差都是0.1的情况下进行200次循环实验,得到的检测率和虚警率,可以看出有100%的检测率,即无漏警;同时也没有虚警,由此可以证明算法有效,且效果极佳。
在这里插入图片描述
在这里插入图片描述

标签:仿真,量测,err,攻击,检测,噪声,NRD,算法
来源: https://blog.csdn.net/Yujian2563/article/details/120402555

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有