2017-02-04 17 views
1

мой первый раз задавая вопрос.MATLAB Perceptron с нуля - OR функция

Я преподаю себе нейронные сети и в настоящее время пытаюсь запрограммировать алгоритм персептрона. Я хочу тренировать его для функции ИЛИ, но он не работает. У меня нет абсолютно никакой идеи относительно того, что я делаю неправильно, и в Интернете нет решений, которые не используют инструментарий.

input = [0 0; 0 1; 1 0; 1 1]%input vector 
num_in = 4;% number of iterations 
desired_out = [0;1;1;1] %desired output 
bias = -1; %bias 
w=zeros(2,1); %weight vector, initially zero 
iterations = 100; % number of iterations to go through 

for i = 1:iterations 
    out = zeros(4,1); 
    for j = 1:num_in %go per row of x 
      y = bias+input(j,1)*w(1,1)+input(j,2)*w(2,1) %sum 
      if(out(j,1)~=desired_out(j,1)) % modify weights and bias if mismatch exists 
      bias = bias+desired_out(j,1); 
      w(1,1) =w(1,1)+input(j,1)*desired_out(j,1); 
      w(2,1) = w(2,1)+input(j,2)*desired_out(j,1); 
      end 
    end 
end 
out %print the output 

ответ

1

Я не знаю, какой персептрон алгоритм вы следуете, но я думаю, что the one on Wikipedia является то, что вы пытаетесь осуществить.

  1. Лучше включать уклон в весах, т.е. w будет 3x1, и вы должны добавить столбец единиц на конец ваших входных функций. Это позволит вам реализовать wx+b с использованием матричного умножения, то есть в векторизованном виде.
  2. Вы не обновляете out. Вы должны были бы добавить следующую строку: out(j,1) = y > 0;
  3. Почему вы положите это условие: if(out(j,1)~=desired_out(j,1))? Он не упоминается в Википедии. Во всяком случае, если вы хотите обновлять только ошибки, то вам придется обновлять по-разному ошибки, сделанные на положительных и отрицательных образцах. См. this.
  4. Выполнение input(j,1)*desired_out(j,1) неверно. Согласно Википедии, это должно быть (desired_out(j,1)-out(j,1)).

Исправленный код выглядит следующим образом:

input = [0 0 1; 0 1 1; 1 0 1; 1 1 1] % input vector 
num_in = 4; % number of samples 
desired_out = [0;1;1;1] % desired output 
w=zeros(3,1); % weight vector, initially zero 
iterations = 100; % number of iterations to go through 

for i = 1:iterations 
    out = zeros(4,1); 
    for j = 1:num_in % go per row of x 
     y = input(j,1)*w(1,1)+input(j,2)*w(2,1)+w(3,1); % sum 
     out(j,1) = y>0; 
     w(1,1) =w(1,1)+input(j,1)*(desired_out(j,1)-out(j,1)); 
     w(2,1) = w(2,1)+input(j,2)*(desired_out(j,1)-out(j,1)); 
     w(3,1) = w(3,1)+input(j,3)*(desired_out(j,1)-out(j,1)); 
    end 
end 
out %print the output 

Это может быть векторизованы дальше, используя матрицу умножений вместо for петель, но я оставлю это до вас.