网络与信息安全实验三异常检测.docx
《网络与信息安全实验三异常检测.docx》由会员分享,可在线阅读,更多相关《网络与信息安全实验三异常检测.docx(11页珍藏版)》请在冰豆网上搜索。
网络与信息安全实验三异常检测
网络与信息安全实验报告
(2015年度秋季学期)
一、实验内容
实验描述:
1、理解基于异常检测的恶意代码防治方法
(1)掌握异常检测的流程
(2)学习相关的异常检测算法
2、基于聚类的异常检测方法
(1)掌握欧氏距离和聚类的概念
(2)如何选取数据集的属性集
(3)采用k-means算法和k-medoids算法聚类数据并进行检测
3、基于聚类的网络流量异常检测
(1)建立历史数据集合
(2)规格化数据
(3)分别采用k-means算法和k-medoids算法对历史数据集进行聚类,产生分类结果
实验过程要求:
1、输入多个一维数据作为历史数据集合,给定类别,进行聚类。
2、输出聚类结果,包括每个类别包含的数据、类别的质心。
3、以上过程分别用k-means算法和k-medoids算法完成。
二、实验设计
算法:
首先,选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数。
每个点指派到最近的质心,而指派到一个质心的点集为一个簇。
然后,根据指派到簇的点,更新每个簇的质心。
重复指派和更新步骤,直到簇不发生变化,或等价地,直到质心不发生变化。
期望结果:
数据集被划分成不同的簇
二、实验设计
程序流程图:
数据结构:
主要为点的数据结构,用于存放点集的横纵坐标
关键函数:
主要代码1,
说明:
average_point()函数用于求k-means簇的新的质心,即求所有点的平均值,作为新的质心。
主要代码2:
说明:
min_point()函数用于求k-medoids簇的新的质心,即求某个点,此点到其他点的所有距离之和最小,以此点作为新的质心。
主要代码3:
说明:
上图程序用于初始化质心,visit数组为了保证随机选取的质心不会重复
主要代码:
4:
说明遍历数据集,将点加入到离他最近的质心
主要代码5,
说明:
如果质心不再变化,则输出所有的簇,否则,更新原质心为新的质心,重新迭代
三、测试数据
此数据集为随机产生,现取其中一组一随机结果数据,用于分析和验证算法的正确性。
k-means数据集样例:
k-medoids数据集样例
四、实验结果
k-means:
随机产生十个点,初始中心点K为3,测试结果如下
根据运行结果可以知道,三个簇的质心(中心点)分别为(73,49),(8,54),(55,88)。
三个簇中所包含的具体点如上图所示,可知初始点集已被正确划分为三个簇
k-medoids
根据运行结果可以知道,三个簇的质心(中心点)分别为(44,39),(61,79),(66,25)。
三个簇中所包含的具体点如上图所示,可知初始点集已被正确划分为三个簇
五、遇到的困难及解决方法、心得体会
通过实现k-means算法和k-medoids算法,实现了对数据的聚类和检测,掌握了异常检测的流程和欧氏距离与聚类的概念,对于网络异常检测的方法有了更深的认识。
附件:
源代码
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structpoint{
intx;
inty;
};
intgetDistance(pointa,pointb)
{
return(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
pointaverage_point(vectorv)
{
intlen=v.size();
//cout<<"大小为:
"<inttotal_x=0,total_y=0;
pointaver;
for(inti=0;i{
total_x+=v[i].x;
total_y+=v[i].y;
}
aver.x=total_x/len;
aver.y=total_y/len;
returnaver;
}
pointmin_point(vectorv){
intlen=v.size();
intmindis=100000000;
intchoice=0;
inttemp_sum;
for(inti=0;i{
temp_sum=0;
for(intj=0;jif(j==i)
continue;
else
temp_sum+=getDistance(v[i],v[j]);
}
if(temp_sum<=mindis){
mindis=temp_sum;
choice=i;
}
}
returnv[choice];
}
boolis_equal(pointa,pointb){
if(a.x==b.x&&a.y==b.y)
returntrue;
else
returnfalse;
}
voidk_means(vectorv,intk)
{
vector>center;
vector>new_center;
vectorline;
intvisit[10000];
for(inti=0;i<10000;i++)
{
center.push_back(line);//二维vector需要初始化,才能v[i].push_back(t);
new_center.push_back(line);
visit[i]=0;
}
inti=0;
intflag;
intlength=v.size();
cout<<"所有点的"<for(inti=0;icout<<"["<}
//初始化K个簇
//随机选择k个点,为K个簇
while(i{
vectort;
intc;
c=rand()%length;
if(visit[c]==1)
continue;
center[i].push_back(v[c]);
visit[c]=1;
i++;
}
intit=1;
while(true){
cout<<"第"<flag=0;
new_center.clear();
vectorline;
cout<<"中心点:
"<for(inti=0;icout<
["<
}
for(inti=0;i<10000;i++)
{
new_center.push_back(line);
}
intdis;
for(inti=0;iintmin_dist=10000000;
intchoice;
vectort;
for(intj=0;jdis=getDistance(v[i],center[j][0]);
if(dismin_dist=dis;
choice=j;
}
}
if(dis==0)
continue;
cout<<"点:
["<"<center[choice].push_back(v[i]);//将此点集加入到离他最近的质心
}
for(inti=0;i//new_center[i].push_back(average_point(center[i]));//求平均质心
new_center[i].push_back(min_point(center[i]));//求平均质心
//cout<<"new_center:
["<
}
for(inti=0;iif(is_equal(new_center[i][0],center[i][0])){//判断新的质心与原质心是否相等
flag+=1;
}
}
if(flag==k){//如果新质心与原质心都相同,即质心不再变化
for(inti=0;icout<<"第"<
"<<"中心点为:
"<<"["<
for(intj=1;j
cout<<"["<
}
}
return;
}
else{//否则,更新原质心为新的质心,重新迭代
center.clear();
center.assign(new_center.begin(),new_center.end());
}
}
}
intmain(){
vectorv;
srand(time(NULL));
intnum,k;
cout<<"请输入点的个数:
";
cin>>num;
cout<<"请输入中心点k的个数:
";
cin>>k;
pointp;
for(inti=0;ip.x=rand()%100;//随机产生0-99之间的数字
p.y=rand()%100;
v.push_back(p);
}
k_means(v,k);
}