正常数据集的建立及SVM应用

本文详细介绍了如何使用Matlab环境对正常与攻击数据集进行采样、特征提取、分类训练及预测的过程。包括CUSUM与DFT预处理、数据格式转换为LibSVM所需、数据集划分、特征缩放、模型训练与验证,最终实现100%预测准确率的分类任务。实验中特别关注了不同数据集混合方式对结果的影响,以及通过调整采样窗口以测试模型鲁棒性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 在matlab环境下,对正常情况下的包过程进行采样,然后计算特征值。

   for i=1:197

   MatrixSampled(:,i) = SampleMatrix((501+500*i):(1500+500*i));

   end

   SVMatrix = SVMdata(MatrixSampled,no);

   在此之前,观察了对正常情况下包过程先CUSUM再DFT的结果:CUSUM统计值并非维持在0,而是在比较小的范围内(0到4)波动,DFT之后的功率谱显示,大部分功率集中在高频部分。结果与预计相符,满足要求。

2. 在matlab环境下,给攻击数据集和正常数据集加上类标,并且转换成libSVM需要的格式。考虑到两个数据集中特征值的取值都非负,所以类标分别设置为1和0。格式转换函数来自其它帮助文档:

   function write4libsvm
   [filename,pathname] = uigetfile({'*.mat','数据文件(*.mat)';'*.*','所有文件(*.*)'},'选择数据文件');
   try
       S = load([pathname filename]);
       fieldName = fieldnames(S);
       str = cell2mat(fieldName);
       B = getfield(S,str);
       [m,n] = size(B);
       [filename,pathname] = uiputfile({'*.txt;*.dat','数据文件(*.txt;*.dat)';'*.*','所有文件(*.*)'},'保存数据文件');
       fid = fopen([pathname filename],'w');
       if (fid~=-1)
           for k=1:m
               fprintf(fid,'%3d',B(k,1));
               for kk=2:n
                   fprintf(fid,'/t%d',(kk-1));
                   fprintf(fid,':');
                   fprintf(fid,'%d',B(k,kk));
               end
               fprintf(fid,'/n');
           end
           fclose(fid);
       else
           msgbox('无法保存文件');
       end
   catch
       msgbox('文件保存过程中出错了!','出错了...','error');
   end

3. 在matlab环境下,生成训练集train和测试集test。攻击数据集和正常数据集分别为160和197组,各选110组和147组混合作为训练集,各自剩下的50组混合作为测试集。训练集的混合方式对训练结果是否有影响目前未知,为方便起见,采取直接结合。测试集的混合方式应该对结果没有影响,采取直接结合。

4. 在libSVM环境下,进行scale、train和predict。同样的,考虑到特征值非负,所以scale范围选择在0到1。

   svm-scale -l 0 -u 1 -s range1 train > train.scale

   svm-scale -r range1 test > test.scale

   svm-train train.scale

   svm-predict test.scale train.scale.model test.predict

   预测准确率:100%!!!

5. 改变训练集的混合方式后,预测准确率仍然为100%。考虑减小采样窗口,看能否出现错误的预测。混合函数如下:

   %将攻击训练集和正常训练集混合成训练集
   function result=join(no,with)
   len1 = size(no,1);
   len2 = size(with,1);
   width1 = size(no,2);
   width2 = size(with,2);
   if width1~=width2           %数据集宽度不一致,则提示错误
       msgbox('数据集格式有误!');
   else
       step = min([len1;len2]);     %取较小的长度值
       for i=1:step                 %一一对应,交叉排列
           result(2*i-1,:) = no(i,:);
           result(2*i,:) = with(i,:);
       end
       if len1>len2                 %多余部分排在末尾
           result((2*step+1):(len1+len2),:) = no((step+1):len1,:);
       else
           result((2*step+1):(len1+len2),:) = with((step+1):len2,:);
       end
   end
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值