1.我已经完成将一瞬态信号进行3层离散小波分解,得到其各层小波分解细节信号,并可以观察出成功检测,但是现在我需要通过绘制roc曲线来对其检测性能进行评估,那如何绘制他的roc曲线?
2.我的想法是以不同的信噪比组合,每种信噪比组合进行仿真检测运行1000次,检测结果包括相应信噪比下的检测概率和虚警概率,门限按照虚警概率小于%1设定,然后绘制出roc曲线,但是我不会,或者有其他绘制roc曲线的方法吗?
3.我的程序代码
[/code
clear all; close all; clc;
%% 瞬态信号建模
fs = 1000; % 采样频率1000Hz
ts = 1 / fs; % 采样时间间隔1ms
t = 0 : ts : 1; % 采样时间。每隔1ms采一次,采样1s
L = length(t); % 信号长度1000
f0 = 10 ; %信号频率10Hz
s = sin(2 * pi * f0 * t); % 原始正弦信号
sigma=0.1;
n=normrnd(0,sigma,1,L); %生成0均值,标准差为0.1的高斯白噪声
s =s+n; % 添加噪声
t1=0.4;
t2=0.8; %瞬态信号位置
x1=zeros(size(t)); %生成一个与t同大小的0矩阵
x1(t1*fs)=1;
x1(t2*fs)=2; %瞬态信号幅值
s=s+x1; %添加瞬态信号
figure(1);
plot(t,s)
xlabel('时间/s');ylabel('幅值');
title('含噪的瞬态信号'); %时域波形
%% 连续小波变换(CWT)
figure(2)
cw1 = cwt(s,1:32,'sym2','plot'); % 对信号做连续小波变换,并作出系数图像
title('连续小波变换系数图');
%% 离散小波变换(DWT)
[d,a]=wavedec(s,3,'db4'); %对原始信号进行3层离散小波分解
a3=wrcoef('a',d,a,'db4',3); %重构1-3层近似信号
a2=wrcoef('a',d,a,'db4',2);
a1=wrcoef('a',d,a,'db4',1);
d3=wrcoef('d',d,a,'db4',3); %重构1-3层吗细节信号
d2=wrcoef('d',d,a,'db4',2);
d1=wrcoef('d',d,a,'db4',1);
figure(3);
subplot(411);plot(s);ylabel('原始信号s'); %画出各层小波近似信号
title('小波分解各层近似信号示意图');
subplot(412);plot(a3);ylabel('近似信号a3');
subplot(413);plot(a2);ylabel('近似信号a2');
subplot(414);plot(a1);ylabel('近似信号a1');
xlabel('时间/s');
figure(4)
subplot(411);plot(s);ylabel('原始信号s'); %画出各层小波细节信号
title('小波分解各层细节信号示意图');
subplot(412);plot(d3);ylabel('细节信号d3');
subplot(413);plot(d2);ylabel('细节信号d2');
subplot(414);plot(d1);ylabel('细节信号d1');
xlabel('时间/s');
%% 性能检测
sigPower = sum(abs(s).^2)/length(s); %求出信号功率
noisePower=sum(abs(n).^2)/length(n); %求出噪声功率
SNR_10=10*log10(sigPower/noisePower); %由信噪比定义求出信噪比,单位为db
T=sigma*(2*log10(L))^0.5 %确定阈值]
问题位置:%%性能检测
小波这块不太懂,不过绘制ROC曲线还是有所了解,ROC曲线绘制的是真正例率和假正例率的曲线,也就是说需要知道样本的类别数(正类数和反类数),还需要知道模型的预测值,根据模型的预测值、阈值及样本的类别求出真正例率和假正例率,然后绘制它们的曲线。
现在,真正例率和假正例率可以求出来吗?
这是我得到的检测图
gmap = imresize(d1,size(n));
smap = imresize(n,0.1);
gmap = imresize(gmap,0.1);
% 二值化ground truth map, 只要两类
thresh_value =graythresh(gmap);
final_gmap = imbinarize(gmap, thresh_value);
% smap归一化到[0,1]
smap = mat2gray(smap);
% 数组
smap_array = smap(:);
gmap_array = final_gmap(:);
% 总真实为正例数
idex = find(gmap_array == 1);
P_num = length(idex);
% 总真实为负例数
N_num = length(gmap_array) - P_num;
% 从大到小排序,orig_location保存了排序前像素在smap_array的位置
[saliency_values, orig_location] = sort(smap_array, 'descend');
% TP(1) = 0; FP(1) = 0;
% TP(end) = 1; FP(end) = 1;
% 当以salicy_values(i)为阈值时,前面数组saliency_values前面i个都判为正例
for i=1:length(saliency_values)
% 查看前i个被判为正例的像素,真实情况如何。
TP(i) = 0; % 真正例,真实为正例,预测也为正例;
FP(i) = 0; % 假正例,真实为负例,预测为正例;
for m=1:i
if gmap_array(orig_location(m)) == 1
TP(i) = TP(i) + 1;
else
FP(i) = FP(i) + 1;
end
end
FPR(i) = FP(i) / N_num;
TPR(i) = TP(i) / P_num;
end
auc = trapz(FPR,TPR); % 以FPR为x轴,以TPR为y轴,算积分,即为ROC下的面积
figure(5)
plot(FPR, TPR, '.b-');
title(['AUC: ', num2str(auc),' SNR:',num2str(SNR)])
这是我在网上找的程序,我想知道最开头的gamp和smap分别对应我前面小波检测器的两个量。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,欢迎您加入CSDN!
目前问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632