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