matlab拟合函数在遗传算法(ga函数)中不接受输出

时间:2014-08-22 14:38:03

标签: matlab neural-network

大家好,我是matlab的新手,我对ga功能有些问题。

我必须找到使用遗传算法应用于时间序列问题的网络的输入和输出延迟的最佳整数值。

我编写了一个拟合函数,使用2个变量作为输入和输出延迟创建网络并返回性能值。

我希望在1到10之间有2个延迟,所以我使用像这样的ga函数

[x,fval,exitflag,output,population,scores] = ga(@rendimentoRete, 2, [], [], [], [], [1 1], [10 10], [], [1 2])

我有这个错误"输出参数" out" (也许是其他人)在调用" D:\ Documents \ MATLAB \ rendimentoRete.m> rendimentoRete"。"

期间未分配

这是我的拟合功能 (如果有人更喜欢这是与使用语法突出显示http://pastebin.com/5iwzwhi0

的pastebin相同的功能
function out = rendimentoRete(iDelay, oDelay)
if nargin < 2
    return;
end

%%carico le variabili dal workspace in modo che la funzione di fitness
%%conservi come varibili di ingresso solo i delay
load baseSet.mat;

inputSeries = tonndata(first_period,false,false);
targetSeries = tonndata(first_usd_ise,false,false);

% Create a Nonlinear Autoregressive Network with External Input
inputDelays = 1:iDelay;
feedbackDelays = 1:oDelay;
hiddenLayerSize = 8;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);

% Prepare the Data for Training and Simulation
% The function PREPARETS prepares timeseries data for a particular network,
% shifting time by the minimum amount to fill input states and layer states.
% Using PREPARETS allows you to keep your original time series data unchanged, while
% easily customizing it for networks with differing numbers of delays, with
% open loop or closed loop feedback modes.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
for j=1:10
    [net,tr] = train(net,inputs,targets,inputStates,layerStates);
end

% Test the Network
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs);      %%alt -> MSE

%prova1
out = performance;

%{
%prova2
%converto l'output a un vettore e approssimo i risultati ai valori 1 e -1
%convert outputs cell to array
outputs_array = cell2mat(outputs);

%convertiamo outputs_array
for k=1:(268-outputDelay)
    if outputs_array(k)>0
        outputs_array(k)=1;
    else
        outputs_array(k)=-1;
    end
end
out = performance + calcoloMape(outputDelay, first_usd_ise, outputs_array) + calcoloPgcp(outputDelay, first_usd_ise, outputs_array);
%}
end

加载baseSet.mat我加载first_period和first_usd_ise因为它们总是相同的。

我无法弄清楚要做什么,因为当我单独使用这个功能时,我会得到很好的结果。 有人可以解释我错误的地方。

1 个答案:

答案 0 :(得分:1)

根据MATLAB ga的文档,适应度函数的签名被描述为

...应接受长度为nvars的行向量并返回标量值。

这意味着您的函数签名必须更改为具有两个输入变量的函数,如

function out = rendimentoRete(iDelay, oDelay)

只有一个输入变量的签名,如

function out = rendimentoRete(inputVars)

其中inputVars是一个向量,您可以将这两个变量作为

iDelay = inputVars(1);
oDelay = inputVars(2);

修改您的功能签名,前两行(您可以删除margin支票),试一试,看看会发生什么!