使用自组织映射对数据进行聚类
对数据进行聚类是神经网络的另一个绝佳应用。此过程涉及按相似性对数据进行分组。例如,您可以:
根据人们的购买模式对他们进行分组,从而进行市场细分
通过将数据划分为相关子集来进行数据挖掘
通过对具有相关表达模式的基因进行分组来进行生物信息学分析
假设您要根据花瓣长度、花瓣宽度、萼片长度和萼片宽度来对花卉类型进行聚类。您有 150 个样本,并且您有它们的上述四个测量值。
与函数拟合和模式识别一样,解决此问题的方法有两种:
使用命令行解决方案,如使用命令行函数中所述。定义问题
要定义聚类问题,只需将要聚类的 Q 个输入向量排列成一个输入矩阵中的列(有关静态和时序数据的数据格式的详细说明,请参阅数据结构)。例如,您可能要对以下包含 10 个二元素向量的集合进行聚类:
inputs = [7 0 6 2 6 5 6 1 0 1; 6 2 5 0 7 5 5 1 2 2]
下一节说明如何使用 nctool GUI 训练网络。使用神经网络聚类
如果需要,使用以下命令打开 Neural Network Start GUI:
nnstart
点击 Clustering app 打开神经网络聚类。(您也可以使用命令 nctool。)
点击 Next。将显示 Select Data 窗口。
点击 Load Example Data Set。将显示 Clustering Data Set Chooser 窗口。
在此窗口中,选择 Simple Clusters,然后点击 Import。将返回 Select Data 窗口。
点击 Next 前往 Network Size 窗口,如下图所示。
对于聚类问题,自组织特征映射 (SOM) 是最常用的网络,因为网络经过训练后,有许多可视化工具可用于分析生成的聚类。此网络的一个层的神经元以网格形式组织。(有关 SOM 的详细信息,请参阅自组织特征映射。)创建网络时,需要指定网格的行数和列数。此处,行数和列数设置为 10。神经元总数为 100。如果需要,可以在另一次运行时更改此数字。
点击 Next。将显示 Train Network 窗口。
点击 Train。
训练运行最大轮数 200。
对于 SOM 训练,与每个神经元关联的权重向量都会朝着成为输入向量簇中心的方向移动。此外,拓扑中彼此相邻的神经元也应在输入空间中相互靠近,因此可以在网络拓扑的两个维度中可视化高维输入空间。研究 SOM 的一些可视化工具。在 Plots 窗格下,点击 SOM Sample Hits。
默认的 SOM 拓扑是六边形的。此图显示了拓扑中的神经元位置,并指示每个神经元(簇中心)有多少训练数据相关联。该拓扑是一个 10×10 网格,因此有 100 个神经元。与任一神经元关联的最大命中数为 31。因此,该簇中有 31 个输入向量。
您还可以通过显示权重平面(也称为成分平面)来可视化 SOM。在神经网络聚类中点击 SOM Weight Planes。
该图显示了输入向量的每个元素的权重平面(在本例中为两个)。它们是将每个输入连接到每个神经元的权重的可视化表示。(深色代表较大权重。)如果两个输入的连接模式非常相似,则可以假设这两个输入高度相关。在这种情况下,输入 1 的连接与输入 2 的连接非常不同。
在神经网络聚类中,点击 Next 以评估网络。
此时,您可以针对新数据测试网络。
如果您不满意网络对原始数据或新数据的性能,可以增加神经元数量或获取更大的训练数据集。
如果您对网络性能满意,请点击 Next。
使用以下面板中的选项生成 MATLAB 函数或 Simulink 图,用于仿真您的神经网络。您可以使用生成的代码或图来更好地理解您的神经网络如何根据输入计算输出,或使用 MATLAB Compiler 工具和其他 MATLAB 及 Simulink 代码生成工具来部署网络。
使用以下屏幕上的按钮保存结果。
您可以点击 Simple Script 或 Advanced Script 创建 MATLAB® 代码,以通过命令行执行这些代码来重现前面的所有步骤。如果您要了解如何使用工具箱的命令行功能来自定义训练过程,则创建 MATLAB 代码会很有帮助。在使用命令行函数中,您可以更详细地研究生成的脚本。
您还可以将网络保存为工作区中的 net。您可以对它执行额外的测试,或让其处理新输入。
生成脚本并保存结果后,点击 Finish。使用命令行函数
了解如何使用工具箱的命令行功能的最简单方法是从 GUI 生成脚本,然后修改它们以自定义网络训练。例如,我们来看一下在上一节的步骤 14 中创建的简单脚本。
% Solve a Clustering Problem with a Self-Organizing Map
% Script generated by NCTOOL
%
% This script assumes these variables are defined:
%
% simpleclusterInputs - input data.
inputs = simpleclusterInputs;
% Create a Self-Organizing Map
dimension1 = 10;
dimension2 = 10;
net = selforgmap([dimension1 dimension2]);
% Train the Network
[net,tr] = train(net,inputs);
% Test the Network
outputs = net(inputs);
% 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,inputs)
% figure, plotsompos(net,inputs)
您可以保存脚本,然后从命令行运行它,以重现上次 GUI 会话的结果。您还可以编辑脚本来自定义训练过程。在此例中,请遵循脚本中的每个步骤。
脚本假设输入向量已加载到工作区中。要显示命令行操作,您可以使用不同于 GUI 操作所用的数据集。以花卉数据集为例。鸢尾花数据集由 150 个四元素输入向量组成。
load iris_dataset
inputs = irisInputs;
创建一个网络。对于此示例,使用自组织映射 (SOM)。此网络的一个层的神经元以网格形式组织。(有关详细信息,请参阅自组织特征映射。)使用 selforgmap 创建网络时,请指定网格的行数和列数:
dimension1 = 10;
dimension2 = 10;
net = selforgmap([dimension1 dimension2]);
训练网络。SOM 网络使用默认的批量 SOM 算法进行训练。
[net,tr] = train(net,inputs);
在训练期间,训练窗口会打开并显示训练进度。要随时中断训练,请点击 Stop Training。
测试网络。您可以使用经过训练的网络来计算网络输出。
outputs = net(inputs);
查看网络图。
view(net)
对于 SOM 训练,与每个神经元关联的权重向量都会朝着成为输入向量簇中心的方向移动。此外,拓扑中彼此相邻的神经元也应在输入空间中相互靠近,因此可以在网络拓扑的两个维度中可视化高维输入空间。默认的 SOM 拓扑是六边形的;要进行查看,请输入以下命令。
figure, plotsomtop(net)
在此图中,每个六边形表示一个神经元。网格为 10×10,因此在此网络中总共有 100 个神经元。每个输入向量中有四个元素,因此输入空间是四维的。权重向量(簇中心)在此空间内。
由于此 SOM 具有二维拓扑,因此可以用两个维度来可视化四维簇中心之间的关系。SOM 的一个可视化工具是权重距离矩阵(也称为 U 矩阵)。
要查看 U 矩阵,请在训练窗口中点击 SOM Neighbor Distances。
在下图中,蓝色六边形表示神经元。红线连接相邻的神经元。包含红线的区域中的颜色指示神经元之间的距离。颜色越深,表示距离越远;颜色越浅,表示距离越近。一条深色带从底部中心区域延伸至右上角区域。SOM 网络看上去已将花卉聚类成两个不同的组。
要进一步熟悉命令行操作,请尝试以下任务:
在训练期间,打开绘图窗口(如 SOM 权重位置图),并观察其动画效果。
此外,从命令行进行训练时,可以查看高级脚本以了解更多选项。