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

原创文章,转载请说明来自《老饼讲解神经网络》: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:50for i = 1:sncur_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.mzph.cn/bicheng/60608.shtml

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

相关文章

ubuntu 安装kafka-eagle

上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群 /root/efak 目录 cd /root/efak tar -zxvf kafka-eagle-bin-2.0.8.tar.gz cd /root/efak/kafka-eagle-bin-2.0.8 mkdir /root/efakmodule tar -zxvf efak-web-2.0.8-bin.tar.gz -C /root/efakmodule/ mv /root/efakmodule/efak…

小程序服务商常见问题

1: 服务器域名和开发域名都不带https前缀, 业务域名每个都需要校验文件 2: 手机开了调试可以请求, 关闭调试无法请求, 体验版接口请求不同 答: 服务商还需要通过接口给小程序设置业务域名; 但不需要校验文件; 注意: 体验版通过快速配置小程序服务器域名接口会不生效, 用普通的 …

Llama架构及代码详解

Llama的框架图如图&#xff1a; 源码中含有大量分布式训练相关的代码&#xff0c;读起来比较晦涩难懂&#xff0c;所以我们对llama自顶向下进行了解析及复现&#xff0c;我们对其划分成三层&#xff0c;分别是顶层、中层、和底层&#xff0c;如下&#xff1a; Llama的整体组成…

Docker在微服务架构中的最佳实践

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Docker在微服务架构中的最佳实践 Docker在微服务架构中的最佳实践 Docker在微服务架构中的最佳实践 引言 Docker 概述 定义与原理…

排序算法 - 冒泡

文章目录 1. 冒泡排序1.1 简介1.2 基本步骤&#xff1a;1.3 示例代码&#xff08;C&#xff09;1.4 复杂度分析1.5 动画展示 1. 冒泡排序 1.1 简介 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是通过相邻元素的比较和交换&#…

Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例

场景 Nginx代理的资源或网站等&#xff0c;url直接暴露有风险&#xff0c;需要添加身份认证&#xff0c;即输入用户名密码后才能成功访问。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 Windows上配置Nginx实现基本身份认证 修改nginx的配置文件 添加基…

丹摩征文活动|丹摩智算平台使用指南

目录 1. 登录平台与工作环境设置1.1 访问与登录1.2 创建或选择项目1.3 初始化项目环境 2. 数据上传与管理2.1 数据上传2.2 数据管理与预处理2.3 数据可视化 3. 模型构建与训练3.1 模型选择3.2 参数配置3.3 模型训练与评估 4. 模型部署与应用4.1 模型部署4.2 接口调用与集成4.3 …

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…

【数据库实验一】数据库及数据库中表的建立实验

目录 实验1 学习RDBMS的使用和创建数据库 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六、实验结果 七、评价分析及心得体会 实验2 定义表和数据库完整性 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六…

前端 JS面向对象 原型 prototype

目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题&#xff1a; function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…

NodeJS的安装 npm 配置和使用 Vue-cli安装 Vue项目介绍

一.前端工程化 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本 1. NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境&#xff0c;可以使 JavaScript 运行在服务…

软件工程概论项目(二),node.js的配置,npm的使用与vue的安装

上一章我们配置了git仓库&#xff0c;这一章我们来配置项目需要用的一些其他的环境。 放一个思维导图在这里&#xff0c;可以参考一下&#xff0c;很不全面&#xff0c;没有参考价值,反正我先这样写吧。 参考了这个nodejs的配置&#xff0c;写的很好&#xff1a;https://blog.c…

什么是crm?3000字详细解析

在现代商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;已经成为企业驱动成功的关键工具。在复杂且竞争激烈的市场中&#xff0c;如何有效地管理客户关系、提升客户满意度&#xff0c;并增加客户忠诚度&#xff0c;越来越成为企业迫切关心的问题。而CRM系统&…

3.1_文件上传漏洞

文件上传漏洞 文件上传漏洞原理&#xff1a;未对用户提交的文件进行严格校验&#xff0c;就将恶意文件解析执行&#xff0c;导致用户可以提交恶意的文件进行攻击&#xff1b; 利用方式&#xff08;危害&#xff09;&#xff1a; 1&#xff09;. 上传 HTML/SVG 进行 XSS 攻击&…

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…

Notepad++的完美替代

由于Notepad的作者曾发表过可能在开发者代码中植入恶意软件的言论&#xff0c;他备受指责。在此&#xff0c;我向大家推荐一个Notepad的完美替代品——NotepadNext和Notepad--。 1、NotepadNext NotepadNext的特点&#xff1a; 1、跨平台兼容性 NotepadNext基于Electron或Qt…

为什么RNN(循环神经网络)存在梯度消失和梯度爆炸?

1️⃣ 原理分析 RNN前向传播的公式为&#xff1a; x t x_t xt​是t时刻的输入 s t s_t st​是t时刻的记忆&#xff0c; s t f ( U ⋅ x t W ⋅ s t − 1 ) s_tf(U\cdot x_tW\cdot s_{t-1}) st​f(U⋅xt​W⋅st−1​)&#xff0c;f表示激活函数&#xff0c; s t − 1 s_{t-1} …

NUXT3学习日记二(样式配置、引入组件库、区分在服务端还是在客户端渲染)

上一章已经给大家分享官网下载的nuxt3了&#xff0c;下面正式进入我所要说的内容吧 一、初始化样式 想必大家从我的git下载下来的nuxt3&#xff0c;能看到nuxt.config.ts这个文件了吧。 这里我们有两种css配置方式 1、css:[~/assets/base.scss] 这种方式不能在scss文件中定义…

2024AAAI | DiffRAW: 利用扩散模型从手机RAW图生成单反相机质量的RGB图像

文章标题&#xff1a;《DiffRAW: Leveraging Diffusion Model to Generate DSLR-Comparable Perceptual Quality sRGB from Smartphone RAW Images》 原文链接&#xff1a;DiffRAW 本文是清华大学深圳研究院联合华为发表在AAAI-2024上的论文&#xff08;小声bb&#xff1a;华…

计算机视觉 ---图像模糊

1、图像模糊的作用&#xff1a; 减少噪声&#xff1a; 在图像获取过程中&#xff0c;例如通过相机拍摄或者传感器采集&#xff0c;可能会受到各种因素的干扰&#xff0c;从而引入噪声。这些噪声在图像上表现为一些孤立的、不符合图像主体内容的像素变化&#xff0c;如椒盐噪声&…