【SOM神经网络的数据分类】SOM神经网络的数据分类的一个小案例

news/2024/7/22 22:10:37 标签: 神经网络, 分类, 人工智能

【SOM神经网络的数据分类】SOM神经网络的数据分类的一个小案例

注:本文仅作为自己的学习记录以备以后复习查阅

在这里插入图片描述

一 概述

自组织特征映射网络(Self-Organizing Feature Map, SOM)也叫做Kohonen网络,它的特点是:全连接、无监督、自组织、自学习。在SOM网络中,竞争层的神经元会尝试识别输入空间临近该神经元的部分,也就是说,SOM神经网络既可以学习训练数据输入向量的分布特征,也可以学习训练数据输入向量的拓扑结构

SOM结构一般包含一下四个部分:

1、处理单元阵列
2、比较选择机制
3、局部互联作用
4、自适应过程

其算法流程如下图所示:
在这里插入图片描述
最后模型会判断是否达到了预先设定的要求,如果达到要求则算法结束,否则将从输入向量输入这一步重新进行下一轮的学习。
关于原理的解释暂时到这里,下面是一个小案例帮助理解他的用法和适用场景。

二 案例(MATLAB实现)

数据说明

案例中给出了一个含有8个故障样本的数据集,每个故障样本中有8个特征(P1-P8),数据已归一化。
在这里插入图片描述
第一步,惯例清空一下环境变量,如果你不需要则跳过这一步

clc
clear

第二步,载入数据并转置

# 载入数据
load p;

# 转置后符合神经网络的输入格式
P=P';

第三步,建立网络并训练

# newsom建立SOM网络
net=newsom(minmax(P),[6 6]);
plotsom(net.layers{1}.positions)
# 7次训练的步数
a=[10 30 50 100 200 500 1000];
# 随机初始化一个1*10向量(用于存放分类后的数据----一次一行)---7-a[*]里面训练的次数,8-数据中的8个故障特征-也就是P的横向变量。
yc=rands(7,8);
# 进行训练
# 训练次数为10次
net.trainparam.epochs=a(1);

在这里插入图片描述

下面查看一下这次训练的一个网络和分类情况:

net=train(net,P);
y=sim(net,P);
yc(1,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)

在这里插入图片描述
在这里插入图片描述

这里有一些plot选项,可以点出来看一下更细节的信息,其中,蓝色代表神经元,红色线代表神经元直接的连接,每个菱形中的颜色表示神经元之间距离的远近,从黄色到黑色,颜色越深说明神经元之间的距离越远。
在这里插入图片描述
每个子图显示了从输入到层神经元的权重,最大的负连接显示为黑色,零连接显示为红色,最强的正连接显示为黄色。
在这里插入图片描述
接下来我们试一下训练三十次会变成什么样子:

net.trainparam.epochs=a(2);
# 训练网络并查看分类
net=train(net,P);
y=sim(net,P);
yc(2,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面接着训练50、100、200、5001000次,大家可以自己跑来对比一下变化,我在这里只把代码po出来

# 训练次数为50次
net.trainparam.epochs=a(3);
net=train(net,P);
y=sim(net,P);
yc(3,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)


# 训练次数为100次
net.trainparam.epochs=a(4);
net=train(net,P);
y=sim(net,P);
yc(4,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)


# 训练次数为200次
net.trainparam.epochs=a(5);
net=train(net,P);
y=sim(net,P);
yc(5,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)

# 训练次数为500次
net.trainparam.epochs=a(6);
net=train(net,P);
y=sim(net,P);
yc(6,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)

# 训练次数为1000次
net.trainparam.epochs=a(7);
net=train(net,P);
y=sim(net,P);
yc(7,:)=vec2ind(y);
plotsom(net.IW{1,1},net.layers{1}.distances)
yc

最后yc结果我跑出来是这样的:
在这里插入图片描述
训练好模型后我们接着进行第四步,网络预测。对未知样本的分类只能通过rr值和对应分类后的yc矩阵中的值对应,看分到了哪类去,而input那个8个图只能对应8个选定的故障变量值(例子中是故障样本的8个参数)。值得注意的是,SOM程序每次执行的结果不一样是因为每次激发的神经元可能不一样,但是无论激发的是哪些神经元,最后分类的结果不会改变。

# 测试样本输入
t=[0.9512 1.0000 0.9458 -0.4215 0.4218 0.9511 0.9645 0.8941]';

r=sim(net,t);
rr=vec2ind(r)

在这里插入图片描述
最后查看网络神经元的分布情况:

# 网络神经元分布情况
# 查看网络拓扑学结构
plotsomtop(net)
# 查看临近神经元直接的距离情况
plotsomnd(net)
# 查看每个神经元的分类情况
plotsomhits(net,P)
# 每个子图显示了从输入到层神经元的权重,
plotsomplanes(net,P)

在这里插入图片描述

三 参考资料

1、MATLAB神经网络43个案例分析
2、https://zhuanlan.zhihu.com/p/73930638
3、https://0809zheng.github.io/2022/01/06/SOM.html

以上!!!!!!
如果以上内容有误请指出,也欢迎大家一起交流学习,私信回复可能会不及时,有问题可以加我的qq:1325225121。


http://www.niftyadmin.cn/n/5546039.html

相关文章

UI组件库---vantList组件接口多次调用大坑问题

问题描述:当使用refesh下拉操作时,vanlist组件会多次调用(大概三次)! 解决方案: 1、接口错误的时候,大量重复请求。 可能接口错误时vant3内部某些变量没重置,导致一直重复请求&am…

ubuntu 如何查看某一个网卡的ip地址

在Ubuntu中,你可以使用多种方法来查看某一个网卡的IP地址。以下是一些常用的方法: 使用ip命令: ip命令是现代Linux系统中用于显示和操作路由、网络设备、策略路由和隧道的工具。要查看所有网络接口的IP地址,你可以使用&#xff1a…

PMP–知识卡片--Scrum角色

Scrum 角色 Scrum 团队由 5 到 9 个(72)团队成员组成。有三种类型角色: 产品负责人(PO):产品负责人定义项目愿景、需求和优先级,对产品成功负责。Scrum Master:负责团队&#xff0c…

【k8s安装redis】k8s环境无pvc的情况下安装redis哨兵集群

文章目录 简介一.条件及环境说明:二.需求说明:三.实现原理及说明四.详细步骤4.1.规划节点标签4.2.创建configmap配置4.3.创建三个statefulset和service headless配置4.4.创建哨兵deployment配置和service配置 五.安装说明 简介 k8s集群中搭建有状态的服务…

【C++ | 继承】C++的继承详细介绍 及 例子源码演示

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

C#面:阐述控制反转是什么?

控制反转(Inversion of Control,缩写为IoC),是⾯向对象编程中的⼀种设计原则,可以⽤来减低计算机代码之间的耦合度。其中最常⻅的⽅式叫做依赖注⼊(Dependency Injection,简称DI)&am…

Ubuntu22.04系统装好后左上角下划线闪烁不开机(N卡)

折腾了半天以为是ubuntu的系统和硬件不匹配, 最后发现的确有点关系, 就是显卡驱动的问题 解决办法: 1. 进入到safty模式下, 然后配好网络环境 2. 移除所有的驱动相关的包, sudo apt-get remove --purge nvidia* 3.…

[QT入门]字符串列表类QStringList

QStringList 是 Qt 框架中一个非常实用的类&#xff0c;它封装了基于 QList<QString> 的字符串列表&#xff0c;提供了丰富的函数来操作和管理字符串集合。这个类特别适用于需要处理一系列字符串的场合&#xff0c;比如读取文件列表、存储用户输入等。以下是 QStringList…