LVQ 神经网络的 MATLAB 函数详解
一、引言
学习向量量化(Learning Vector Quantization,LVQ)神经网络在模式识别、分类等领域有着重要的应用。MATLAB 作为一款功能强大的数学软件,提供了便捷的函数来构建、训练和应用 LVQ 神经网络。本文将深入探讨 MATLAB 中与 LVQ 神经网络相关的函数,详细解析其参数、用法以及通过丰富的代码示例展示如何利用这些函数解决实际问题。
二、LVQ 神经网络基础回顾
(一)网络结构
LVQ 神经网络通常包含输入层、竞争层等。输入层节点数量取决于输入数据的特征维度,竞争层的神经元数量则与要分类的类别数量相关。每个竞争层神经元对应一个类别,其连接权重向量在训练过程中不断调整以代表所属类别的典型特征。
(二)工作原理
当输入数据进入网络后,通过计算输入向量与竞争层神经元权重向量之间的距离(常用欧几里得距离)来确定哪个神经元"获胜",即距离最小的神经元。然后根据输入数据的真实类别和获胜神经元对应的类别,按照特定的权重更新规则(如果类别一致则向输入向量靠近更新,不一致则远离)来调整权重向量,经过多次迭代训练使网络具备准确分类的能力。
三、MATLAB 中创建 LVQ 神经网络的函数:newlvq
(一)函数语法
net = newlvq(PR, S1, PC, LR, LF)
(二)参数详解
- PR(输入范围矩阵) :
它是一个Rx2
的矩阵,其中R
表示输入向量的维数,每一行指定了对应输入元素的最小值和最大值范围。例如,如果输入数据是二维的,且第一个特征范围是[0, 10]
,第二个特征范围是[5, 15]
,则PR
可以定义为[0 10; 5 15]
。以下是生成PR
矩阵的简单代码示例:
matlab
% 假设输入数据有 3 个特征维度
input_dim = 3;
min_values = [0 1 2]; % 每个特征的最小值
max_values = [10 15 20]; % 每个特征的最大值
PR = [min_values; max_values]';
-
S1(竞争层神经元数量) :指定竞争层中神经元的个数,也就是要分类的类别数量或者聚类中心的数量。比如要对 5 种不同类型的数据进行分类,就可以设置
S1 = 5
。 -
PC(类别比例矩阵) :
它是一个
S1x1
的矩阵,用于表示每个类别在训练数据中的比例情况。如果训练数据中各类别比例均匀,对于S1 = 5
的情况,可以设置PC = ones(5, 1) / 5
;如果某一类别的数据占比更多,例如第一类数据占总训练数据的 40%,其他四类各占 15%,则可以设置PC = [0.4; 0.15; 0.15; 0.15; 0.15]
。以下是根据实际类别数量动态生成均匀比例PC
矩阵的代码:
matlab
num_classes = 4;
PC = ones(num_classes, 1) / num_classes;
-
LR(学习率) :学习率决定了权重更新的步长大小,取值范围通常在
0
到1
之间。较小的学习率使得训练过程更稳定但可能收敛较慢,较大学习率可能加快收敛但容易导致错过最优解。例如,可以初始设置LR = 0.1
。 -
LF(学习函数) :指定学习函数,常用的是
'learnlv1'
或者'learnlv2'
。'learnlv1'
按照基本的 LVQ1 学习规则更新权重(即简单的根据类别匹配情况靠近或远离输入向量更新),'learnlv2'
则是基于改进的 LVQ2 学习规则,它在一定条件下对边界向量进行更精细的调整,有助于提高分类准确率。
(三)代码示例
以下是创建一个简单 LVQ 神经网络用于对 3 类数据进行分类的完整代码:
matlab
% 定义输入范围,假设输入数据有 4 个特征维度
input_dim = 4;
PR = [zeros(1, input_dim); ones(1, input_dim)]';
% 竞争层神经元数量(类别数量)
S1 = 3;
% 均匀的类别比例
PC = ones(S1, 1) / S1;
% 学习率
LR = 0.1;
% 使用 learnlv1 学习函数
LF = 'learnlv1';
net = newlvq(PR, S1, PC, LR, LF);
四、训练 LVQ 神经网络的函数:train
(一)函数语法
[net, tr] = train(net, X, T)
(二)参数详解
-
net(已创建的 LVQ 神经网络对象) :就是通过
newlvq
函数创建好的网络对象,包含了网络的结构、初始权重等信息。 -
X(输入训练数据矩阵) :它是一个
NxR
的矩阵,其中N
表示训练样本的数量,R
表示输入数据的特征维度,即每个样本的特征向量按行排列。例如,有 100 个训练样本,每个样本特征维度为 5,则X
矩阵的大小为100x5
。以下是简单生成模拟训练数据矩阵的代码:
matlab
% 生成 100 个训练样本,每个样本 3 个特征维度
num_samples = 100;
input_dim = 3;
X = rand(num_samples, input_dim);
- T(目标输出矩阵,即类别标签矩阵) :
它是一个NxS1
的矩阵,其中N
同样是训练样本数量,S1
是类别数量(竞争层神经元数量)。矩阵元素通常采用1
和-1
来表示类别归属,例如对于属于第一类的样本,其对应的第一列元素为1
,其他列为-1
;如果是第二类样本,则第二列元素为1
,其余为-1
,以此类推。下面是根据已知类别标签向量生成目标输出矩阵的代码示例(假设已知类别标签向量labels
,类别数量为num_classes
):
matlab
num_samples = length(labels);
num_classes = 3;
T = zeros(num_samples, num_classes);
for i = 1:num_samples
T(i, labels(i)) = 1;
end
- 返回值 :
net
返回训练后的网络对象,其权重等参数已经根据训练数据进行了调整;tr
返回训练记录结构体,包含了训练过程中的一些信息,如每一轮训练的误差等,可以用于后续分析训练过程的效果。
(三)代码示例
以下是结合前面创建的网络进行训练的完整代码,假设已经有了合适的训练数据 X_train
和对应的类别标签矩阵 T_train
:
matlab
% 创建 LVQ 网络(前面已介绍相关参数设置示例)
net = newlvq(PR, S1, PC, LR, LF);
% 进行训练
[net, tr] = train(net, X_train, T_train);
五、使用训练好的 LVQ 神经网络进行分类预测的函数:sim
(一)函数语法
Y = sim(net, X)
(二)参数详解
-
net(训练好的 LVQ 神经网络对象) :经过
train
函数训练后得到的网络,具备了对输入数据进行分类的能力。 -
X(待分类的输入数据矩阵) :格式与训练数据矩阵类似,是一个
MxR
的矩阵,其中M
是待分类样本的数量,R
是输入特征维度。 -
Y(预测输出矩阵) :它是一个
MxS1
的矩阵,其元素表示每个样本属于各个类别的预测概率或得分等情况,通常可以根据每一行的最大值所在列来确定样本所属的类别。
(三)代码示例
以下是使用训练好的网络对新的测试数据进行分类预测的代码:
matlab
% 假设已经有测试数据 X_test
Y_pred = sim(net, X_test);
% 获取预测的类别标签,这里简单取每行最大值对应的类别索引(从 1 开始)
[~, predicted_labels] = max(Y_pred, [], 2);
六、LVQ 神经网络性能评估相关函数
(一)计算分类准确率的代码示例
可以使用以下方式计算分类准确率,假设已知真实的类别标签向量 true_labels
和预测的类别标签向量 predicted_labels
:
matlab
num_correct = sum(true_labels == predicted_labels);
accuracy = num_correct / length(true_labels) * 100;
disp(['分类准确率为:', num2str(accuracy), '%']);
(二)绘制训练过程误差曲线(使用 tr
结构体)
以下代码可以绘制出训练过程中每一轮的误差变化曲线,便于直观查看网络训练的收敛情况:
matlab
plot(tr.epoch, tr.perf);
xlabel('训练轮数');
ylabel('误差');
title('LVQ 神经网络训练误差曲线');
七、综合应用示例
(一)数据集准备
以一个简单的模拟二维数据分类问题为例,生成两类数据,分别服从不同的正态分布,代码如下:
matlab
% 生成第一类数据
num_samples_class1 = 100;
mean1 = [1 1];
covariance1 = [0.2 0; 0 0.2];
data_class1 = mvnrnd(mean1, covariance1, num_samples_class1);
% 生成第二类数据
num_samples_class2 = 100;
mean2 = [3 3];
covariance2 = [0.2 0; 0 0.2];
data_class2 = mvnrnd(mean2, covariance2, num_samples_class2);
% 合并数据并生成类别标签
X = [data_class1; data_class2];
labels = [ones(num_samples_class1, 1); 2 * ones(num_samples_class2, 1)];
% 生成目标输出矩阵
T = zeros(num_samples_class1 + num_samples_class2, 2);
for i = 1:length(labels)
T(i, labels(i)) = 1;
end
(二)网络创建、训练与预测
matlab
% 定义输入范围
PR = [min(X(:, 1)) max(X(:, 1)); min(X(:, 2)) max(X(:, 2))]';
% 创建 LVQ 网络,设置竞争层神经元数量为 2(对应两类数据)等参数
S1 = 2;
PC = ones(S1, 1) / S1;
LR = 0.1;
LF = 'learnlv1';
net = newlvq(PR, S1, PC, LR, LF);
% 训练网络
[net, tr] = train(net, X, T);
% 生成一些新的测试数据用于预测
num_test_samples = 50;
test_data = [randn(num_test_samples, 1) + 1 randn(num_test_samples, 1) + 1;
randn(num_test_samples, 1) + 3 randn(num_test_samples, 1) + 3];
% 进行分类预测
Y_pred = sim(net, test_data);
[~, predicted_labels] = max(Y_pred, [], 2);
(三)性能评估
matlab
% 计算分类准确率
accuracy = sum(labels(end - num_test_samples + 1:end) == predicted_labels) / num_test_samples * 100;
disp(['分类准确率为:', num2str(accuracy), '%']);
% 绘制训练误差曲线
plot(tr.epoch, tr.perf);
xlabel('训练轮数');
ylabel('误差');
title('LVQ 神经网络训练误差曲线');
八、总结
通过对 MATLAB 中 LVQ 神经网络相关函数的详细解析以及丰富的代码示例展示,我们可以看到利用这些函数能够方便地构建、训练和应用 LVQ 神经网络来解决分类等实际问题。从网络的初始创建,到依据训练数据进行权重调整训练,再到对新数据的准确分类预测以及性能评估,各个环节都有对应的函数提供支持。掌握这些函数的用法,有助于我们在不同的领域中充分发挥 LVQ 神经网络的优势,实现高效的数据分类和模式识别任务。同时,我们也可以根据实际需求进一步调整参数、优化网络结构等,以获得更好的应用效果。