function cv10mlp(x,nhidden,alpha,iter,rep);
% CV10MLP estima el error de mala clasificacion usando
% el Multilayer Perceptron de dos niveles y validacion cruzada 10 
% Valores de entrada:
% x: matriz de datos, incluye tanto las variables predictoras como la columna
% de las clases que debe ser la ultima.
% nhidden: numero de unidades en la capa escondida
% alpha: weight decay (peso para evitar overfitting)
% iter: numero de iteraciones del MLP
% rep: es el numero de repeticiones del experimento para estimar
% la tasa de error por validacion cruzada
% Requiere las funciones  mlpatrain y mlpfwd del toolbox netlab

[nobs,p]=size(x);
tabla=tabulate(x(:,p));
ngrupos=length(tabla(:,1));
clases=zeros(nobs,ngrupos);
for i=1:nobs
   for j=1:ngrupos
   if (x(i,p)==j)
      clases(i,j)=1;
   end
end
end   
net = mlp(p-1, nhidden, ngrupos, 'softmax', alpha);
options = zeros(1,18);
options(1) = 1;                 % Print out error values
options(14) = iter;
% Initialise network with inverse variance of 10
net = mlpinit(net, 10);
no = floor((nobs)/10);
for k=1:rep
ind= randperm(nobs);
x = x(ind,:);
clases=clases(ind,:);
xc=[x clases];
for j=1:10
   xtemp=xc;
   if( j~=10)
   indp=no*(j-1)+1:no*j;
   xp=xc(indp,:);
   xtemp(indp,:)=[];
   else
      indp=no*(j-1)+1:nobs;
      xp=xc(indp,:);
      xtemp(indp,:)=[];
   end
   %net = mlpinit(net, 10);
   [net, error]=mlptrain(net,xtemp(:,1:(p-1)),xtemp(:,(p+1):(p+ngrupos)),iter);
   yg=mlpfwd(net,xp(:,1:(p-1)));
   [tmp, class] = max(yg');
   class=class';
   ep(j)=sum(class~=xp(:,p));   
end
ep1(k) = sum(ep)/nobs;
end
disp('La estimacion de la tasa de error en cada repeticion es');
disp([ep1])
ep2=mean(ep1);
disp('La estimacion de la tasa de error de clasificacion usando validacion cruzada es');
disp([ep2])
