2010-08-10 36 views
-5

我必須實現單層神經網絡或感知器。爲此,我有2個文件數據集,一個用於輸入,另一個用於輸出。我必須在matlab中執行此操作而不使用神經工具箱。下面給出2個文件的格式。單層神經網絡中的matlab語法錯誤

In: 
    0.832 64.643 
    0.818 78.843 
    1.776 45.049 
    0.597 88.302 
    1.412 63.458 


Out: 
0 0 1 
0 0 1 
0 1 0 
0 0 1 
0 0 1 

目標輸出對於相應輸入所屬的特定類爲「1」,對於其餘2個輸出爲「0」。

我試圖做到這一點,但它不適合我。

load in.data 
load out.data 
x = in(:1); 
y = in(:2); 

learning rate = 0.2; 
max_iteration = 50; 

function result = calculateOutput(weights,x, y) 
s = x*(weights(1) +weight(2) +weight(3)); 
if s>=0 
result = 1 
else: 
result = -1 
end 
end 

Count = length(x); 
weights[0] = rand(); 
weights[1] = rand(); 
weights[2] = rand(); 

iter = 0; 
do { 
    iter++; 
    globalerror = 0; 
    for(p=0; p<count;p++){ 
    output = calculateoutput(weights,x[p],y[p]); 
    localerror = output[p] - output 
    weights[0]+= learningrate *localerror*x[p]; 
    weights[1]+= learningrate *localerror*y[p]; 
    weights[2]+= learningrate *localerror; 
    globalerror +=(localerror*localerror); 
    } 
}while(globalerror != 0 && iter <= max_iteration); 

這個算法的錯誤在哪裏?

我指的是在下面的鏈接中給出的示例: -

Perceptron learning algorithm not converging to 0

+0

這不是算法錯誤(還)。這是一個語法錯誤'Count≢count' – msw 2010-08-10 02:09:27

+7

從您的代碼中可以清楚地看到,您還沒有準備好一次嘗試完整的解決方案。我建議你從僞代碼算法開始,逐步實現每一步。如果你不知道如何編寫一個循環或增加一個變量,試圖編寫一個完整的程序不是一個有效的學習體驗。 – 2010-08-10 02:36:57

回答

9

這裏是我所看到的錯誤列表:

深呼吸

  • 索引語法(:1)不正確。也許你的意思是(:,1),如「列1的所有行」所示。
  • 在MATLAB中沒有do ... while循環這樣的事情。只有FORWHILE循環。另外,您的for循環定義錯誤。 MATLAB具有不同的語法。
  • MATLAB中沒有+++=運算符。
  • MATLAB中的"not equal" operator~=而不是!=
  • Indexing of vectors and matrices需要用圓括號(),而不是方括號[]
  • 這一切都在functionscript?您無法在腳本中定義函數,即calculateOutput。你將不得不把它放在它自己的m文件calculateOutput.m。如果所有的代碼實際上都在一個更大的函數中,那麼calculateOutputnested function,並且應該可以正常工作(假設你已經用end結束了更大的封閉函數)。
  • 您有變量名的數表觀錯別字:
    • weightweights(按照phoffer's answer
    • Countcount(MATLAB是區分大小寫)
    • calculateOutputcalculateoutput(再次,區分大小寫)
    • learning ratelearningrate(變量中不能有空格)

重呼氣;)

總之,它需要相當多的工作。

+1

如果calculateOutput是一個嵌套函數,那麼主函數需要用'end'來結束@ – Jonas 2010-08-10 02:46:15

+0

@Jonas:謝謝,我說得更加明確。 – gnovice 2010-08-10 03:01:18

1

線#10,你有weights(1) +weight(2) +weight(3);但其餘的代碼有weightss

編輯:此外,MATLAB沒有++運算符;您的for循環將導致錯誤。在MATLAB中,構造一個for循環是這樣的:

for p=0:count 
    blah blah blah 
end 

此外,MATLAB並不要麼使用+=運算符,如喬納斯在他的代碼中指出。你需要這樣做:

weights(0) = weights(0) + learningrate * localerror * x(p)

1

主要的錯誤是,這不是使用Matlab語法編寫的。這是嘗試做我認爲你想要做的事情。

不幸的是,您的算法存在一個基本問題(請參閱代碼中的註釋)。另外,我認爲你應該看看非常好的Matlab文檔。閱讀manual會很快告訴你如何格式化。

function neuralNetwork 

%# load data 
load in.data 
load out.data 
x = in(:,1); 
y = in(:,2); 

%# set constants 
learningrate = 0.2; 
max_iteration = 50; 

% initialize parameters 
count = length(x); 
weights = rand(1,3); % creates a 1-by-3 array with random weights 

iter = 0; 
while globalerror ~= 0 && iter <= max_iteration 
    iter = iter + 1; 
    globalerror = 0; 
    for p = 1:count 
    output = calculateOutput(weights,x(p),y(p)); 

    %# the following line(s) cannot possibly work 
    %# output is not a vector, since the previous line 
    %# assigns it to a scalar 
    %# Also, arrays are accessed with parentheses 
    %# and indexing starts at 1 
    %# and there is no += operator in Matlab 
    localerror = output[p] - output 
    weights[0]+= learningrate *localerror*x[p]; 
    weights[1]+= learningrate *localerror*y[p]; 
    weights[2]+= learningrate *localerror; 
    globalerror +=(localerror*localerror); 
end %# for-loop 
end %# while-loop 


%# subfunctions in Matlab are put at the end of the file 
function result = calculateOutput(weights,x, y) 
s = x*(weights(1) +weight(2) +weight(3)); 
if s>=0 
result = 1 
else: 
result = -1 
end 
end 
+0

重寫它的好主意,但MATLAB也不使用'+ ='。你必須做'權重[0] =權重[0] +學習率* localerror * x [p]' – 2010-08-10 02:30:16

+0

SORRY,我完全閱讀了評論塊的最後部分。我將評論轉移到了我的答案中,並將您記入了評論。 – 2010-08-10 02:34:29