1.简述
竞争神经网络:
自组织竞争神经网络是一种无监督的学习方法。与之前不同的是,前几节讲述的神经网络都是有标签,并且更新所有权值,但是他们并没有考虑到人体神经元的侧抑制现象,也就是在很多情况下,某一个神经元刺激仅能激活很少一部分神经元而不是所有神经元,这就体现了一种竞争的思想。竞争神经网络每次只更新一个被激活的权值并且没有标签去告诉他应该怎么做,这更像是一种聚类方法。
典型的竞争神经网络有:
ART(Adaptive Rseonance Theory)
SOFM(Self-Organization Feature Mapping)
PCA(Principle Components Analysis)
SNN(Synergetic Neural Network)
为了构建带有竞争学习规则的神经网络(这是此类人工神经网络的标准技术),有3个基本元素是必需的:
(1) 一组神经元:它们具有相同的结构、且与最初随机选择的权重连接起来。因此,对于给定的输入样本集,神经元可以有不同的响应。
(2) 一个极限值:决定每个神经元强度的极限值。
(3) 一个机制:允许神经元竞争对给定输入子集的响应,这样每次只能激活一个输出神经元。竞争成功的神经元称为"赢家通吃"神经元。
竞争学习的概念:
训练模式集合为{x^1,x2,x3,x4,x5,...,xn},所有这些模式分别属于按照某种标准设定的m类模式之一(无先验知识)-通过竞争学习,网络实现自组织模式分类。每个输出节点代表一类模式,具体哪一个节点对应哪一类模式不是事先指定的,需要竞争而出。-每个节点就像一个pattern detector 或feature detector,对输入的解释是通过有无相应节点,而不是相应幅度或输入输出变换(像前反馈网络或反馈网络)-与该节点相连的权向量包含了该类模式的基本信息。
竞争学习过程是对输入矢量的聚类过程,是使得获胜节点获得最大响应的过程,是使获胜节点与输入节点之间的权矢量逐渐逼近输入矢量。 当训练结束后,对于某类输入模式P,一定有一个网络输出节点有最大响应(输出值为1),其余输出节点无响应(输出值为0)。该最大响应输出节点与输入节点之间的权矢量等于或代表此输入矢量。(这里最迷惑的地方是什么是权矢量,我个人理解为此权矢量是权值组成的向量,放个图,后面会解释怎么来的,它的意思就是weight vector和input vector重合或者最逼近的向量为最大响应的输出节点)。
SOM神经网络:
自组织映射(Self-organizing map, SOM)通过学习输入空间中的数据,生成一个低维、离散的映射(Map),从某种程度上也可看成一种降维算法。
SOM是一种无监督的人工神经网络。不同于一般神经网络基于损失函数的反向传递来训练,它运用竞争学习(competitive learning)策略,依靠神经元之间互相竞争逐步优化网络。且使用近邻关系函数(neighborhood function)来维持输入空间的拓扑结构。
维持输入空间的拓扑结构:意味着 二维映射包含了数据点之间的相对距离。输入空间中相邻的样本会被映射到相邻的输出神经元。
由于基于无监督学习,这意味着训练阶段不需要人工介入(即不需要样本标签),我们可以在不知道类别的情况下,对数据进行聚类;可以识别针对某问题具有内在关联的特征。
特点归纳:
- 神经网络,竞争学习策略
- 无监督学习,不需要额外标签
- 非常适合高维数据的可视化,能够维持输入空间的拓扑结构
- 具有很高的泛化能力,它甚至能识别之前从没遇过的输入样本
过程:
(1)训练集/测试集产生
(2)竞争神经网络创建、训练及仿真测试
(3)SOFM神经网络创建、训练及仿真测试
(4)结果对比
2.代码
%% I. 清空环境变量
clear all
clc
%% II. 训练集/测试集产生
%%
% 1. 导入数据
load water_data.mat
%%
% 2. 数据归一化
attributes = mapminmax(attributes);
%%
% 3. 训练集和测试集划分
% 训练集——35个样本
P_train = attributes(:,1:35);
T_train = classes(:,1:35);
% 测试集——4个样本
P_test = attributes(:,36:end);
T_test = classes(:,36:end);
%% III. 竞争神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newc(minmax(P_train),4,0.01,0.01); %因为结果分成四类,所以这里隐含神经元设置为4,0.01分别是是权值和阈值的学习率
%单独执行一下minmax(P_train)发现最大值是1,最小值是-1,与P_train最大值最小值符合。
% 输入 w=net.iw{1,1}; 看一下 连接权值 平均值为0 四个神经元六个特征 4*6矩阵元素全部为0
%输入 b=net.b{1} 看一下 连接阈值 edit initcon rows=4
%134行看一下 x的值是不是我们算的值
%%
% 2. 设置训练参数
net.trainParam.epochs = 500; %训练步数
%%
% 3. 训练网络
net = train(net,P_train);
%%
% 4. 仿真测试
% 训练集
t_sim_compet_1 = sim(net,P_train);
T_sim_compet_1 = vec2ind(t_sim_compet_1);
% 测试集
t_sim_compet_2 = sim(net,P_test);
T_sim_compet_2 = vec2ind(t_sim_compet_2); % vec2ind函数将稀疏矩阵转换成行向量或者列向量,T-train和classes没有用到,体现了无导师学习的过程
%运行一下 77 78 行看一下结果 哪几个神经元决定了每一个类
%% IV. SOFM神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newsom(P_train,[4 4]);
%%
% 2. 设置训练参数
net.trainParam.epochs = 200;
%%
% 3. 训练网络
net = train(net,P_train);
%%
% 4. 仿真测试
% 训练集
t_sim_sofm_1 = sim(net,P_train);
T_sim_sofm_1 = vec2ind(t_sim_sofm_1);
% 测试集
t_sim_sofm_2 = sim(net,P_test);
T_sim_sofm_2 = vec2ind(t_sim_sofm_2);
%% V. 结果对比
%%
% 1. 竞争神经网络
result_compet_1 = [T_train' T_sim_compet_1']
result_compet_2 = [T_test' T_sim_compet_2']
%% 1960009019 l13299109228
% 2. SOFM神经网络
result_sofm_1 = [T_train' T_sim_sofm_1']
result_sofm_2 = [T_test' T_sim_sofm_2']
3.运行结果