网络与信息安全实验三异常检测Word格式文档下载.docx
- 文档编号:19811037
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:11
- 大小:141.43KB
网络与信息安全实验三异常检测Word格式文档下载.docx
《网络与信息安全实验三异常检测Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《网络与信息安全实验三异常检测Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
算法:
首先,选择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<
stdio.h>
random>
cmath>
vector>
time.h>
cstdlib>
iostream>
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(vector<
point>
v)
intlen=v.size();
//cout<
<
"
大小为:
len<
endl;
inttotal_x=0,total_y=0;
pointaver;
for(inti=0;
i<
len;
i++)
{
total_x+=v[i].x;
total_y+=v[i].y;
}
aver.x=total_x/len;
aver.y=total_y/len;
returnaver;
pointmin_point(vector<
v){
intmindis=100000000;
intchoice=0;
inttemp_sum;
temp_sum=0;
for(intj=0;
j<
j++){
if(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;
returnfalse;
voidk_means(vector<
v,intk)
vector<
>
center;
new_center;
line;
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;
length;
i++){
["
v[i].x<
"
v[i].y<
]"
//初始化K个簇
//随机选择k个点,为K个簇
while(i<
k)
t;
intc;
c=rand()%length;
if(visit[c]==1)
center[i].push_back(v[c]);
visit[c]=1;
i++;
intit=1;
while(true){
第"
it++<
次迭代"
//第i次迭代
flag=0;
new_center.clear();
中心点:
k;
:
center[i][0].x<
center[i][0].y<
intdis;
i++){//遍历数据集
intmin_dist=10000000;
intchoice;
dis=getDistance(v[i],center[j][0]);
if(dis<
min_dist){
min_dist=dis;
choice=j;
if(dis==0)
点:
加入到簇:
choice<
center[choice].push_back(v[i]);
//将此点集加入到离他最近的质心
//new_center[i].push_back(average_point(center[i]));
//求平均质心
new_center[i].push_back(min_point(center[i]));
new_center:
if(is_equal(new_center[i][0],center[i][0])){//判断新的质心与原质心是否相等
flag+=1;
if(flag==k){//如果新质心与原质心都相同,即质心不再变化
i+1<
个簇:
中心点为:
//输入第i个簇
for(intj=1;
center[i].size();
center[i][j].x<
center[i][j].y<
//输出该簇下的点
return;
else{//否则,更新原质心为新的质心,重新迭代
center.clear();
center.assign(new_center.begin(),new_center.end());
intmain(){
v;
srand(time(NULL));
intnum,k;
请输入点的个数:
;
cin>
>
num;
请输入中心点k的个数:
pointp;
p.x=rand()%100;
//随机产生0-99之间的数字
p.y=rand()%100;
v.push_back(p);
k_means(v,k);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 信息 安全 实验 异常 检测