54、一维和二维自组织映射(matlab)

1、一维和二维自组织映射原理

一维和二维自组织映射(Self-Organizing Maps, SOM)是一种无监督的机器学习算法,通过学习输入数据的拓扑结构,将高维输入数据映射到低维的网格结构中,使得相似的输入数据点在映射空间中也会彼此靠近。一维和二维SOM算法的原理如下:

  1. 初始化网络:首先,随机初始化一个具有一定结构的网络,通常为一维或二维的网格结构,每个节点都代表一个权重向量。

  2. 训练网络:通过迭代的方式,将输入数据通过与网络中的节点计算距离,将最接近的节点称为获胜节点(winner node),并更新获胜节点及其邻近节点的权重向量,使得它们更好地表示输入数据。

  3. 衰减学习率:在训练过程中,逐渐减小学习率和邻域半径,使得网络在接近收敛时对输入数据的调整更加小步长和局部。

  4. 完成训练:当网络收敛或迭代次数达到预设值时,训练过程结束,此时网络中的节点已经学习到了输入数据的拓扑结构。

通过以上原理,一维和二维自组织映射算法可以用于降维、聚类、可视化等领域的数据分析和模式识别任务中。

2、一维自组织映射

1)说明

二维层中的神经元可学习表示输入向量在输入空间出现的不同区域。此外,邻近的神经元可学习对相似的输入进行响应,从而该层可学习所呈现的输入空间的拓扑。

2)数据集

创建了位于单位圆上的 100 个数据点。
竞争网络将用于将这些点分成若干自然类。

代码

angles = 0:0.5*pi/99:0.5*pi;
X = [sin(angles); cos(angles)];
figure(1)
plot(X(1,:),X(2,:),'+r')

视图效果

048a36de309549169ca1febe6a8ef517.png

3)映射将是由 10 个神经元组成的一维层。

 代码

net = selforgmap(10);

 4)网络训练

说明:指定网络将接受 10 轮训练,并使用 train 基于输入数据对网络进行训练。

代码

net.trainParam.epochs = 10;
net = train(net,X);

视图效果

aed7be8acc114d8f9459e75fcd4b483a.png

 5)使用 plotsompos 绘制经过训练的网络的权重位置。

说明:红点是神经元的权重向量,蓝线连接在距离 1 内的每对红点。

代码

figure(2)
plotsompos(net)

试图效果

41525c28decc489eb8275f36ec41a873.png

6) 对输入进行分类

说明:映射可用于对输入进行分类,例如 [1; 0]。神经元 1 或 10 的输出应该为 1,因为上述输入向量位于所呈现的输入空间的一端。第一对数字表示神经元,单个数字表示其输出。

代码

x = [1;0];
a = net(x)

a =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     1
     0
     0
     0
     0

3、 二维自组织映射

1)说明

自组织映射将学习表示输入向量在输入空间中出现的不同区域
神经元会形成二维网格,对一个矩形中的 1000 个二元素向量进行分类

2)输入数据

代码

X = rands(2,1000);
figure(3)
plot(X(1,:),X(2,:),'+r')

视图效果

a262409ff9cc410b9fbde9d5859f100b.png

3) 使用 5×6 神经元层对上述向量进行分类

说明:每个神经元对矩形的不同区域作出响应,相邻神经元对相邻区域作出响应。将网络配置为匹配输入的维度

代码

net = selforgmap([5 6]);
net = configure(net,X);

4) 使用 plotsompos 可视化创建的网络。

说明:每个神经元在其两个权重的位置用红点表示。最初,所有神经元的权重相同,位于向量的中间,因此只出现一个点。

代码

figure(4)
plotsompos(net)

视图效果

a997acdd817141b08fd8f6d1411e1258.png

5) 训练网络

说明:训练后,神经元层已开始自组织,每个神经元现在界定输入空间的不同区域,并且相邻(连接的)神经元对相邻区域作出响应。

代码

figure(5)
net.trainParam.epochs = 1;
net = train(net,X);
plotsompos(net)

视图效果

79e02d27098c44a191674d6ab54c1e95.png

6) 向量输入网络并观察哪个神经元有响应来对向量进行分类

说明:由“1”表示的神经元有响应,因此 x 属于该类。

代码

x = [0.5;0.3];
y = net(x)

4、总结

使用MATLAB实现一维和二维自组织映射(SOM)可以通过使用MATLAB的 Neural Network Toolbox 来实现。以下是一维和二维自组织映射的主要步骤和示例代码:

1数据准备:首先,准备输入数据集并进行必要的预处理。

2创建SOM网络:使用 MATLAB 的 selforgmap 函数来创建一维或二维自组织映射网络。例如:

som = selforgmap([8 8]); % 创建一个 8x8 的二维SOM网络

3训练网络:使用 train 函数来训练SOM网络。例如:

[net, tr] = train(som, data);

4可视化结果:可以使用 plotsomhits 函数来可视化SOM网络的节点之间的距离。例如:

plotsomhits(som, data);

5使用SOM网络进行预测:使用 MATLAB 的 sim 函数来使用训练好的SOM网络进行数据映射。例如:

output = sim(som, new_data);

总的来说,使用 MATLAB 实现一维和二维自组织映射是比较简单和直观的,只需要利用 Neural Network Toolbox 提供的函数和工具即可轻松完成。通过训练SOM网络,可以实现数据降维、可视化、聚类等应用。

5、源代码

代码

%% 一维自组织映射
%二维层中的神经元可学习表示输入向量在输入空间出现的不同区域。此外,邻近的神经元可学习对相似的输入进行响应,从而该层可学习所呈现的输入空间的拓扑。
%% 数据集
%创建了位于单位圆上的 100 个数据点。
%竞争网络将用于将这些点分成若干自然类。
angles = 0:0.5*pi/99:0.5*pi;
X = [sin(angles); cos(angles)];
figure(1)
plot(X(1,:),X(2,:),'+r')
%映射将是由 10 个神经元组成的一维层。
net = selforgmap(10);
%网络训练
%指定网络将接受 10 轮训练,并使用 train 基于输入数据对网络进行训练。
net.trainParam.epochs = 10;
net = train(net,X);
%使用 plotsompos 绘制经过训练的网络的权重位置。
%红点是神经元的权重向量,蓝线连接在距离 1 内的每对红点。
figure(2)
plotsompos(net)
%对输入进行分类
%映射可用于对输入进行分类,例如 [1; 0]。神经元 1 或 10 的输出应该为 1,因为上述输入向量位于所呈现的输入空间的一端。第一对数字表示神经元,单个数字表示其输出。
x = [1;0];
a = net(x)
%% 二维自组织映射
%自组织映射将学习表示输入向量在输入空间中出现的不同区域
%神经元会形成二维网格,对一个矩形中的 1000 个二元素向量进行分类
%输入数据
X = rands(2,1000);
figure(3)
plot(X(1,:),X(2,:),'+r')
%使用 5×6 神经元层对上述向量进行分类
%每个神经元对矩形的不同区域作出响应,相邻神经元对相邻区域作出响应。将网络配置为匹配输入的维度
net = selforgmap([5 6]);
net = configure(net,X);
%使用 plotsompos 可视化创建的网络。
%每个神经元在其两个权重的位置用红点表示。最初,所有神经元的权重相同,位于向量的中间,因此只出现一个点。
figure(4)
plotsompos(net)
%训练网络
%训练后,神经元层已开始自组织,每个神经元现在界定输入空间的不同区域,并且相邻(连接的)神经元对相邻区域作出响应。
figure(5)
net.trainParam.epochs = 1;
net = train(net,X);
plotsompos(net)
%向量输入网络并观察哪个神经元有响应来对向量进行分类
%由“1”表示的神经元有响应,因此 x 属于该类。
x = [0.5;0.3];
y = net(x)

 

 

相关推荐

  1. 关于维和数据的简单转化问题(pandas库)

    2024-07-09 19:52:09       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 19:52:09       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 19:52:09       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 19:52:09       43 阅读
  4. Python语言-面向对象

    2024-07-09 19:52:09       54 阅读

热门阅读

  1. 从零开始!Jupyter Notebook的安装教程

    2024-07-09 19:52:09       23 阅读
  2. UI 自动化分布式测试 -- Docker Selenium Grid

    2024-07-09 19:52:09       18 阅读
  3. Spring Cloud Gateway报sun.misc.Unsafe.park(Native Method)

    2024-07-09 19:52:09       30 阅读
  4. Spring Cloud Gateway如何匹配某路径并进行路由转发

    2024-07-09 19:52:09       24 阅读
  5. 裸金属服务器与物理服务器之间的区别

    2024-07-09 19:52:09       18 阅读
  6. 精准注入:掌握Conda包依赖注入的艺术

    2024-07-09 19:52:09       26 阅读
  7. Haproxy搭建Web群集

    2024-07-09 19:52:09       22 阅读
  8. 同步的艺术:Conda包依赖的自动同步策略

    2024-07-09 19:52:09       26 阅读