miércoles, 30 de mayo de 2012

Operador lógico AND en C 

Redes neuronales (perceptrón)


 
 
#include <stdio.h>

struct stuff {
  double vector[3];
  double desired;
};

double const threshold = 0, learning_rate = 0.1;
double weights[] = {1, 0, 0};
struct stuff training_set[4];

void createTrainingSet() {
  training_set[0].vector[0] = -1;
  training_set[0].vector[1] = 0;
  training_set[0].vector[2] = 0;
  training_set[0].desired = 0;

  training_set[1].vector[0] = -1;
  training_set[1].vector[1] = 0;
  training_set[1].vector[2] = 1;
  training_set[1].desired = 0;

  training_set[2].vector[0] = -1;
  training_set[2].vector[1] = 1;
  training_set[2].vector[2] = 0;
  training_set[2].desired = 0;

  training_set[3].vector[0] = -1;
  training_set[3].vector[1] = 1;
  training_set[3].vector[2] = 1;
  training_set[3].desired = 1;
}

double sum_function(double *values) {
  auto unsigned short index;
  auto double sum = 0;
  for(index = 0; index < 3; index++)
    sum += values[index] * weights[index];

  return sum;
}

int main(int argc, char *argv[]) {
  auto signed short i, error_count, result, index;
  auto double *input_vector, *desired_output, error;
  createTrainingSet();

  printf("Logic Operator Simulation... AND\n\n");

  while(1) {
    for(i = 0; i++ < 63;)
      printf("-");
    printf("\n");

    error_count = 0;
    for(i = 0; i < 4; i++) {
      input_vector = &training_set[i].vector[0];
      desired_output = &training_set[i].desired;
      printf("[%1.17f, %1.17f, %1.17f]\n", weights[0], weights[1], weights[2]);

      result = (sum_function(input_vector) >= threshold)?1:0;
      error = *desired_output - result;
      if(error != 0) {
        error_count += 1;
        for(index = 0; index < 3; index++)
          weights[index] += learning_rate * error * input_vector[index];
      }
    }
    if(error_count == 0)
      break;
  }
  for(i = 0; i++ < 63;)
    printf("-");
  printf("\n");

  return 0;
}

No hay comentarios:

Publicar un comentario