使用Perceptron学习规则进行Hopfield网络实施

时间:2017-12-04 23:56:16

标签: matlab machine-learning neural-network perceptron

我坚持使用感知器学习规则实现Hopfiled网络。这里的想法是使用单层感知器学习模式(二元矢量)的权重,然后使用标准Hopfield算法执行关联存储器任务。但是,在我尝试调用存储的矢量后,输出不会收敛到正确的模式。

有关Perceptron实施的更多详细信息,请参阅第13.4节link

w = rand(1,21); %weights
d = [0 0 0 0 0 0]; %desired output
eta = .7;   %learning rate
x =[1 1 0 0 0 0]; %memorized pattern

z = zeros(6, 21); 


z(1,:) = [x(2) x(3) x(4) x(5) x(6)  0  0  0  0   0  0  0   0  0   0  -1 0 0 0 0 0];
z(2,:) = [x(1) 0  0  0  0  x(3) x(4) x(5) x(6)   0  0  0   0  0   0  0 -1 0 0 0 0];
z(3,:) = [0  x(1) 0  0  0  x(2)  0  0  0   x(4) x(5) x(6)  0  0   0  0 0 -1 0 0 0];
z(4,:) = [0  0  x(1) 0  0   0 x(2)  0  0   x(3) 0  0   x(5) x(6)  0  0 0 0 -1 0 0];
z(5,:) = [0  0  0  x(1) 0   0  0  x(2) 0   0  x(3) 0   x(4) 0   x(6) 0 0 0 0 -1 0];
z(6,:) = [0  0  0  0  x(1)  0  0  0  x(2)  0  0  x(3)  0  x(4)  x(5) 0 0 0 0 0 -1];


for t = 1:100   
    index = randperm(6);
   for i=1:6
      Y(t,index(i)) = z(index(i),:)*w'; 
      y(t,index(i)) = sgn(Y(t,index(i)));
        w = w + eta*(d(index(i)) - y(t,index(i)))*z(index(i),:);

   end              
end


n = 6;
probe = input('Enter the probe vector: ');
signal_vector = 2*probe-1; % Convert probe to bipolar form 
flag = 0;                       % Initialize flag 

old = signal_vector; %save original input


while flag ~= 6; % test if old vector is same as new vector

  index = randperm(n); %make sequence for asynchronous update

   for j = 1:n
   v =z(index(j),:)*w';
       if v > 0
           signal_vector(index(j)) = 1;
           x(index(j)) = 1;
       elseif v < 0
           signal_vector(index(j)) = -1;
           x(index(j)) = -1;
       end
   end
   flag = signal_vector*old';
end

disp('The recalled vector is ') 
0.5*(signal_vector + 1)

function y = sgn(x)
    if x > 0
        y = 1;
    else
        y = -1;
    end
end

0 个答案:

没有答案