使用自组织映射对数据进行聚类
对数据进行聚类是神经网络的另一个绝佳应用。此过程涉及按相似性对数据进行分组。例如,您可以:
根据人们的购买模式对他们进行分组,从而进行市场细分
通过将数据划分为相关子集来进行数据挖掘
通过对具有相关表达模式的基因进行分组来进行生物信息学分析
假设您要根据花瓣长度、花瓣宽度、萼片长度和萼片宽度来对花卉类型进行聚类。您有 150 个样本,并且您有它们的上述四个测量值。
与函数拟合和模式识别一样,解决此问题的方法有两种:
使用神经网络聚类,如使用神经网络聚类对数据进行聚类中所述。
使用命令行函数,如使用命令行函数对数据进行聚类中所述。
一般最好从 App 开始,然后使用该 App 自动生成命令行脚本。在使用任何方法之前,首先通过选择数据集来定义问题。每个神经网络 App 都可以访问采样数据集,您可以使用这些数据集来试验工具箱(请参阅浅层神经网络的样本数据集)。如果您有要解决的特定问题,可以将您自己的数据加载到工作区中。下一节介绍数据格式。
定义问题
要定义聚类问题,请将输入向量(预测变量)排列为输入矩阵中的列。例如,您可能要对以下包含 10 个二元素向量的集合进行聚类:
predictors = [7 0 6 2 6 5 6 1 0 1; 6 2 5 0 7 5 5 1 2 2]
下一节说明如何使用神经网络聚类训练网络以对数据进行聚类。此示例使用工具箱附带的示例数据集。
使用神经网络聚类对数据进行聚类
此示例说明如何使用神经网络聚类训练浅层神经网络来对数据进行聚类。
使用 nctool
打开神经网络聚类。
nctool
选择数据
神经网络聚类提供了示例数据来帮助您开始训练神经网络。
要导入示例鸢尾花聚类数据,请选择导入 > 导入鸢尾花数据集。如果您从文件或工作区导入自己的数据,则必须指定预测变量,以及观测值是位于行中还是列中。
有关导入数据的信息显示在模型摘要中。此数据集包含 150 个观测值,每个观测值有 4 个特征。
创建网络
对于聚类问题,自组织特征映射 (SOM) 是最常用的网络。此网络的一个层的神经元以网格形式组织。自组织映射学习基于相似性对数据进行聚类。有关 SOM 的详细信息,请参阅自组织映射神经网络的聚类。
要创建网络,请指定映射大小,这对应于网格中的行数和列数。对于此示例,请将映射大小值设置为 10,这对应于 10 行 10 列的网格。神经元的总数等于网格中的点数,在此示例中,映射有 100 个神经元。您可以在网络窗格中看到网络架构。
训练网络
要训练网络,请点击训练。在训练窗格中,您可以看到训练进度。训练会一直持续,直到满足其中一个停止条件。在此示例中,训练会一直持续,直到达到最大训练轮数。
分析结果
要分析训练结果,请生成绘图。对于 SOM 训练,与每个神经元关联的权重向量都会朝着成为输入向量簇中心的方向移动。此外,拓扑中彼此相邻的神经元也应在输入空间中相互靠近,因此可以在网络拓扑的两个维度中可视化高维输入空间。默认的 SOM 拓扑是六边形的。
要绘制 SOM 采样命中数,请在绘图部分中,点击采样命中数。此图显示了拓扑中的神经元位置,并指示每个神经元(簇中心)有多少观测值相关联。该拓扑是一个 10×10 网格,因此有 100 个神经元。与任一神经元关联的最大命中数为 5。因此,该簇中有 5 个输入向量。
绘制权重平面(也称为成分平面)。在绘图部分中,点击权重平面。此图显示输入特征的每个元素的权重平面(此示例中为 4 个)。该图显示将每个输入连接到每个神经元的权重,颜色越暗,表示权重越大。如果两个特征的连接模式非常相似,则可以假设这两个特征高度相关。
如果您对网络性能不满意,可以执行以下操作之一:
重新训练网络。每次训练都会采用不同网络初始权重和偏置,并且在重新训练后可以产生改进的网络。
通过增大映射大小来增大神经元的数量。
使用更大的训练数据集。
您还可以评估基于附加测试集的网络性能。要加载附加测试数据来评估网络,请在测试部分中,点击测试。生成图来分析附加测试结果。
生成代码
选择生成代码 > 生成简单的训练脚本以创建 MATLAB 代码,从命令行重现前面的步骤。如果您要了解如何使用工具箱的命令行功能来自定义训练过程,则创建 MATLAB 代码会很有帮助。在使用命令行函数对数据进行聚类中,您可以更详细地研究生成的脚本。
导出网络
您可以将经过训练的网络导出到工作区或 Simulink®。您也可以使用 MATLAB Compiler™ 工具和其他 MATLAB 代码生成工具部署网络。要导出您的训练网络和结果,请选择导出模型 > 导出到工作区。
使用命令行函数对数据进行聚类
了解如何使用工具箱的命令行功能的最简单方法是从 App 生成脚本,然后修改它们以自定义网络训练。例如,我们来看一下在上一节中使用神经网络聚类创建的简单脚本。
% Solve a Clustering Problem with a Self-Organizing Map % Script generated by Neural Clustering app % Created 21-May-2021 10:15:01 % % This script assumes these variables are defined: % % irisInputs - input data. x = irisInputs; % Create a Self-Organizing Map dimension1 = 10; dimension2 = 10; net = selforgmap([dimension1 dimension2]); % Train the Network [net,tr] = train(net,x); % Test the Network y = net(x); % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotsomtop(net) %figure, plotsomnc(net) %figure, plotsomnd(net) %figure, plotsomplanes(net) %figure, plotsomhits(net,x) %figure, plotsompos(net,x)
您可以保存脚本,然后从命令行运行它,以重现上次训练会话的结果。您还可以编辑脚本来自定义训练过程。在此例中,请遵循脚本中的每个步骤。
选择数据
该脚本假设预测变量已加载到工作区中。如果未加载数据,您可以按如下方式加载它:
load iris_dataset
此命令将预测变量 irisInputs
加载到工作区中。
此数据集是工具箱的示例数据集之一。有关可用数据集的信息,请参阅浅层神经网络的样本数据集。您可以输入命令 help nndatasets
来查看所有可用数据集的列表。您可以使用自己的变量名称从这些数据集中加载变量。例如,命令
x = irisInputs;
x
中。创建网络
创建一个网络。对于此示例,使用自组织映射 (SOM)。此网络的一个层的神经元以网格形式组织。有关详细信息,请参阅自组织映射神经网络的聚类。使用 selforgmap
创建网络时,请指定网格的行数和列数。
dimension1 = 10; dimension2 = 10; net = selforgmap([dimension1 dimension2]);
训练网络
训练网络。SOM 网络使用默认的批量 SOM 算法进行训练。
[net,tr] = train(net,x);
在训练期间,训练窗口会打开并显示训练进度。您随时可以通过点击停止按钮 来中断训练。
测试网络
测试网络。您可以使用经过训练的网络来计算网络输出。
y = net(x);
查看网络
查看网络图。
view(net)
分析结果
对于 SOM 训练,与每个神经元关联的权重向量都会朝着成为输入向量簇中心的方向移动。此外,拓扑中彼此相邻的神经元也应在输入空间中相互靠近,因此可以在网络拓扑的两个维度中可视化高维输入空间。默认的 SOM 拓扑是六边形的;要进行查看,请输入以下命令。
figure, plotsomtop(net)
在此图中,每个六边形表示一个神经元。网格为 10×10,因此在此网络中总共有 100 个神经元。每个输入向量有四个特征,因此输入空间是四维的。权重向量(簇中心)在此空间内。
由于此 SOM 具有二维拓扑,因此可以用两个维度来可视化四维簇中心之间的关系。SOM 的一个可视化工具是权重距离矩阵(也称为 U 矩阵)。
要查看 U 矩阵,请在训练窗口中点击 SOM 邻点距离。
在下图中,蓝色六边形表示神经元。红线连接相邻的神经元。包含红线的区域中的颜色指示神经元之间的距离。颜色越深,表示距离越远;颜色越浅,表示距离越近。有一条深色带穿过该图。SOM 网络看上去已将花卉聚类成两个不同的组。
后续步骤
要进一步熟悉命令行操作,请尝试以下任务:
在训练期间,打开绘图窗口(如 SOM 权重位置图),并观察其动画效果。
从命令行使用
plotsomhits
、plotsomnc
、plotsomnd
、plotsomplanes
、plotsompos
和plotsomtop
等函数绘图。
另请参阅
神经网络拟合 | 神经网络时间序列 | 神经网络模式识别 | 神经网络聚类 | 深度网络设计器 | train