He aqui un pequeño codigo que hice iniciando en esto de las redes neuronales, no esta muy organizado el codigo ya que solo es para probar el funcionamiento...
Es un Perceptron simple-monocapa que entrena con los patrones que le ofrecemos en el vector "result[]" (OPERACIONES AND Y OR SEGUN EL VECTOR) y luego de estar entrenado con los pesos sinampticos ajustados, es capaz de entregar una salida correcta para los valores de entrada.
Si tienen alguna sugerencia o mejoramiento para la funcionalidad del codigo no duden en avisarme, Gracias!!!.
Para cambiar a OR: el vector result debe ser {1,1,1,-1} es decir, un vector con los valores de salida que queremos(patrones).
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
void Perceptron(){
srand(time(NULL));
float intervalos[] = {-0.98,-0.876,-0.654,-0.754,0.453,0.953,-0.322,-0.298,-0.11,-0.065,0.0234,0.232,0.2335,0.4674,0.675,0.7883, 0.752,0.823,0.9876};
float Umbral,defumbral,factor;
int i;
int x1[] = {1,1,-1,-1};
int x2[] = {1,-1,1,-1};
int result[] = {1,-1,-1,-1};
float w[2] = {intervalos[rand() % 18],intervalos[rand() % 18]};
factor = intervalos[rand() % 18];
Umbral = intervalos[rand() % 18];
defumbral = 1;
int verdad = 0;
int op;
int cont = 0;
int n = 0;
//////////// ENTRENAMIENTO DEL PERCEPTRON;
while(verdad == 0){
n++;
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op >= 0){
op = 1;
}
else{
op = -1;
}
if(op != result[i]){
w[0] = w[0] + (2*factor)*(x1[i]*result[i]);
w[1] = w[1] + (2*factor)*(x2[i]*result[i]);
Umbral = Umbral + (2*factor)*(defumbral*result[i]);
}
}
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op == result[i]){
cont++;
}
if(cont == 4){
verdad = 1;
}
}
if(n > 200){
printf("[!] Demasiadas epocas realizadas!\n");
printf("[!] Intente nuevamente con otros pesos sinapticos.\n");
exit(1);
}
}
/////////// MOSTRAR RESULTADOS FINALES
system("clear");
printf("\n[*] FINALIZANDO ENTRENAMIENTO...\n");
printf("[*] PERCEPTRON SIMPLE [ENTRENADO]\n");
printf("\n--------------- DATOS FINALES --------------------------------\n\n");
printf("[*] Total de epocas: (%i)\n",n);
printf("[*] Peso Sinaptico 1 w[1]\t\t--> %2.2f\n",w[0]);
printf("[*] Peso Sinaptico 2 w[2]\t\t--> %2.2f\n",w[1]);
printf("[*] Umbral(Polarizacion)\t\t--> %2.2f\n",Umbral);
printf("\n\n--------------- VERFICIACION DE ENTRENAMIENTO ------------------\n\n");
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op >= 0){
op = 1;
}
else{
op = -1;
}
printf("\n[*] Entradas: (%2i,%2i) --> Salida: %2i",x1[i],x2[i],op);
if(op != result[i]){
system("clear");
printf("\n[!] Demasiadas epocas realizadas!\n");
printf("[!] Intente nuevamente con otros pesos sinapticos.\n");
exit(1);
Perceptron();
}
}
}
int main(int argc, char **argv)
{
Perceptron();
return 0;
}
En Git-hub: https://github.com/Dext3rLab/C-Examples/blob/master/Perceptron_Simple.c
muy currado yo estudié redes neuronales en la carrera y no tiene nada que ver la orientación que se le da en practicas y teoria con las aplicaciones que puede tener
Gracias por el aporte, me está interesando este tema ;D