2016-12-26 75 views
0

以下是在a blog中提供的一個簡單的Perceptron的實現。神經網絡代碼解釋

input = [0 0; 0 1; 1 0; 1 1]; 
numIn = 4; 
desired_out = [0;1;1;1]; 
bias = -1; 
coeff = 0.7; 
rand('state',sum(100*clock)); 
weights = -1*2.*rand(3,1); 

iterations = 10; 

for i = 1:iterations 
    out = zeros(4,1); 
    for j = 1:numIn 
      y = bias*weights(1,1)+... 
       input(j,1)*weights(2,1)+input(j,2)*weights(3,1); 
      out(j) = 1/(1+exp(-y)); 
      delta = desired_out(j)-out(j); 
      weights(1,1) = weights(1,1)+coeff*bias*delta; 
      weights(2,1) = weights(2,1)+coeff*input(j,1)*delta; 
      weights(3,1) = weights(3,1)+coeff*input(j,2)*delta; 
    end 
end 

我有以下問題,

(1)其中之一就在這裏訓練數據?

(2)這裏是哪一個測試數據?

(3)這裏是標籤?

回答

1

訓練數據爲[0 0; 0 1; 1 0; 1 1]另一種觀點每一行是一組訓練數據如下

>> input 

input = 

0  0 
0  1 
1  0 
1  1 

和目標

desired_out = 

0 
1 
1 
1 

請想一想desired_out這是你的標籤 .. 每一行中訓練數據(輸入)在二進制集合{0,1}中有一個特定的輸出(標籤)(因爲這個例子用於執行OR邏輯電路。)

在matlab中你可以使用或者作用如下做進一步的瞭解:

>> or(0,0) 

    ans = 

     0 

    >> or(1,0) 

    ans = 

     1 

    >> or(0,1) 

    ans = 

     1 

    >> or(1,1) 

    ans = 

     1 

請注意,您的代碼沒有任何培訓測試和驗證碼只是試圖讓重量和感知的其他參數,但你可以通過只小程序訓練測試添加到您的代碼

NumDataTest = 10 ; 
    test=randi([0 , 1] , [ NumDataTest , 2]) ... 
     +(2*rand(NumDataTest,2)-1)/20; 

這樣的測試數據將類似於下面

 test = 

    1.0048 1.0197 
    0.0417 0.9864 
    -0.0180 1.0358 
    1.0052 1.0168 
    1.0463 0.9881 
    0.9787 0.0367 
    0.9624 -0.0239 
    0.0065 0.0404 
    1.0085 -0.0109 
    -0.0264 0.0429 

測試這個數據,您可以通過下面的代碼使用自己的程序:

for i=1:NumDataTest 
     y = bias*weights(1,1)+test(i,1)*weights(2,1)+test(i,2)*weights(3,1); 
     out(i) = 1/(1+exp(-y)); 
    end 

最後:

 table(test(:,1),test(:,2),out,'VariableNames',{'input1' 'input2' 'output'}) 

輸出

  input1  input2  output 
     _________ _________ ________ 

      1.0048  1.0197  0.99994 
      0.041677  0.98637  0.97668 
     -0.017968  1.0358  0.97527 
      1.0052  1.0168  0.99994 
      1.0463  0.98814  0.99995 
      0.97875  0.036674  0.9741 
      0.96238 -0.023861  0.95926 
      0.0064527  0.040392 0.095577 
      1.0085 -0.010895  0.97118 
     -0.026367  0.042854 0.080808 

代碼部分:

clc 
    clear 
    input = [0 0; 0 1; 1 0; 1 1]; 
    numIn = 4; 
    desired_out = [0;1;1;1]; 
    bias = -1; 
    coeff = 0.7; 
    rand('state',sum(100*clock)); 
    weights = -1*2.*rand(3,1); 

    iterations = 100; 

    for i = 1:iterations 
    out = zeros(4,1); 
     for j = 1:numIn 
      y = bias*weights(1,1)+input(j,1)*weights(2,1)+input(j,2)*weights (3,1); 
      out(j) = 1/(1+exp(-y)); 
      delta = desired_out(j)-out(j); 
      weights(1,1) = weights(1,1)+coeff*bias*delta; 
      weights(2,1) = weights(2,1)+coeff*input(j,1)*delta; 
      weights(3,1) = weights(3,1)+coeff*input(j,2)*delta; 
     end 
    end 
    %% Test Section 
    NumDataTest = 10 ; 
    test=randi([0 , 1] , [ NumDataTest , 2]) ... 
     +(2*rand(NumDataTest,2)-1)/20; 
    for i=1:NumDataTest 
     y = bias*weights(1,1)+test(i,1)*weights(2,1)+test(i,2)*weights(3,1); 
     out(i) = 1/(1+exp(-y)); 
    end 
    table(test(:,1),test(:,2),out,'VariableNames',{'input1' 'input2' 'output'}) 

我希望這有助於爲我的英語對不起,如果它的壞

+0

我還有一個問題:這個程序使用2個特徵和1個標籤的訓練數據。這就是爲什麼可以在二維空間中繪製它們並繪製決策邊界線的原因。對?但是,如果有更多的功能呢?我們如何繪製具有兩個以上特徵的樣本的決策邊界? – anonymous

+1

我認爲二維空間只是爲了更好的理解,如果你有兩個以上的特徵,對於情節決策邊界不是好主意,更好的想法是回答這個問題「我的分類器有多好?」。您可以在MATLAB中使用ROC圖,並使用決策函數。 所以在這種情況下你有決定的功能,但不是好主意的情節,因爲情節是爲了知道「我的分類器有多好?」 –