Red de conocimientos sobre prescripción popular - Colección de remedios caseros - Investigación sobre la optimización del algoritmo genético de la red neuronal de BP

Investigación sobre la optimización del algoritmo genético de la red neuronal de BP

Programa:

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

% 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

% 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

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>

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

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