基于Kohonen网络的聚类算法

1.案例背景

1.1 Kohonen网络

        Kohonen网络是自组织竞争型神经网络的一种,该网络为无监督学习网络,能够识别环境特征并自动聚类。Kohonen神经网络是芬兰赫尔辛基大学教授Teuvo Kohonen 提出的,该网络通过自组织特征映射调整网络权值,使神经网络收敛于一种表示形态。在这一形态中,一个神经元只对某种输人模式特别匹配或特别敏感。Kohonen网络的学习是无监督的自组织学习过程,神经元通过无监督竞争学习使不同的神经元对不同的输人模式敏感,从而特定的神经元在模式识别中可以充当某一输入模式的检测器。网络训练后神经元被划分为不同区域,各区域对输入模型具有不同的响应特征。

        Kohonen神经网络结构为包含输入层和竞争层两层前馈神经网络:第1层为输入层,输入层神经元个数同输入样本向量维数一致,取输人层节点数为m;第2层为竞争层,也称输出层,竞争层节点呈二维阵列分布,取竞争层节点数为n。输入节点和输出节点之间以可变权值全连接,连接权值为wij(i=1,2,…,m;j=1,2,……,n)。Kohonen 网络拓扑结构示意图如图38-1所示。


        Kohonen神经网络算法工作机理为:网络学习过程中,当样本输入网络时,竞争层上的神经元计算输人样本与竞争层神经元权值之间的欧几里得距离,距离最小的神经元为获胜神经元。调整获胜神经元和相邻神经元权值,使获得神经元及周边权值靠近该输人样本。通过反复训练,最终各神经元的连接权值具有一定的分布,该分布把数据之间的相似性组织到代表各类的神经元上,使同类神经元具有相近的权系数,不同类的神经元权系数差别明显。需要注意的是,在学习的过程中,权值修改学习速率和神经元领域均在不断较少,从而使同类神经元逐渐集中。Kohonen网络训练步骤如下。

1.2 网络入侵检测

        网络入侵是指试图破坏计算机和网络系统资源完整性、机密性或可用性的行为。其中,完整性是指数据未经授权不能改变的特性;机密性是指信息不泄露给非授权用户、实体或过程,或供其利用的特性;可用性是可被授权实体访问并按要求使用的特性。人侵检测是通过计算机网络或计算机系统中的若干关键点搜集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为或人侵现象。
        常规的入侵检测方法可以按检测对象、检测方法和实时性等方面进行分类。其中,按检测对象可以分为基于主机的入侵检测系统、基于网络的入侵检测系统和混合型入侵检测系统;按检测方法可以分为误用检测和异常检测;按定时性可以分为定时系统和实时系统。
        近年来,研究人员又提出了一些新的入侵检测方法,比如基于归纳学习的入侵检测方法、基于数据挖掘的人侵检测方法,基于神经网络的人侵检测方法、基于免疫机理的入侵检测方法和基于代理的人侵检测方法等。其中,基于数据挖掘的入侵检测方法是采用数据挖掘中的关联分析,序列模式分析、分类分析或聚类分析来处理数据,从中抽取大量隐藏安全信息,抽象出用于判断和比较的模型,然后利用模式识别入侵行为。

2 模型建立

        基于Kohonen网络的网络入侵攻击聚类算法流程如图38-2所示。

        数据归一化是指把网络人侵数据进行归一化处理。
        网络初始化根据入侵数据特点初始化网络,由于网络入侵数据有38维,人侵数据来自于5种不同类型的网络入侵模式,所以输人层节点数为38。竞争层节点代表输入数据潜在的分类类别,竞争层节点数一般大大多于数据实际类别,选择竞争层节点数为36个,竞争层节点排列在一个6行6列的方阵中。
        按公式(38-1)计算和输入样本最接近的竞争层节点作为该样本的优胜节权值调整根据公式(38-2)调整优胜节点领域半径r内节点权值,其中领域半径和学习速率随着进化过程逐渐变小,这样输入数据逐渐向几个节点集中,从而使网络实现聚类功能。本案例中最大领域rlmax为1.5,最小领域rlmin为0.4,最大学习概率ratelmax为0.1,最小学习概率ratelmin为0.01。网络共学习调整10 000次。

3.编程实现

        根据Kohonen网络原理,在 MATLAB软件中编程实现基于Kohonen 网络的网络入侵分类算法。完整代码如下:

%% 该代码为基于Kohonen网络的分类算法

%% 清空环境变量
clc
clear

%% 数据处理
load data
input=datatrain(:,1:38);
%数据归一化
[inputn,inputps]=mapminmax(input);
%inputn=inputn';
[nn,mm]=size(inputn);

%% 网络构建
%输入层节点数
Inum=38; 

%Kohonen网络
M=6;
N=6; 
K=M*N;%Kohonen总节点数

%Kohonen层节点排序
k=1;
for i=1:M
    for j=1:N
        jdpx(k,:)=[i,j];
        k=k+1;
    end
end

%学习率
rate1max=0.2;   
rate1min=0.05;
%学习半径
r1max=1.5;         
r1min=0.8;

%权值初始化
w1=rand(Inum,K);    %第一层权值

%% 迭代求解
maxgen=10000;
for i=1:maxgen
    
    %自适应学习率和相应半径
    rate1=rate1max-i/maxgen*(rate1max-rate1min);
    r=r1max-i/maxgen*(r1max-r1min);
    
    %从数据中随机抽取
    k=unidrnd(4000);   
    x=inputn(k,:);

    %计算最优节点
    [mindist,index]=min(dist(x,w1));
    
    %计算周围节点
    d1=ceil(index/6);
    d2=mod(index,6);
    nodeindex=find(dist([d1 d2],jdpx')<r);
    
    %权值更新
    for j=1:K
        %满足增加权值
        if sum(nodeindex==j)
            w1(:,j)=w1(:,j)+rate1*(x'-w1(:,j));
        end
    end
end

%% 聚类结果
Index=[];
for i=1:4000
    [mindist,index]=min(dist(inputn(i,:),w1));
    Index=[Index,index];
end

        netattack. mat里面共有4000组数据,其中第1~1383组数据属于第1类网络入侵方式,第1384~3 238组属于第2类网络入侵方式,第3239~3 357组属于第3类人侵方式,第3358~3948组属于第4类入侵方式,第3949~4000组属于第5类入侵方式。通过计算得到各类入侵数据的优胜节点,如表38-1所列。
        竞争层优胜节点分布如图38-3所示。其中,①代表第1类入侵数据所属节点,②代表第2类入侵数据所属节点,③代表第3类人侵数据所属节点,④代表第4类人侵数据所属节点,⑤代表第5类人侵数据所属节点。空白表示节点不属于任何类。从图38-3可以看出,不同类别的优胜节点基本按块分布,分类算法取得了良好的效果。

4.案例扩展

4.1有监督Kohonen网络原理

        上述内容表明Kohonen网络可以对未知类别数据进行无监督分类,但是分类结果中同一类别数据对应不同的网络节点,如果按照一个节点对应一类来说,Kohonen网络分类的类别比实际数据类别要多。Kohonen网络可以通过在竞争层后增加输出层变为有监督学习的网络(S Kohonen网络),S_Kohonen网络同Kohonen网络相比,增加一层输出层,输出层节点个数同数据类别相同,每个节点代表一类数据。输出层节点和竞争层节点通过权值相连,数据输人S_Kohonen网络,在权值调整时,不仅调整输入层同竞争层优胜节点领域内节点权值,同时调整竞争层优胜节点领域内节点同输出层节点权值,调整方式如下:

        S_Kohonen 网络训练过程同Kohonen网络训练类似,不同的是在调整输人层同竞争层获胜节点权值的同时按公式(38-4)调整竞争层获胜节点同输出层节点之间的权值。
        网络训练完后可对未知样本进行分类,分类时首先计算同未知样本最近的竞争层节点作为优胜节点,与获胜节点连接权值最大的输出层节点代表类别为未知样本类别。
        对于本案例来说,由于数据来源于5种类型的入侵数据,所以网络结构为38—36—5,输入层和竞争层的权值a,随机初始化,竞争层和输出层的权值wjk初始为0。取4 500组网络攻击数据,从中随机抽取4 000组数据训练网络,500组数据测试网络分类能力,MATLAB程序如下。

%% 该代码为基于有导师监督的Kohonen网络的分类算法

%% 清空环境变量
clc
clear

%% 数据处理
load data
input=datatrain(:,1:38);
attackkind=datatrain(:,39);

%数据归一化
inputn=input;
[nn,mm]=size(inputn);
[b,c]=sort(rand(1,nn));

%网络期望输出
for i=1:nn
    switch attackkind(i)
        case 1 
            output(i,:)=[1 0 0 0 0];
        case 2
            output(i,:)=[0 1 0 0 0];
        case 3
            output(i,:)=[0 0 1 0 0];
        case 4
            output(i,:)=[0 0 0 1 0];
        case 5
            output(i,:)=[0 0 0 0 1];
    end
end

%训练数据
input_train=inputn(c(1:4000),:);
output_train=output(c(1:4000),:);

%% 网络构建
%输入层节点数
Inum=38; 

%Kohonen网络
M=6;
N=6; 
K=M*N;%Kohonen总节点数
g=5; %输出层节点数

%Kohonen层节点排序
k=1;
for i=1:M
    for j=1:N
        jdpx(k,:)=[i,j];
        k=k+1;
    end
end

%学习率
rate1max=0.1;   
rate1min=0.01;
rate2max=1;   
rate2min=0.5;
%学习半径
r1max=1.5;         
r1min=0.4;

%权值初始化
w1=rand(Inum,K);    %第一层权值
w2=zeros(K,g);   %第二层权值

%% 迭代求解
maxgen=10000;
for i=1:maxgen
    
    %自适应学习率和相应半径
    rate1=rate1max-i/maxgen*(rate1max-rate1min);
    rate2=rate2min+i/maxgen*(rate2max-rate2min);
    r=r1max-i/maxgen*(r1max-r1min);
        
    %从数据中随机抽取
    k=unidrnd(4000);   
    x=input_train(k,:);
    y=output_train(k,:);

    %计算最优节点
    [mindist,index]=min(dist(x,w1));
    
    %计算周围节点
    d1=ceil(index/6);
    d2=mod(index,6);
    nodeindex=find(dist([d1 d2],jdpx')<=r);
    
    %权值更新
    for j=1:length(nodeindex)
        w1(:,nodeindex(j))=w1(:,nodeindex(j))+rate1*(x'-w1(:,nodeindex(j)));
        w2(nodeindex(j),:)=w2(nodeindex(j),:)+rate2*(y-w2(nodeindex(j),:));
    end
end

%% 聚类结果
Index=[];
for i=1:4000
    [mindist,index]=min(dist(inputn(i,:),w1));
    Index=[Index,index];
end

inputn_test=datatest(:,1:38);

%样本验证
for i=1:500
    x=inputn_test(i,:);
    %计算最小距离节点
    [mindist,index]=min(dist(x,w1));
    [a,b]=max(w2(index,:));
    outputfore(i)=b;
end

length(find((datatest(:,39)-outputfore')==0))

plot(outputfore,'linewidth',1.5)
hold on
plot(datatest(:,39),':r','linewidth',1.5)
title('网络分类','fontsize',12)
xlabel('数据样本','fontsize',12)
ylabel('分类类别','fontsize',12)
legend('预测类别','期望类别')

4.2 运行结果分析

        用训练好的S_Kohonen网络分类测试样本数据,分类数据共有500组,分类结果如图38-4所示。从预测结果可以看出,绝大部分测试数据网络分类类别同期望类别一致,500组测试数据分类正确的有492组,正确率为98.4%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102249.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】1654:到家的最少跳跃次数的解题思路 关于力扣无法return的BUG的讨论

文章目录 一、题目二、题解与代码三、神奇的BUG3.1 无法执行的 return 和 break 语句3.2 通过另一个 break 解决 一、题目 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

spring高级源码50讲-37-42(springBoot)

Boot 37) Boot 骨架项目 如果是 linux 环境&#xff0c;用以下命令即可获取 spring boot 的骨架 pom.xml curl -G https://start.spring.io/pom.xml -d dependenciesweb,mysql,mybatis -o pom.xml也可以使用 Postman 等工具实现 若想获取更多用法&#xff0c;请参考 curl …

Android逆向学习(二)vscode进行双开与图标修改

Android逆向学习&#xff08;二&#xff09;vscode进行双开与图标修改 写在前面 这其实应该还是吾爱的第一个作业&#xff0c;但是写完上一个博客的时候已经比较晚了&#xff0c;如果继续敲机械键盘吵到室友&#xff0c;我怕我看不到明天的太阳&#xff0c;所以我决定分成两篇…

七、Linux中一些符号的含义和宿主目录的介绍

1、Linux中一些符号的含义 在Linux命令行中&#xff0c;会看到如下一些符号&#xff0c;含义如下。 符号含义. 代表当前目录..代表上一层目录&#xff0c;当前目录的父目录-代表前一个目录&#xff0c;刚才从哪个目录cd过来~代表当前用户的宿主目录/代表根目录$普通用户的命…

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1.如何写出好的代码&#xff1f;1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…

③matlab向量和矩阵

目录 手动输入数组 创建等间距向量 数组创建函数 手动输入数组 1.背景 单个称为标量的数值实际上是一个 11 数组&#xff0c;也即它包含 1 行 1 列。 任务 创建一个名为 x 并且值为 4 的变量。 2.您可以使用方括号创建包含多个元素的数组。 x [3 5] x 3 5 任务 …

ChatGPT Prompting开发实战(三)

一、关于chaining prompts与CoT的比较 前面谈到的CoT的推理过程&#xff0c;可以比作是一次性就烹调好一顿大餐&#xff0c;那么接下来要说的“chaining prompts”&#xff0c;其背后的理念是分多次来完成这样一项复杂任务&#xff0c;每次只完成其中一步或者一个子任务。核心…

轻量、便捷、高效—经纬恒润AETP助力车载以太网测试

随着自动驾驶技术和智能座舱的不断发展&#xff0c;高宽带、高速率的数据通信对主干网提出了稳定、高效的传输要求&#xff0c;CAN(FD)、LIN已无法充分满足汽车的通信需求。车载以太网作为一种快速且扩展性好的网络技术&#xff0c;已经逐步成为了汽车主干网的首选。 此外&…

Kubernetes技术--k8s核心技术 Secret

1.概述 Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用 加密数据存储在/etc中,使得pod容器以挂载volume方式进行访问。在进行的数据存储中是以base64加密的方式…

yolov2相较于yolov1的改进

目录 前言 BN层取代了Dropout 使用了高分辨率分类器 K-means选定先验框的尺寸 网络结构—darknet19 细粒度的特征 前言 yolov2是在yolov1的基础上进行改进的&#xff0c;主要解决了yolov1定位不准确以及检测重叠的物体极差的情况&#xff0c;总的来说&#xff0c;它有以下…

Gitee注册和使用

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.Gitee 1.1Gitee是什么 1.2Gitee的注册以及远程仓库的创建…

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中&#xff0c;遇到这样一个需求&#xff0c;播放一视频的时候&#xff0c;要预下载 后面10条视频&#xff0c;但是只下载后面十条视频的前面1M 实现方法 1 创建请求时设置cacheLength resource [[IdiotResource alloc] init];resource.requestURL task.request…

docker命令学习

docker vscode插件出现的问题 docker命令 docker images &#xff08;查看所有的镜像&#xff09; docker ps -a &#xff08;查看所有的容器&#xff09; docker ps &#xff08;查看运行的容器&#xff09; docker run imageID docker run --gpus all --shm-size8g -it imag…

day27 String类 正则表达式

String类的getBytes方法 String s "腻害"; byte[] bytes s.getBytes(StandardCharsets.UTF_8); String类的new String方法 String ss "ss我的"; byte[] gbks ss.getBytes("gbk"); String gbk new String(gbks, "gbk"); String类的…

C++学习笔记总结练习:多态与虚函数

1 多态 多态分类 静态多态&#xff0c;是只在编译期间确定的多态。静态多态在编译期间&#xff0c;根据函数参数的个数和类型推断出调用的函数。静态多态有两种实现的方式 重载。&#xff08;函数重载&#xff09;模板。 动态多态&#xff0c;是运行时多态。通过虚函数机制实…

C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…

在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

系列五、Java操作RocketMQ简单消息之同步消息

一、概述 同步消息的特征是消息发出后会有一个返回值&#xff0c;即RocketMQ服务器收到消息后的一个确认&#xff0c;这种方式非常安全&#xff0c;但是性能上却没有那么高&#xff0c;而且在集群模式下&#xff0c;也是要等到所有的从机都复制了消息以后才会返回&#xff0c;适…

QT(8.30)常用类与组件,实现登录界面

1.作业&#xff1a; 完成一个登录界面(图片未附带): 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QLineEdit>//行编辑器#include<QIcon>//图标#include<QLabel>//标签#include<QPushButton>//按钮#include<QIc…