Skip navigation

Criterio de terminación

En un caso ideal el algoritmo termina cuando ya no hay ejemplos mal clasificados, y por lo tanto no hay necesidad de seguir modificando el hiperplano. Sin embargo, no siempre se puede obtener un hiperplano que separe las clases perfectamente, es decir, que el conjunto de datos puede no ser linealmente separable. Aun en los casos en que es posible encontrar una solución óptima, la cantidad de iteraciones necesarias para obtenerla puede ser muy grande.

Además, en general no es necesario llegar a la solución óptima para obtener un clasificador útil ya que las soluciones intermedias también pueden ser buenas. Por ende se puede definir una cantidad máxima de iteraciones a realizar de modo que si se alcanza esa cantidad de iteraciones y no se ha encontrado la solución óptima el algoritmo de entrenamiento se detiene, y la salida del algoritmo es el modelo dado por el último hiperplano encontrado.

Entonces es necesario declarar un contador de iteraciones que inicialmente tiene el valor cero. Este contador será incrementado al finalizar cada iteración y se lo comparará contra la cantidad máxima de iteraciones.

# ejemplos es un vector de N elementos, con los datos de los ejemplos.
# clases es un vector de N elementos que contiene la clase real para cada ejemplo.
# ITE_MAX es la cantidad máxima de iteraciones

Inicializar w con valores aleatorios
iteraciones := 0;
While (no se clasifiquen todos los patrones correctamente) and (iteraciones < ITE_MAX)
  iteraciones := iteraciones + 1;
  For i=1 to n
  #obtener los datos
    x := ejemplos[i];
    clase_real := clases[i];

    #calcular la clase en base al hiperplano
    salida := w · x;
    If salida > 0 then
      clase_calculada := 1;
    else
      clase_calculada := 0;
    end if;

    #comparar la clase obtenida con la real
    #Si son distintas, actualizar el hiperplano
    If (clase_calculada <> clase_real):
      Modificar w para rotar el hiperplano con el fin de tener más posibilidades de clasificar x correctamente.
  end for;
end while;

Luego, necesitamos definir un contador para la cantidad de ejemplos clasificados incorrectamente en una iteración:

# ejemplos es un vector de N elementos, con los datos de los ejemplos.
# clases es un vector de N elementos que contiene la clase real para cada ejemplo.
# ITE_MAX es la cantidad máxima de iteraciones

Inicializar w con valores aleatorios
iteraciones := 0;
cant_errores := 1;
While (cant_errores > 0) and (iteraciones < ITE_MAX)
  iteraciones := iteraciones + 1;
  cant_errores := 0;
  For i=1 to n
  #obtener los datos
    x = ejemplos[i];
    clase_real := clases[i];

    #calcular la clase en base al hiperplano
    salida := w · x;
    If salida > 0 then
      clase_calculada := 1;
    else
      clase_calculada := 0;
    end if;

    #comparar la clase obtenida con la real
    #Si son distintas, actualizar el hiperplano
    If (clase_calculada <> clase_real) then     
      cant_errores := cant_errores + 1;
      Modificar w para rotar el hiperplano con el fin de tener más posibilidades de clasificar x correctamente.
    end if; 
  end for;
end while;