2010-08-10 8 views
-5

Je dois implémenter un réseau neuronal monocanal ou un perceptron. Pour cela, j'ai 2 jeux de données de fichiers, un pour l'entrée et un pour la sortie. Je dois le faire dans matlab sans utiliser la boîte à outils neurale. Le format de 2 fichiers est donné ci-dessous.Erreurs de syntaxe matlab dans un réseau neuronal monocouche

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 

La sortie cible est « 1 pour une classe particulière que l'entrée correspondante appartient et » 0 pour 2 sorties restantes.

J'ai essayé de faire ceci, mais cela ne fonctionne pas pour moi.

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); 

Où est l'erreur dans cet algorithme ??

Je me réfère l'exemple donné dans le lien ci-dessous: -

Perceptron learning algorithm not converging to 0

+0

Ce n'est pas un bogue d'algorithme (encore). C'est une erreur de syntaxe 'Count ≢ count' – msw

+7

Il est clair à partir de votre code que vous n'êtes pas prêt à tenter une solution complète en une fois. Je vous recommande de commencer à partir d'un algorithme de pseudo-code et d'implémenter de manière incrémentielle et indépendante chaque étape. Si vous ne savez pas écrire une boucle ou incrémenter une variable, tenter d'écrire un programme complet n'est pas une expérience d'apprentissage productive. –

Répondre

9

Voici une liste de ce que je vois mal:

profonde respiration

  • La syntaxe d'indexation (:1) est incorrecte. Peut-être que vous voulez dire (:,1) comme dans "toutes les lignes de la colonne 1".
  • Il n'y a rien de tel qu'une boucle while ... while dans MATLAB. Seules les boucles FOR et WHILE. De plus, votre boucle for est mal définie. MATLAB a une syntaxe différente pour cela. Il n'y a aucun opérateur ++ ou += dans MATLAB.
  • Le "not equal" operator dans MATLAB est ~=, et non !=.
  • Indexing of vectors and matrices doit être fait avec les parenthèses (), pas entre crochets [].
  • Est-ce que tout cela se trouve à l'intérieur d'un function ou d'un script? Vous ne pouvez pas définir de fonctions, à savoir calculateOutput, dans un script. Vous devez le mettre dans son propre fichier m calculateOutput.m. Si tout le code est réellement dans une plus grande fonction, alors calculateOutput est un nested function et devrait fonctionner correctement (en supposant que vous ayez terminé la plus grande fonction englobante avec un end).
  • Vous avez un certain nombre de fautes de frappe apparentes pour les noms de variables:
    • weight contre weights (selon phoffer's answer)
    • Count contre count (Matlab est sensible à la casse)
    • calculateOutput contre calculateoutput (nouveau, sensibilité à la casse)
    • learning rate contre learningrate (les variables ne peut pas avoir des espaces dans les)

lourd expirez;)

En bref, il a besoin d'un peu de travail.

+1

Si calculateOutput est une fonction imbriquée, la fonction principale doit être fermée avec un 'end' – Jonas

+0

@Jonas: Merci, je l'ai rendu plus explicite. – gnovice

1

ligne n ° 10, vous avez weights(1) +weight(2) +weight(3); mais le reste du code a weights avec s.

EDIT: En outre, MATLAB ne possède pas l'opérateur ++; votre boucle for provoquera une erreur. Dans Matlab, construire une boucle for comme ceci:

for p=0:count 
    blah blah blah 
end 

En outre, Matlab n'utilise pas l'opérateur += soit, comme Jonas a souligné dans son code. Vous devez faire ceci:

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

1

L'erreur principale est que ceci n'est pas écrit en utilisant la syntaxe Matlab. Voici une tentative de faire ce que je pense que vous essayiez de faire.

Malheureusement, il existe un problème fondamental avec votre algorithme (voir les commentaires dans le code). Aussi, je pense que vous devriez jeter un oeil à la très bonne documentation de Matlab. La lecture du manual vous dira rapidement comment vous formatez ceci.

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

Bonne idée de le réécrire, mais MATLAB n'utilise pas '+ =' non plus. Vous devez faire 'poids [0] = poids [0] + apprentissage * localerror * x [p]' –

+0

DÉSOLÉ, je lis complètement la dernière partie de votre bloc de commentaire. J'ai déplacé le commentaire à ma réponse et je vous ai crédité. –