Diagrama de un modelo Perceptrón que muestra los nodos de entrada y de activación, con una conexión adicional para el cálculo del error.

El modelo perceptron es una de las bases del aprendizaje automático, inspirado en el funcionamiento de las neuronas en el cerebro humano. Fue desarrollado por Frank Rosenblatt en la década de 1950 y está diseñado para realizar tareas de clasificación binaria, como determinar si un objeto pertenece o no a una categoría.

¿Qué Es el Modelo Perceptron?

En su forma más simple, un perceptrón procesa múltiples entradas, cada una con un peso asociado, y calcula una suma ponderada de estas entradas. Posteriormente, aplica una función de activación, como una función escalón, para producir una salida binaria (0 o 1) dependiendo de si la suma ponderada supera un umbral predefinido.

Características Clave del Perceptrón:

  • Es un modelo utilizado para problemas de clasificación linealmente separables.
  • Produce una salida binaria basada en un umbral de activación.
  • Se utiliza en tareas como detección de spam, diagnóstico médico

Diferencias Entre el Perceptrón y una Neurona Biológica

Las similitudes entre el perceptrón y una neurona biológica incluyen:

  1. Procesamiento de Señales:
    • Una neurona biológica recibe señales en sus dendritas, y si la suma de estas supera un umbral, genera una señal de salida.
    • En el perceptrón, se calculan las entradas ponderadas y se compara con un umbral para determinar la salida.
  2. Finalidad:
    • Las neuronas biológicas forman parte del sistema nervioso y procesan información sensorial.
    • El perceptrón es un modelo matemático utilizado en aprendizaje automático.

Aunque comparten el concepto de umbral y salidas binarias, sus contextos y aplicaciones son diferentes.


Componentes Principales del Modelo Perceptrón

  1. Entradas: Representadas como .
  2. Pesos: Cada entrada tiene un peso asociado , que determina su importancia.
  3. Suma Ponderada: La suma de las entradas multiplicadas por sus pesos.
  4. Función de Activación: Convierte la suma ponderada en una salida binaria. Por ejemplo, si , la salida será 1; de lo contrario, será 0.
  5. Salida: Determina la categoría de la muestra.

¿Cómo Aprende un Perceptrón?

El aprendizaje en el perceptrón se basa en un proceso iterativo donde los pesos se ajustan para minimizar los errores. Este proceso se conoce como regla delta, que corrige los pesos en función de la diferencia entre la salida esperada y la salida obtenida.

Problemas que Puede Resolver un Perceptrón

El perceptrón es ideal para resolver problemas de clasificación binaria linealmente separables, como:

  • Clasificación de Spam: Identificar correos electrónicos como spam o no spam.
  • Detección de Fraudes: Clasificar transacciones como válidas o fraudulentas.
  • Diagnóstico Médico: Clasificar condiciones médicas basadas en datos de pacientes.

Sin embargo, no es adecuado para problemas con fronteras de decisión no lineales, que requieren modelos más complejos como redes neuronales multicapa.


Implementación de un Perceptrón en Python

A continuación, se presenta una implementación básica del modelo perceptrón utilizando Python:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as pyplot
class PresentarDatos(object):
    def __init__(self,X,W,coste,minEscalaEjeX,maxEscalaEjeX,minEscalaEjeY,maxEscalaEjeY,minRangoValoresX,maxRangoValoresX):
        self.X=X
        self.W=W
        self.coste=coste
        self.x = range(minRangoValoresX,maxRangoValoresX)
        self.minEscalaEjeX = minEscalaEjeX
        self.minEscalaEjeX = minEscalaEjeX
        self.maxEscalaEjeX = maxEscalaEjeX
        self.minEscalaEjeY = minEscalaEjeY
        self.maxEscalaEjeY = maxEscalaEjeY
        self.minRangoValoresX = minRangoValoresX
        self.maxRangoValoresX = maxRangoValoresX
    def __recta(self,x):
       z = float((-self.W[2]-self.W[0]*x)/self.W[1])
       return z
    def __dibujarGraficaDispersion(self):
       pyplot.scatter(self.X[:50, 0], self.X[:50, 1],
       color='red', marker='o', label='cero')
       pyplot.scatter(self.X[50:100, 0], self.X[50:100, 1],
       color='blue', marker='x', label='uno')
       pyplot.xlabel('sepalo')
       pyplot.ylabel('petalo')
    def __funcionCoste(self):
            pyplot.ylabel('coste')
            pyplot.xlabel('epocas')
            pyplot.legend(loc='upper left')
            #x=np.linspace(1,len(self.coste),len(self.coste))
            pyplot.plot(range(1, len(self.coste) + 1), self.coste, marker='o')
            pyplot.show()
    def __dibujarRecta(self):
       # recta= Recta(self.X,self.W)
        y2= [self.__recta(x) for x in  self.x ]
        pyplot.plot(self.x, y2)
        # Establecer el color de los ejes.
        pyplot.axhline(0, color="black")
        pyplot.axvline(0, color="black")
        # Escala de los ejes
        pyplot.xlim(self.minEscalaEjeX, self.maxEscalaEjeX)
        pyplot.ylim(self.minEscalaEjeY, self.maxEscalaEjeY)
        pyplot.show()
    # representar los datos
    def pintarDatos(self):
            self.__dibujarGraficaDispersion()
            self.__dibujarRecta()
            self.__funcionCoste()
class Percentron():
    def __init__(self,eta,n_iter):
             self.W=np.array([0.0,0.0])
             self.eta=eta
             self.n_iter=n_iter
             self.umbral=1
             self.cadena_errors= []
    def fit(self,X,Y):
            n_muestras=len(Y)
            for i in range(0,self.n_iter):
                error=0
                for i in range(0,n_muestras):
                    y = self.__prodEscalar(X[i],self.W) + self.umbral
                    if  y >= 0 :
                        y = 1
                    else:
                        y = -1
                    sigma = (Y[i]-y)
                    self.W = self.W + (self.eta*sigma* X[i,:])
                    self.umbral = self.umbral + self.eta * sigma
                    error = error + np.abs(sigma)                  
                self.cadena_errors.append(error)
                self.n_iter = self.n_iter + 1
            return self
    def __prodEscalar(self,_V1,_V2):
        s = 0
        for i, x in enumerate(_V1):
            s = _V1[i] * _V2[i] + s
        return s
    def predict(self,X):
        y = np.dot(X,self.W) + self.umbral
        return np.where(y >=0.0,1,-1)
def getDatos():
    datos = pd.read_csv("iris.data",header = None)
    datos.tail()
    Y = datos.iloc[0:100, 4].values
    Y = np.where(Y == 'Iris-setosa', -1, 1)
    #Tomamos las muestras
    X = datos.iloc[0:100, [0,2]].values  #longitud del sepalo y del petalo
    return X,Y
X,Y = getDatos()
#Valor inicial W
eta=0.01
n_iter=10
cadena_errors = []
percentron = Percentron(eta,n_iter)
datos = percentron.fit(X,Y)
W = np.append(datos.W,datos.umbral)
presentarDatos = PresentarDatos(X,W,datos.cadena_errors,4,7.5,0.5,5.5,0,10)
presentarDatos.pintarDatos()

Visualización del Proceso de Aprendizaje

El siguiente código muestra cómo se visualizan los datos y la línea de decisión:

def __recta(self,x):
       z = float((-self.W[2]-self.W[0]*x)/self.W[1])
       return z
    def __dibujarGraficaDispersion(self):
       pyplot.scatter(self.X[:50, 0], self.X[:50, 1],
       color='red', marker='o', label='cero')
       pyplot.scatter(self.X[50:100, 0], self.X[50:100, 1],
       color='blue', marker='x', label='uno')
       pyplot.xlabel('sepalo')
       pyplot.ylabel('petalo')
    def __funcionCoste(self):
            pyplot.ylabel('coste')
            pyplot.xlabel('epocas')
            pyplot.legend(loc='upper left')
            #x=np.linspace(1,len(self.coste),len(self.coste))
            pyplot.plot(range(1, len(self.coste) + 1), self.coste, marker='o')
            pyplot.show()
    def __dibujarRecta(self):
       # recta= Recta(self.X,self.W)
        y2= [self.__recta(x) for x in  self.x ]
        pyplot.plot(self.x, y2)
        # Establecer el color de los ejes.
        pyplot.axhline(0, color="black")
        pyplot.axvline(0, color="black")
        # Escala de los ejes
        pyplot.xlim(self.minEscalaEjeX, self.maxEscalaEjeX)
        pyplot.ylim(self.minEscalaEjeY, self.maxEscalaEjeY)
        pyplot.show()
    # representar los datos
    def pintarDatos(self):
            self.__dibujarGraficaDispersion()
            self.__dibujarRecta()
            self.__funcionCoste()
Grafico de dispersión que muestra la relección entre las características sepal y petal separados por una línea de clasificación
Grafico de línea que muestra la evolución del coste frente a las épocas en un modelo de aprendizaje automático