单层神经网络中的 MATLAB 语法错误 [已关闭]

matlab syntax errors in single layer neural network [closed]

提问人:user414981 提问时间:8/10/2010 最后编辑:Communityuser414981 更新时间:8/11/2010 访问量:995

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

8年前关闭。

我必须实现一个单层神经网络或感知器。为此,我有 2 个文件数据集 ,一个用于输入,一个用于输出。我必须在不使用神经工具箱的情况下在 matlab 中执行此操作。下面给出了 2 个文件的格式。

 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”表示相应输入所属的特定类,目标输出为“0”表示其余 2 个输出。

我试着这样做,但它对我不起作用。

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

这个算法的错误在哪里??

我指的是以下链接中给出的示例:-

感知器学习算法未收敛到 0

MATLAB 神经网络

评论

0赞 msw 8/10/2010
这还不是算法错误。这是一个语法错误Count ≢ count
7赞 Matt Mizumi 8/10/2010
从您的代码中可以清楚地看出,您还没有准备好一次性尝试一个完整的解决方案。我建议你从伪代码算法开始,逐步独立地实现每个步骤。如果你不知道如何编写循环或递增变量,那么尝试编写一个完整的程序就不是一个富有成效的学习体验。

答:

1赞 Paul Hoffer 8/10/2010 #1

在第 #10 行,您有 ;但代码的其余部分带有 .weights(1) +weight(2) +weight(3)weightss

编辑:此外,MATLAB没有运算符;您的循环将导致错误。在 MATLAB 中,构造一个如下循环:++forfor

for p=0:count
    blah blah blah
end

此外,MATLAB也不使用运算符,正如Jonas在他的代码中指出的那样。您需要执行以下操作:+=

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

9赞 gnovice 8/10/2010 #2

以下是我看到的错误列表:

深呼吸

  • 索引语法不正确。也许您的意思是“第 1 列的所有行”。(:1)(:,1)
  • 没有做这样的事情......MATLAB 中的 while 循环。只有 FORWHILE 循环。此外,你的 for 循环定义错误。MATLAB对此有不同的语法。
  • MATLAB 中没有 or 运算符。+++=
  • MATLAB 中的“不相等”运算符是 ,而不是 。~=!=
  • 向量和矩阵的索引需要用括号来完成,而不是方括号。()[]
  • 所有这些都是在函数还是脚本中?您不能在脚本中定义函数,即 。您必须将其放在自己的 m 文件中。如果所有代码实际上都在一个较大的函数中,那么它就是一个嵌套函数,应该可以正常工作(假设你已经用一个 结束了较大的封闭函数)。calculateOutputcalculateOutput.mcalculateOutputend
  • 变量名称有许多明显的拼写错误:
    • weight与。 (根据 Phoffer 的回答weights)
    • Count与。 (MATLAB 区分大小写)count
    • calculateOutput与。 (再次区分大小写)calculateoutput
    • learning rate与。 (变量中不能有空格)learningrate

大量呼气 ;)

简而言之,它需要相当多的工作。

评论

1赞 Jonas 8/10/2010
如果 calculateOutput 是嵌套函数,则需要用end
0赞 gnovice 8/10/2010
@Jonas:谢谢,我说得更明确了。
1赞 Jonas 8/10/2010 #3

主要错误是这不是使用 Matlab 语法编写的。这是尝试做我认为你想做的事情。

不幸的是,您的算法存在一个根本问题(请参阅代码中的注释)。另外,我认为你应该看看非常好的Matlab文档。阅读手册将快速告诉您如何格式化它。

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赞 Paul Hoffer 8/10/2010
重写它的好主意,但 MATLAB 也没有使用。你必须做+=weights[0] = weights[0] + learningrate * localerror * x[p]
0赞 Paul Hoffer 8/10/2010
对不起,我完全阅读了您的评论块的最后一部分。我将评论移到我的答案中并归功于您。