Investigación sobre la optimización del algoritmo genético de la red neuronal de BP
1, modelado de redes neuronales BP sin optimización de algoritmo genético
Clear;
clc
%%%%% %% %%Parámetros de entrada%%%%%%
N = 2000% de los datos totales
m = 1500 % datos de entrenamiento
%%% %%; %%%%Datos de entrenamiento%%%%%%
Para i=1:N
Ingrese (I, 1)=-5+rand * 10;
p>
Entrada(I, 2)=-5+rand * 10;
Fin
Salida = entrada(:, 1). ^2+input(:,2).^2;
Guardar entrada y salida de datos
Cargar datos
% ordenados aleatoriamente del 1 al n.
k = rand(1, N);
[m, n] = sort(k);
%buscar datos de entrenamiento y datos de predicción
p>p>
input_train=entrada(n(1:M),:)';
salida_train = salida(n(1:M),:)';
entrada _ prueba = entrada(N((M+1):N),:)';
salida _ prueba = salida(N((M+1):N),: )';
Porcentaje de normalización de datos
[entrada, entradas] = mapminmax(entrada _ tren
[salida, salidas] = mapminmax(salida _); train);
%Establecer red neuronal BP
net=newff(inputn, outputn, 5);
net train epochs = 100; /p>
net .train param .lr = 0.1;
net .train param .0000004
Entrenamiento de red neuronal %BP . net=train (net, inputn, outputn);
Porcentaje normalizado de muestra de prueba
inputn_test=mapminmax('apply ', input_test, inputs
%); Predicción de la red neuronal BP
an=sim(net, inputn _ test);
%% La red obtiene la desnormalización de datos.
BPoutput=mapminmax('reverse ',an,outputs);
Figura (1)
%plot(BPoutput,':og ');
scatter(1:(N-M), BPoutput, ' rx ');
Espera
%plot(output_test, '-* ');
scatter(1:(N-M), prueba_salida, 'o');
Legend('salida prevista', 'salida esperada', 'tamaño de fuente', 12);
Title('salida de predicción de la red BP', ' fontsize ', 12
Xlabel ('muestra ', ' fontsize ',
Xlabel('); Salida de error antes de la optimización ',' fontsize ', 12);
Figura (2)
error = salida BP-salida _ prueba;
plot( 1 : (N-M), error);
Xlabel ('muestra ', 'tamaño de fuente', 12
Ylabel ('Salida de error antes de la optimización', 'tamaño de fuente', 12); ;
% de ahorro en entrada neta y salida neta
2. Modelado de redes neuronales de BP optimizado por algoritmo genético.
(1) Programa principal
%Borrar variables de entorno
Centro de control de croma
Borrar
%Leer data
Cargar datos. mat
Porcentaje del número de nodos
input num = 2;
hiddennum = 5;
hiddennum = 5;
p>
núm de salida = 1;
% de datos de entrenamiento y datos de predicción
entrada _ tren = entrada (1:1500,)';
input_test = input(1501:2000,)';
output_train = salida(1:1500)';
salida_prueba = salida(1501:2000)' ;
%Estandarización de datos de entrada y salida de muestras conectadas
[inputn, inputps] = mapminmax(input_train);
[salidan, salida PS ]= mapminmax(output_train);
%Construir una red
net=newff(entradan, salidan, hidenum);
%%Parámetros del algoritmo genético Inicialización
maxgen = 10 % de generaciones evolutivas, es decir, el número de iteraciones
sizepop = 30% del tamaño de la población
pcross = [0.3]; % de selección de probabilidad de cruce, entre 0 y 1.
p mutación =[0.1];% de probabilidad de mutación de selección, entre 0 y 1.
Porcentaje del número total de nodos
numsum = num de entrada * num oculto+num oculto+num oculto * num de salida+num de salida;
lenchrom=ones(1, numsum) ;
bound=[-3*ones(numsum, 1) 3*ones(numsum, 1)]; % rango de datos
% - Inicialización de relleno.
-
individuals=struct('fitness',zeros(1,sizepop),'chrom',[] % define la información de la población como una estructura.
% avg fitness =[]; La aptitud promedio de cada generación de la población es %
best fitness =[]; .
p>
best chrom =[];Porcentaje de cromosomas con mejor aptitud
Porcentaje de población inicial
Para i=1:sizepop p>
% Genera aleatoriamente un grupo.
individuals.chrom(i,)=Código(lenchrom,bound);% codificación
x=individuals.chrom(i,);
% cálculo Fitness
individuals.fitness(i)=fun(x, inputnum, hidenum, outputnum, net, inputn, outputn % aptitud cromosómica
Fin
%Encuentra el mejor cromosoma
[bestfitness bestindex]=min(individual.fitness);
best chrom = individuos.chrom(best index,);% del mejor cromosoma p>
% aptitud promedio = suma(individuos. aptitud)/tamaño pop; % aptitud promedio de los cromosomas
% registra la mejor aptitud y la aptitud promedio en cada generación de evolución.
% trace =[avg fitness best fitness];
%% resuelve iterativamente el umbral y el peso iniciales óptimos.
Comienza el % evolución
Para i=1:maxgen
i
% selección
Individual=Select (individuos, tamaño pop);
% promedio de fitness = suma(individuos . fitness)/tamaño pop;
Porcentaje de cruce
individuals.chrom=Cross( pcross,lenchrom,individuals.chrom,sizepop,bound);
Cambio porcentual
individuals.chrom = Mutación(p Mutación,lenchrom,individuals.chrom,sizepop,I,maxgen, enlazado);
% Calcular aptitud
Para j=1:sizepop
x=individuals.chrom(j, %Decode
individuals.fitness(j)=fun(x, inputnum, hidenum, outputnum, net, inputn, outputn);
Fin
% encontró la aptitud mínima y máxima de los cromosomas y su ubicación en una población.
[newbestfitness, newbestindex]=min(individuals. fitness);
[worestfitness, peor índice]= max(individuals. fitness);
% en lugar del mejor cromosoma en la última evolución
if bestfitness>newbestfitness
bestfitness = newbestfitness
best chrom = individuos chrom (nuevo bestindex,);
Fin
individuos.chrom(worestindex,)= bestchrom
personales.fitness(worestindex)= mejor fitness;
% fitness promedio = suma( individuos .fitness)/size pop;
% trace = [trace; avg fitness best fitness] % registra la mejor aptitud física y el promedio en cada generación de aptitud física.
Fin
%%Análisis de resultados del algoritmo genético
%Figura (3)
%[r c]=size(tracking);
%plot([1:r]',trace(:,2),' b-');
%title([' curva de aptitud ' 'Álgebra terminal = ' num 2 str(maxgen)]);
%xlabel('Álgebra evolutiva'); ylabel('Fitness');
%legend('Fitness general', 'Mejor fitness ');
Disp('Fitness variable');
x = bestchrom
%% proporciona el mejor peso de umbral inicial para la predicción de la red
p>La predicción numérica adopta %% red BP optimizada por algoritmo genético.
w 1 = x(1:núm de entrada * núm oculto);
b 1 = x(núm de entrada * núm oculto+1:núm de entrada * núm oculto+núm oculto);
w2 = x(núm de entrada * núm oculto+núm oculto+1: núm de entrada * núm oculto+núm oculto+núm oculto * núm de salida);
B2=x
(núm de entrada * número oculto+número oculto+número oculto * número de salida+1: número de entrada * número oculto+número oculto+número oculto * número de salida+número de salida);
net.iw{1, 1 } = forma(w 1, número oculto) , ingrese num);
net.lw{2, 1} = forma(w2, número de salida, número oculto);
net b { 1 } = forma(b 1, número oculto). , 1);
net . b { 2 } = B2
%% entrenamiento de la red BP
% parámetros de evolución de la red
net .param del tren = 100;
net param del tren = 0,1
% net . Entrenamiento de red
[net, per2]=train(net, inputn, outputn);
%% predicción de red BP
Porcentaje de normalización de datos
inputn_test=mapminmax('apply ', input_test, input PS);
an=sim(net, inputn_test);
test_simu=mapminmax('reverse ', an, salida PS);
error = test_simu-output_test;
%Figura (4);
Espera trama(1: 500, error, 'r ');
Leyenda ('Error antes de la optimización', 'Error después de la optimización', 'tamaño de fuente', 12)
(2) Codificación del código de subrutina .m
Función ret=Code(lenchrom,bound)
% Esta función codifica variables en cromosomas y se utiliza para inicializar aleatoriamente la población.
% de entrada lenchrom: longitud del cromosoma
% de entrada ligada: el rango de valores de la variable.
% ret de salida: el valor de codificación del cromosoma.
bandera = 0;
mientras bandera==0
pick=rand(1, longitud(lenchrom));
ret =enlazado(:,1)'+(enlazado(:,2)-enlazado(:,1))'. * elija% de interpolación lineal, el resultado de la codificación se almacena en ret como un vector real.
flag=test(lenchrom,bound, ret); % prueba la viabilidad del cromosoma
Fin
(3) Función de fitness fun.m p >
Error de función = fun(x, inputnum, hidenum, outputnum, net, inputn, outputn)
% Esta función se utiliza para calcular el valor de aptitud.
%xEntrada individual
%inputnumEl número de entrada de nodos de la capa de entrada
%outputnumEl número de nodos de capa ocultos en la entrada
% Red de entrada neta
% entradan entrada entrenamiento datos de entrada
% salidan entrada entrenamiento salida datos
% error salida valor de condición física personal
Extracción Porcentaje
w 1 = x(1:núm de entrada * núm oculto);
b 1 = x(núm de entrada * núm oculto+1:núm de entrada * núm oculto+núm oculto); p>
p>
w2 = x(núm de entrada * núm oculto+núm oculto+1:núm de entrada * núm oculto+núm oculto+núm oculto * núm de salida);
B2 = x(núm de entrada * número oculto+número oculto+número oculto * número de salida+1: número de entrada * número oculto+número oculto+número oculto * número de salida+número de salida);
net=newff(entradan, salidan, número oculto);
% parámetros de evolución de la red
net epochs = 20;
net .train param . objetivo = 0.00001;
param de tren neto = 100;
param de tren neto = 0
% de distribución de peso. p>
net.iw{1, 1} = forma(w 1, número oculto, número de entrada);
net.lw{2, 1} = forma(w2, número de salida, número oculto);
net . b { 1 } = forma(b 1, número oculto, 1
net .
net=tren(net, entradan, salidan);
an=sim(net, entradan);
Error=sum(ABS(an-salidan ));
(4) Operación de selección Select.m
Función ret=select (individual, ventana emergente de tamaño)
% Esta función se utiliza para la operación de selección .
% Información de población de entrada individual
% tamaño de población de entrada pop
Presione % ret para generar el nuevo grupo seleccionado
% buscar adaptación El recíproco del valor
[a bestch]=min(individual.fitness);
% b = individuos .chrom(best ch);
% c = individuos .fitness(mejor ch);
Fitness 1=10.
/personals.fitness;%individuals.fitness es el valor de aptitud individual.
% probabilidad de selección individual
suma fitness = suma(fitness 1);
sumf=fitness1. /sumfitness;
% Selecciona nuevos individuos mediante la ruleta.
index =[];
Para i=1:sizepop %sizepop es la población.
pick = rand;
Cuando pick==0
pick = rand;
Fin
Para i=1:sizepop
pick = pick-sumf(I);
Si selecciona & lt0
index =[index I];
Pausa;
Fin
Fin
Fin
% index =[index best ch];
p>
Nuevo porcentaje de población
individuos .chrom = individuos chrom(index,); %individuals.chrom es el individuo de la población.
fitness = personales .fitness(índice);
% individuos . [personals.fitness;c];
ret = personal;
(5) Asignación cruzada
Función ret=Cross(pcross,lenchrom,chrom,sizepop , enlazado)
% Esta función completa la operación de cruce.
% pcorss input: probabilidad de cruce
% lenchrom input: longitud del cromosoma.
% entrada chrom: conjunto de cromosomas
% entrada sizepop: tamaño de la población
% salida ret: cromosoma cruzado
Para i=1 :sizepop% En cada ronda del bucle For, puede haber una operación de cruce. Los cromosomas se seleccionan al azar y las posiciones de cruce también se seleccionan al azar% Pero se determina si se realiza una operación de cruce en esta ronda del bucle For. por la probabilidad de cruce (control continuo).
%Selecciona aleatoriamente dos cromosomas para la hibridación.
pick=rand(1,2);
Y producción(pick)==0
pick=rand(1,2);
Fin
Índice = límite superior (seleccione. * tamaño pop);
% de probabilidad de cruce determina si se debe cruzar.
pick = rand;
Cuando pick==0
pick = rand;
Fin
Si elegir & gtpcross
Continuar;
Fin
flag = 0;
mientras flag==0
% Seleccione aleatoriamente el bit de cruce
pick = rand
Cuando pick==0
pick = rand;
Fin p>
pos=ceil(pick.* sum(len chrom)% Seleccione aleatoriamente la posición de intersección, es decir, qué variable se selecciona para cruzar. Nota: Las posiciones de cruce de los dos cromosomas son las mismas.
pick = rand; porcentaje de inicio cruzado
v1=chrom(index(1), pos
v2=chrom(index(2), posición); );
chrom(index(1), pos)= elegir * v2+(1-pick)* v 1;
chrom(index(2), pos)= elegir * v 1+(1-pick)* v2; porcentaje de cruce
flag1=test(lenchrom,bound, chrom(index(1),:));% prueba la viabilidad del cromosoma 1
flag2=test(lenchrom,bound, chrom(index(2),:));% prueba la viabilidad del cromosoma 2
Si flag1*flag2==0
flag = 0;
else flag = 1;
End% Si ninguno de los cromosomas es viable, cruza nuevamente.
Fin
Fin
ret = chrom
(6)Mutación
función ret=Mutación(pmutación , lenchrom, chrom, sizepop, num, maxgen,bound)
% Esta función completa la operación de mutación.
% pcorss input: probabilidad de mutación
% lenchrom input: longitud del cromosoma
% chrom input: grupo de cromosomas
% sizepop input: Tamaño de la población
% opts input: método de mutación de selección
% pop input: información sobre las generaciones evolutivas y generaciones evolutivas máximas de la población actual.
%Entrada vinculante: última y siguiente sesión de cada persona.
% maxgen input: número máximo de iteraciones.
% num entrada: número de iteración actual
% ret salida: cromosoma mutado
Para i=1: sizepop% en cada ronda del bucle For, hay Puede ser una operación de mutación, el cromosoma se selecciona al azar y la posición de la mutación también se selecciona al azar.
% Sin embargo, si la operación de mutación se realiza en esta ronda del bucle for está determinada por la probabilidad de mutación (control continuo).
% selecciona aleatoriamente un cromosoma para la mutación.
pick = rand;
Cuando pick==0
pick = rand;
Fin
índice = ceil(pick * size pop);
% de la probabilidad de mutación determina si el bucle muta.
pick = rand;
si pick & gtp mutate
continuar;
end
flag = 0 ;
mientras bandera==0
% posición de mutación
pick = rand;
cuando pick==0
pick = rand;
End
pos = ceil(pick * sum(len chrom) % selecciona aleatoriamente la posición de la mutación cromosómica, es decir, selecciona el Una variable pos está mutada.
pick = rand; % inicio de mutación
fg=(rand*(1-num/maxgen))^2;
Si pick & gt0.
chrom(i, pos)=chrom(i, pos)+(bound(pos, 2)-chrom(i, pos))* fg
Otros
p>chrom(i, pos)=chrom(i, pos)-(chrom(i, pos)-bound(pos, 1))* fg;
Fin% fin de mutación< / p>
flag=test(lenchrom,bound, chrom(i,); % prueba la viabilidad del cromosoma
End
End
ret = cromo