【问题标题】:MATLAB Perceptron from scratch - OR function从零开始的 MATLAB Perceptron - OR 函数
【发布时间】:2017-06-21 23:24:42
【问题描述】:

我第一次问问题。

我正在自学神经网络,目前正在尝试编写感知器算法。我想为 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

【问题讨论】:

    标签: matlab neural-network training-data perceptron


    【解决方案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 循环来进一步向量化,但我会留给你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2022-12-25
      • 1970-01-01
      相关资源
      最近更新 更多