我必须实现单层神经网络或感知器。为此,我有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 :(得分:9)
以下列出了我看错了:
深呼吸
(:1)
不正确。也许你的意思是(:,1)
和“第1列的所有行”一样。++
或+=
个运算符。~=
,而不是!=
。()
,而不是方括号[]
。calculateOutput
。你必须把它放在它自己的m文件calculateOutput.m
中。如果所有代码实际上都在一个更大的函数中,那么calculateOutput
就是nested function并且应该可以正常工作(假设你已经使用end
结束了更大的封闭函数)。weight
与weights
(根据phoffer's answer)Count
与count
(MATLAB区分大小写)calculateOutput
与calculateoutput
(再次,区分大小写)learning rate
与learningrate
(变量中不能包含空格)重度呼气;)
简而言之,它需要相当多的工作。
答案 1 :(得分:1)
在第10行,你有weights(1) +weight(2) +weight(3)
;但其余代码的weights
为s
。
编辑:此外,MATLAB没有++
运算符;您的for
循环将导致错误。在MATLAB中,构造一个for
循环,如下所示:
for p=0:count
blah blah blah
end
此外,正如Jonas在他的代码中指出的那样,MATLAB也不使用+=
运算符。你需要这样做:
weights(0) = weights(0) + learningrate * localerror * x(p)
答案 2 :(得分: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