离散Hopfield网络

离散Hopfield网络是一种经典的神经网络模型,它的基本原理是利用离散化的神经元和离散化的权值矩阵来实现模式识别和模式恢复的功能。它最初由美国物理学家John Hopfield在1982年提出,是一种单层的全连接神经网络,被广泛应用于模式识别、优化问题、自组织学习等领域。

离散Hopfield网络的基本结构由n个离散化的神经元和它们之间的全连接权值矩阵组成。每个神经元都只能取两种值,通常为1和-1。权值矩阵中的每个元素表示两个神经元之间的连接强度,即它们对彼此的影响程度。离散Hopfield网络的学习规则是基于Hebbian学习规则的,即当两个神经元同时激活时,它们之间的连接强度会增强。

离散Hopfield网络的主要功能包括模式存储、模式识别和模式恢复。在模式存储阶段,网络会将训练集中的模式存储到权值矩阵中,使得每个模式成为网络的一个吸引子。在模式识别阶段,当网络接收到一个输入模式时,它会通过神经元之间的相互作用产生一个新的状态,并在权值矩阵中寻找最接近的吸引子,将输入模式恢复为最接近的训练模式。如果网络无法恢复出一个完整的模式,那么它将停留在局部极小值或者进入震荡状态。

总之,离散Hopfield网络是一种简单但强大的神经网络模型,它在模式识别和模式恢复方面具有很好的性能,但也存在一些限制和缺陷,如存储容量有限、容易陷入局部极小值等。

与多层感知机所采用“分层型”神经网络的结构不同,Hopfield神经网络是基于“相互连接型”的、递归式的网络。

  • 从学习的观点
  • 从系统的观点
  • 从 计算的观点 来看,它并不是一强有力系统,缺乏丰富的 动力学

Hopfield网络的特点:

神经元可取二值 {0/1} 或{-1/1},其中的任意神经元i与j 间的突触权值为 Wij ,且神经元之间的连接是对称的,即,Wij = Wji ;且神经元自身无连接,但每个神经元都与其他的神经元相连。

每个神经元都将其输出通过突触权值传递给其他的神经元,同时每个神经元又都接收来自其他神经元传来的信息,这样对于每个神经元来说,其输出信号经过其他神经元后又可能反馈给自己,所以Hopfield网络是一种反馈神经网络。

其他的博主讲的原理会比我详细很多,建议去看其他博主的原理讲解,然后再来看我的实际例子效果会更好。

代码详情

Chapter1

%% 离散Hopfield的分类——高校科研能力评价

%% 清空环境变量
clear all
clc

%% 导入数据
load class.mat

%% 目标向量
T = [class_1 class_2 class_3 class_4 class_5];

%% 创建网络
net = newhop(T);

%% 导入待分类样本
load sim.mat
A = {[sim_1 sim_2 sim_3 sim_4 sim_5]};

%% 网络仿真
Y = sim(net,{25 20},{},A);

%% 结果显示
Y1 = Y{20}(:,1:5)
Y2 = Y{20}(:,6:10)
Y3 = Y{20}(:,11:15)
Y4 = Y{20}(:,16:20)
Y5 = Y{20}(:,21:25)

%% 绘图
result = {T;A{1};Y{20}};
figure
for p = 1:3
    for k = 1:5 
        subplot(3,5,(p-1)*5+k)
        temp = result{p}(:,(k-1)*5+1:k*5);
        [m,n] = size(temp);
        for i = 1:m
            for j = 1:n
                if temp(i,j) > 0
                   plot(j,m-i,'ko','MarkerFaceColor','k');
                else
                   plot(j,m-i,'ko');
                end
                hold on
            end
        end
        axis([0 6 0 12])
        axis off
        if p == 1
           title(['class' num2str(k)])
        elseif p == 2
           title(['pre-sim' num2str(k)])
        else
           title(['sim' num2str(k)])
        end
    end                
end

% 案例扩展(无法分辨情况)
noisy = [1 -1 -1 -1 -1;-1 -1 -1 1 -1;
        -1 1 -1 -1 -1;-1 1 -1 -1 -1;
        1 -1 -1 -1 -1;-1 -1 1 -1 -1;
        -1 -1 -1 1 -1;-1 -1 -1 -1 1;
        -1 1 -1 -1 -1;-1 -1 -1 1 -1;
        -1 -1 1 -1 -1];
y = sim(net,{5 100},{},{noisy});
a = y{100}

Read me

文件说明:

1. chapter1.m为主程序,将该文件夹设置为MATLAB当前工作路径,运行即可。

2. class.mat为五个理想的等级评价指标编码矩阵,sim.mat为5所待分类高校的等级评价指标编码矩阵。

3. stdlib.m为利用MATLAB自带工具箱创建的一个离散型Hopfield网络例子,test.m为与之对应的神经网络工具箱函数拆解的程序(具体在配套的视频中有详细的讲解)。

4. 该程序在MATLAB2009a版本下测试通过,个别函数在低版本中不存在或者调用格式有所不同,参照对应版本中的帮助文档修改即可。

stdlib

%% 离散Hopfield的分类——高校科研能力评价

%% 清空环境变量
clear all
clc

%% 导入记忆模式
T = [-1 -1 1; 1 -1 1]';

%% 创建网络
net = newhop(T);

%% 导入待记忆模式
Ai = {[-0.7; -0.6; 0.6]};

%% 网络记忆
a = sim(net,{1,5},{},Ai);
a{1}

Test

%% 离散Hopfield的分类——高校科研能力评价

%% 清空环境变量
clear all
clc

%% 导入记忆模式
T = [-1 -1 1; 1 -1 1]';

%% 权值和阈值学习
[S,Q] = size(T);
Y = T(:,1:Q-1) - T(:,Q)*ones(1,Q-1);
[U,SS,V] = svd(Y);
K = rank(SS);

TP = zeros(S,S);
for k = 1:K
  TP = TP + U(:,k)*U(:,k)';
end

TM = zeros(S,S);
for k = K+1:S
  TM = TM + U(:,k)*U(:,k)';
end

tau = 10;
Ttau = TP - tau*TM;
Itau = T(:,Q) - Ttau*T(:,Q);

h = 0.15;
C1 = exp(h)-1;
C2 = -(exp(-tau*h) - 1)/tau;

w = expm(h*Ttau);
b = U * [  C1*eye(K)         zeros(K,S-K);
         zeros(S-K,K)  C2*eye(S-K)] * U' * Itau;
     
%% 导入待记忆的模式
Ai = [-0.7; -0.6; 0.6];
y0 = Ai;

%% 迭代计算
for i = 1:5
    for j = 1:size(y0,1)
        y{i}(j,:) = satlins(w(j,:)*y0 + b(j));
    end
    y0 = y{i};
end
y{1}

总共有两组数据,如果有需要的可以私信联系。