La herramienta que tiene Matlab para redes radiales es la función newrb
. El inconveniente es que hay que darle dos parámetros: error objetivo admisible y ancho de las gaussianas; va añadiendo procesadores hasta conseguir el objetivo. Si le pedimos mucha precisión, o no podrá, o pondrá muchísimos procesadores, con el problema de sobreajuste. Para resolver esta dificultad vamos buscar estos parámetros mediante las funciones de optimización bayesiana (supone que la función optimizada sigue un proceso gaussiano - tutorial , matemáticas) que tiene.
Necesitaremos un rango para esos parámetros. El error objetivo lo sacamos de los modelos más simples, que ya deberíamos haber probado; desde cerca de cero hasta el de esos modelos. El del ancho, de la distancia (usa dist
) entre cada punto y su vecino más cercano; entre la menor y la mayor.
Para nuestra optimización de parámetros necesitamos (todo este proceso habrá que repetirlo):
anc=optimizableVariable('ancho',[minanc,maxanc]); obj=optimizableVariable('obje',[minobj,maxobj]);
rad=@(var) radial(entaj,salaj,var.obje,var.ancho);
sale=bayesopt(rad,[obj,anc]);
Ahora podemos construir nuestra red definitiva con redr=newrb(paj,taj,objemejor,anchomejor);
y probarla con el conjunto de prueba. Puedes verlo gráficamente con plotregression
¿Qué tamaño tiene la red? (redr.layers{1}
) ¿Cómo compara su tamaño y precisión con los perceptrones? ¿Conclusiones?
Al ser una red basada en respuestas locales, puede ser dependiente de la muestra usada para crearla. Repite todo el proceso con otra partición de la muestra ¿Es muy sensible?