简易入手《SOM神经网络》的本质与原理

news2024/11/14 14:34:09

原创文章,转载请说明来自《老饼讲解神经网络》:www.bbbdata.com

关于《老饼讲解神经网络》:

本网结构化讲解神经网络的知识,原理和代码。

重现matlab神经网络工具箱的算法,是学习神经网络的好助手。 


目录

一、入门原理解说

01. 基于Kohonen规则的聚类算法  

02.  SOM聚类的思想  

03.  SOM神经网络的拓扑图  

04.  SOM的模型表达式  

编后语  

二、SOM-代码重写(单样本训练)

01. 代码结构说明  

02. 代码运行结果解说

03. 具体代码



SOM神经网络(Self-organizing Feature Map)是Kohonen在1981年提出的一种用于聚类的神经网络,是神经网络家族中经典、重要且广泛应用的一员。

本篇第一节先聚焦于讲清SOM是个什么东西,解决什么问题,思路是什么,有什么特性,
第二节则扒取matlab的源码,自写《SOM-单样本训练算法》,即用自己的代码逻辑重现matlab工具箱的效果。

  笔者语  


SOM不是一个困难的算法,但要讲清SOM,却是一个困难的问题。

笔者曾想一张文章讲完SOM,左揉右捏,后来发现,这鬼东西,越图快越不行。


为什么SOM必须慢慢讲述,主要是因为SOM的思想经历了三阶段:

  Kohonen规则   -->   单样本训练   -->   批量样本训练  

想直接讲述批量样本训练根本讲不了。

谨此,希望读者也不要图快,一步一步来。


 

一、入门原理解说


  01. 基于Kohonen规则的聚类算法  


  聚类问题  


口语描述:假设数据是一团团的,我们希望找出这些一团团数据的中心点(聚类中心),样本离哪个聚类中心最近,就将样本判为该聚类中心。

   基于Kohonen规则的聚类方法  


kohonen规则聚类很简单,

先随机初始化k个聚类中心点,

然后每次选出一个样本,将离它最近的聚类点往它移动,使该聚类点更靠近它,如此反复m次。


更新法则如下:

w_{k} = w_k+\text{lr}*(x-w_k)

其中,                                       
w_k:离样本最近的聚类中心点。
\text{lr} : 学习率。                             

   kohonen规则的有效性  


kohonen规则虽然简单,然而它却是行之有效的。

且看一个Demo:


平面中有四簇数据,
我们先随机初始化5个聚类中心点,
然后使用Kohonen规则调整聚类中心点的位置,

 
可以看到,经过一定步数后,聚类中心点移到了四类数据的中心位置附近。

Demo代码:


% Kohonen聚类规则
rand('seed',70);
%------------生成样本数据-------------
dataC = [2.5,2.5;7.5,2.5;2.5,7.5;7.5,7.5]; % 生成四个样本中心
sn = 40;  % 样本个数
X = rand(sn,2)+dataC(mod(1:sn,4)+1,:); % 随机生成样本点


% -----------初始化聚类中心点--------------
kn = 5;              % 聚类中心点个数
C  = rand(kn,2)*10;  % 随机生成聚类中心
C0 = C;              % 备份聚类中心点的初始值


% -----------使用样本训练聚类中心点-----------
lr = 0.1;   % 学习率
for t = 1:50
    for i = 1:sn
        cur_x    = X(i,:);                             % 提取一个样本
        dist     = sum((repmat(cur_x,kn,1) - C).^2,2); % 计算样本到各个聚类中心点的距离
        [~,idx]  = min(dist);                          % 找出最近的聚类中心点
        C(idx,:) = C(idx,:)  + lr*(cur_x - C(idx,:));  % 将该聚类中心点往样本靠近
    end
end


% ----------画图------------------------
subplot(1,2,1)
plot(X(:,1),X(:,2),'*');
hold on 
plot(C0(:,1),C0(:,2),'or','MarkerFaceColor','g');


subplot(1,2,2)
plot(X(:,1),X(:,2),'*');
hold on 
plot(C(:,1),C(:,2),'or','MarkerFaceColor','g');

  02.  SOM聚类的思想  


SOM是Kohonen规则的改进,

它在更新离样本最近的聚类中心点P的的时候,会把P的邻近聚类中心点也一起更新。

请注意,初学者很容易误会,以为SOM所指的邻近聚类点就是目标聚类点附近的聚类点,其实不是,SOM对“邻近聚类点”有自己的定义。

  SOM聚类点的距离与邻近聚类点  


SOM是先引入一个拓扑结构,把所有聚类点连结在一起,然后籍此来定义距离。

拓扑结构


拓扑结构可以是一维的,二维的,三维的,等等,最常用是二维
例如最常用的二维六边形拓扑结构:




距离的定义



在SOM中,两点之间的距离,
是指在引入的拓扑结构中,这两点之间的最小边数。


邻近聚类点


点P的邻近聚类点是指与P的最小连结边数小于某个阈值的聚类点。
例如,
当邻域距离阈值为1时,点P的邻近聚类点,是与点P直接连接的点。    
当邻域距离阈值为2时,则是到达点P不超过2条边的聚类点。                
当邻域距离阈值为k时,就是指经过m(m<=k)条边可达点P的聚类点。

  SOM的更新方法  


SOM更新的方法与上面所说的Kohonen规则思想是一样的,
不同点在于,SOM在更新离样本最近的聚类中心点P的的时候,会把P的邻近聚类中心点也一起更新

    

更细节的,有以下三点:


1、更新邻近聚类点:
 
更新样本最近点P的同时,P的邻近聚类点也一起更新,(P的学习率要比邻近聚类点更大一些)。
  
  2、增加学习率的收缩机制:
随着更新步数,学习率越来越小。
 
  3、邻近距离收缩机制:
随着更新步数,邻近距离阈值越来越小,渐渐的,只有目标点及其邻边聚类点。 

比起纯粹的Kohonen规则,虽然改动不大,在代码编写上,却要复杂很多。
复杂是因为要初始化拓扑结构,获得点与点之间的距离矩阵(这里说的距离是上面所说的边数),以便在更新时获取邻近聚类点。

   说 明  


●  以上的更新方法来自matlab老版本的单样本训练算法(learnsom)。
●  matlab新版本已采用了批量更新算法(learnsomb)。             
两种方法的细节,我们都另起文章细讲,并扒出源码,重现matlab的实现逻辑。        

      

 

  03.  SOM神经网络的拓扑图  


  网络拓扑图  


SOM神经网络是典型的三层神经网络,
拓扑图如下:
 


第一层是输入层
第二层是隐层,

隐层有多少个隐节点,就代表有多少个聚类中心点 ( 聚类中心点的位置就是该隐节点与输入的连接权重 ) 。
第三层是输出层
输出层是one-hot格式(即[0 0 0 1]这样的格式),
它的节点与隐层节点个数一致,
它的值由隐层节点竞争得到, 即隐层节点哪个值最大,对应的输出节点就为1,其余为0。

  带隐层拓扑的网络拓扑图  


往往还会把隐层节点之间的拓扑结构一起画上,
 
则SOM的网络拓扑图会如下:
 


PASS:输出节点之间的拓扑结构对于最终模型的应用上是没有任何影响的,它只是在训练过程中需要使用。

  04.  SOM的模型表达式  


SOM的模型数学表达式为:


\text{y} = \textbf{compet}(-\textbf{dist}(x,W))

其中,

●  dist 为x和W的欧氏距离


例如,2输出3隐节点时, x=[x_1,x_2], W = \begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \end{bmatrix}

则:

\displaystyle \textbf{dist}(x,W) = \begin{bmatrix} \sqrt{(x_1- w_{11})^2+(x_1- w_{12})^2} \\ \\ \sqrt{(x_1- w_{21})^2+(x_1- w_{22})^2}\\ \\ \sqrt{(x_1- w_{31})^2+(x_1- w_{32})^2} \end{bmatrix}

●  compet 为竞争函数,

它将向量最大的值置为1,其实置0
例如,compet([ 2 5 3 ]) = [ 0 1 0 ]  

SOM模型输出的计算,简单来说,就是x离W哪行最近,就为1,其余为0.

背后意义就是离哪个聚类中心点近,就判为哪个聚类点。


  编后语  

本文我们先大概摸清SOM神经网络是什么,
它的思路其实并不复杂,只是Kohonen的基础上,在隐节点引入了一个拓扑结构来定义邻域
由于我们往往看到的基本都是带隐节点拓扑结构的网络拓扑图,很容易产生误会,以为隐层节点间相互连接,
其实隐节点的拓扑图只在训练阶段用于获取邻域节点,与最终的模型并没有任何关系。
在接下来的文章,我们把SOM的代码按matlab内部逻辑实现后,我们将更清晰SOM算法的具体细节与算法流程。

二、SOM-代码重写(单样本训练)


本文是笔者细扒matlab2009b神经网络工具箱newsom的源码,

在源码的基础上去除冗余代码,重现的简版newsom代码,代码与newsom的结果完全一致。
通过本代码的学习,可以完全细节的了解SOM单样本训练的实现逻辑。

  01. 代码结构说明  

代码主要包含了三个函数:   testSomNet      trainSomNet      predictSomNet  

testSomNet:  测试用例主函数,直接运行时就是执行该函数。


1、数据生成:随机生成一组训练数据,
2、用自写的函数训练一个SOM网络,与预测结果。
3、使用工具箱训练一个SOM网络。
4、比较自写函数与工具箱训练结果是否一致(权重、训练误差的比较)

trainSomNet:网络训练主函数,用于训练一个SOM神经网络。


单样本训练方式,训练一个SOM神经网络

predictSomNet:用训练好的网络进行预测。


传入需要预测的X,与网络的权重矩阵,即可得到预测结果。

02. 代码运行结果解说

运行代码后,得到预测结果与对比结果,如下:


 

 

从中可以看到,自写代码与工具箱的逻辑一致。


相关文章

​《BP神经网络梯度推导》

​​​​​​《BP神经网络提取的数学表达式》

《一个BP的完整建模流程》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型经典著作《大语言模型基础与前沿》

介绍 **《大语言模型基础与前沿》是由美国明尼苏达大学双城分校电子与计算机工程博士熊涛所著。**熊博士曾在多家中美知名高科技公司担任高级管理职位和首席科学家&#xff0c;在人工智能的多个领域&#xff0c;包括大语言模型、图神经网络等从事研发和管理工作多年。 本书深…

DBeaver 连接 OceanBase Oracle 租户

DBeaver 是一款通用的数据库工具软件&#xff0c;支持任何具有JDBC驱动程序的数据库。DBeaver 需要 Java 运行环境的支持。截稿时 DBeaver 24.0.0 版本默认提供的 OceanBase 驱动是连接 MySQL 的&#xff0c;想连接 Oracle 租户需要新建一个驱动器使用。 下载数据库驱动包 1、…

定时任务进行简单监控、爬虫的自动化之旅

原文链接&#xff1a;「定时任务」进阶指南&#xff1a;监控、爬虫的自动化之旅

spring gateway 动态路由

##yml配置 spring:application:name: public-gateway # cloud: # gateway: # routes: # - id: mybatis-plus-test # 路由的唯一标识 # uri: http://192.168.3.188:9898 # 目标服务的地址 # predicates: # - Path/test/** # 匹配…

论文1—《基于卷积神经网络的手术机器人控制系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对传统手术机器人控制系统精准度不足的问题&#xff0c;提出了一种基于卷积神经网络的手术机器人控制系统设计。研究设计了控制系统的总体结构&#xff0c;并选用PCI插槽上直接内插CAN适配卡作为上…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示&#xff1a;   OpenHarmony(简称OH)的标准系统的底层系统是linux&#xff0c;所以调用如下代码&#xff1a; linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

Python Plotly 库使用教程

Python Plotly 库使用教程 引言 数据可视化是数据分析中至关重要的一部分&#xff0c;它能够帮助我们更直观地理解数据、发现潜在的模式和趋势。Python 提供了多种数据可视化库&#xff0c;其中 Plotly 是一个功能强大且灵活的库&#xff0c;支持交互式图表的创建。与静态图表…

校园交友系统的设计与实现(开源版+三端交付+搭建+售后)

系统基础架构 采用UniApp进行开发&#xff0c;UniApp是一个使用Vue.js开发所有前端应用的框架&#xff0c;它支持编译为H5、小程序、App等多个平台。 使用PHP作为后端开发语言&#xff0c;PHP是一种广泛使用的开源脚本语言&#xff0c;尤其适用于Web开发&#xff0c;并可高效…

SQL 外连接

1 外连接 外连接是一种用于结合两个或多个表的方式&#xff0c;返回至少一个表中的所有记录。 左外连接 LEFT JOIN&#xff0c;左表为驱动表&#xff0c;右表为从表。返回驱动表的所有记录以及从表中的匹配记录。如果从表没有匹配&#xff0c;则结果中从表的部分为NULL。 右…

死磕grass平台

Grass平台:重塑互联网价值与AI数据采集的革新之路 引言&#xff1a;互联网资源的新范式 在当今数字时代,大多数互联网用户面临着一个共同但鲜少被关注的现象:我们付费购买的带宽资源往往没有被充分利用。想象一下,当你订购了100 Mbps的网络服务,在浏览新闻或查看邮件时,实际可…

Spring boot + Vue2小项目基本模板

Spring boot Vue2小项目基本模板 基本介绍基本环境安装项目搭建最终效果展示 基本介绍 项目来源哔哩哔哩的青戈&#xff0c;跟着学习搭建自己的简单vue小项目&#xff1b;看别人的项目总觉得看不懂&#xff0c;需要慢慢打磨 这里目前只简单的搭建了菜单导航和表格页面&#x…

大数据面试题--kafka夺命连环问(后10问)

目录 16、kafka是如何做到高效读写&#xff1f; 17、Kafka集群中数据的存储是按照什么方式存储的&#xff1f; 18、kafka中是如何快速定位到一个offset的。 19、简述kafka中的数据清理策略。 20、消费者组和分区数之间的关系是怎样的&#xff1f; 21、kafka如何知道哪个消…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能

&#xff08;一&#xff09;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&#xff0c;但它只能提…

万字长文解读深度学习——Transformer

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总万字长文解读…

Leecode热题100-35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

LabVIEW环境监测系统

随着环境问题的日益严重&#xff0c;环境参数的实时监测成为保障公共健康和生态平衡的重要手段。开发了一款基于LabVIEW开发的环境监测系统&#xff0c;能够对大气中的温度、湿度及二氧化硫浓度进行实时监测&#xff0c;并提供数据存储和超阈值报警功能。 系统组成 本系统由下…

7.4、实验四:RIPv2 认证和触发式更新

源文件 一、引言&#xff1a;为什么要认证和采用触发式更新&#xff1f; 1. RIP v2 认证 RIP&#xff08;Routing Information Protocol&#xff09;版本 2 添加了认证功能&#xff0c;以提高网络的安全性。认证的作用主要包括以下几点&#xff1a; 防止路由欺骗 RIP v1 是不…

人力资源招聘系统-提升招聘效率与质量的关键工具

在当今这个竞争激烈的商业环境中&#xff0c;企业要想在市场中立于不败之地&#xff0c;关键在于拥有高素质的人才队伍。然而&#xff0c;传统的招聘方式往往效率低下&#xff0c;难以精准匹配企业需求与人才特质&#xff0c;这无疑给企业的发展带来了不小的挑战。 随着科技的飞…

【Linux系统编程】第四十六弹---线程同步与生产消费模型深度解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux线程同步 1.1、同步概念与竞态条件 1.2、条件变量 1.2.1、认识条件变量接口 1.2.2、举例子认识条件变量 1.2.3、…

UAV-VisLoc:中国11地大规模无人机视觉定位数据集

2024-05-16&#xff0c;由中科院、北京邮电大学和香港城市大学联合创建了UAV-VisLoc数据集&#xff0c;这个数据集通过收集中国11个不同地点的无人机图像和卫星地图&#xff0c;为无人机在失去全球导航卫星系统(GNSS)信号时提供精确的经纬度坐标定位&#xff0c;具有重要的实际…