✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
BP 神经网络是一种单向传播的多层前向网络, 它除了有一个输入层和一个输出层之外, 还有一层或多层的隐层, 同层节点中没有任何耦合。输入信号从输入层节点一次传过各隐层节点, 然后传到输出节点, 每一层节点的输出只影响下一层节点的输出。BP 神经网络具有的非线性映射能力保证其能够成功实现各种简单或复杂分类, 其并行结构加速了运算速度。另外, BP 神经网络将信息分布式存储于连结权系数中, 使网络具有较高的容错性和鲁棒性。因此在目前的人工神经网络的实际应用中, 绝大部分的神经网络模型是采用 BP 神经网络及它的变化形式 。然而, 由于 BP神经网络输出层的结点数只能限制在一个较小的取值范围, 因而基于 BP 神经网络的分类器所不得不面临的一个问题就是如何才能够做到分类的细致和多样性。LVQ 神经网络能够通过竞争性的隐层传递函数, 根据目标的类别将输入向量进行组合分类。该网络由两层组成, 第一层为竞争层, 第二层为线性层。竞争层能够学习对输入向量的分类;线性层将竞争层传来的分类信息转变成使用者所定义的类别 。LVQ 神经网络的优势在于:它不仅能够对线性输入数据进行分类,而且还能处理多维的 、甚至是含噪含干扰的数据量。实验已经证明, 只要在各个隐层存在足够的神经元, 那么目标输出的分类量将会得到相应的增加。
⛄ 部分代码
clear all;
close all
wine_data = xlsread('wine.xlsx');
method = 'PL';%PK:PCA & Kmeans PL:PCA & LVQ BP:BP Neural Network'
rate = 0.7;%训练集70%,测试集30%
N = 3;
total_cnt = size(wine_data,1);
train_cnt = round(total_cnt*rate);
test_cnt = total_cnt - train_cnt;
rand_idx = randperm(total_cnt);
train_idx = rand_idx(1:train_cnt);
test_idx = rand_idx(train_cnt+1:total_cnt);
train_data = wine_data(train_idx,2:size(wine_data,2));
train_class = wine_data(train_idx,1);
test_data = wine_data(test_idx,2:size(wine_data,2));
test_class = wine_data(test_idx,1);
dim = size(wine_data,2)-1;
%矩阵z-score标准化
train_SM = zeros(train_cnt,dim);
data_mean = mean(train_data);
data_std = std(train_data);
test_SM = zeros(test_cnt,dim);
for j = 1:dim
train_SM(:,j) = (train_data(:,j) - data_mean(j)) / data_std(j);
test_SM(:,j) = (test_data(:,j) - data_mean(j)) / data_std(j);
end
%三种方法
switch method
case 'PK'
[DS, com_num, PV, score] = PCA(train_SM, 0.66,'ShowFigure');
%初始化聚类中心
center_init = zeros(3,com_num);
for i = 1:N
center_init(i,:) = mean(score(train_class==i,:));
end
[center, train_flag, ~, ~] = Kmeans(score, N,center_init,'ShowFigure');%k-means聚类
test_score = test_SM * PV; %测试集的评分
test_flag = findMinIdx(test_score, center);
case 'PL'
[DS, com_num, PV, score] = PCA(train_SM, 0.66,'ShowFigure');
[pv,train_flag] = LVQ(score, train_class, [], (1:N)', 0.1, 1000,'ShowFigure');%LVQ
test_flag = findMinIdx(test_SM*PV, pv);
case 'BP'
target = (train_class - 1) / 2;
net = newff(train_SM',target',10,{'tansig','purelin'},'traingdx');
net.divideFcn = '';
net.trainParam.show = 50;
net.trainParam.epochs = 1000;
net.trainParam.goal = 0.001;
net.trainParam.lr = 0.01;
net = train(net,train_SM',target');
out = sim(net,train_SM');
train_flag = round(out*2+1)';
out = sim(net,test_SM');
test_flag = round(out*2+1)';
otherwise
fprintf('check method\n');
return;
end
train_correct_cnt = sum(train_flag(:,1) == train_class(:,1));
train_accuracy = train_correct_cnt / train_cnt %训练集准确率
test_correct_cnt = sum(test_flag(:,1) == test_class(:,1));
test_accuracy = test_correct_cnt / test_cnt %训练集准确率
figure;
plot(1:test_cnt,test_class(:,1),'bo');
hold on;
plot(1:test_cnt,test_flag(:,1),'r*');
legend('实际测试集分类','预测测试集分类');
title([method,',准确率=',num2str(test_accuracy)])
⛄ 运行结果
⛄ 参考文献
[1]钟淑瑛, 李陶深. 基于MATLAB的BP—LVQ神经网络组合分类模型[J]. 计算机技术与发展, 2006, 16(2):3.