Implementando nuestra primera Neurona M-P

Andres Felipe Ocampo
7 min readJan 6, 2024

Y de regalo de reyes pues vamos a desarrollar el primer ejercicio práctico de esta sección de artículos, concretamente en este caso práctico, vamos a ver cómo implementar la neurona de McCulloch y Pitts, y después veremos como aplicar esta neurona a un caso práctico real, uuuuyeahhhh!!! chaval.

Para ello voy a crear una nueva nota en Google Colab.

Tener en cuenta que la Neurona M-P es un modelo que se utilizaba hace muchísimo tiempo, con lo cual a día de hoy, pues este algoritmo, esta neurona no es útil y por lo tanto no está implementada en la mayoría de las librerías o de los frameworks comunes de Machine Learning, como por ejemplo Tensor Flow o Keras.

Por lo tanto, en este caso como una excepción, nosotros vamos a tener que implementar el algoritmo, vamos a tener que implementar todas las funciones matemáticas y vamos a tener que implementar en definitiva, la neurona artificial, vamos a a por ello.

Por suerte este algoritmo es muy sencillito y como vais a ver ahora, pues puede implementarse con pocas líneas de código concretamente la manera de implementarlo es esta que vamos a picar en Python.

Fijaros, lo primero que hacemos es importar esta librería que ya hemos visto en otro artículo anteriormente, que es numpy y definimos una clase que vamos a denominar como MPNeuron.

Esta neurona de M-P, esta neurona artificial en el constructor de la clase va a tener un atributo de la clase que va a ser el threshold o límite. Si recordáis cuando hemos hablado de la neurona de McCulloch y Pitts en los artículos anterioeres decíamos que tenían un threshold o límite que a priori nosotros definíamos de manera manual, aunque en la aplicación práctica de este algoritmo vamos a ver cómo definirlo de manera un poquito automática.

Bien, hemos defininido el threshold o límite como un atributo de la clase y continuamos definiendo un siguiente método que se corresponderá con el modelo, como veis en Python es muy facil la codificación y su entendimiento para definir un metodo o una función usamo la palabra reservda “def” y ya luego el nombre de dicho método o función.

Es decir, la función hipótesis de este algoritmo de esta neurona artificial, que básicamente consiste en esa función matemática que recibe unas entradas que son los parametros que van entre los paréntesis del metodo y nos proporciona una salidas con la palabra reservada “return” concretamente, fijaros que este método va a recibir una entrada que hemos denominado X y es importante entender que esta entrada va a consistir.

Bien!!, vamos a ponerlo aquí en un conjunto de valores binarios recordais {1,0}, pero además ese depende cuando es 1 ó 0 ? es decir, puede ser algo como esto es una lista en preguntas definidas, que se corresponde con un conjunto de valores binarios.

En concreto, el número de valores binarios será equivalente al número de características de entrada que nosotros le proporcionamos, es decir desde X1 a Xn

En ese ejemplo práctico en el que utilizábamos esta neurona para decidir si vamos a ir al cine o no, fijaros que esta X1 X2 hasta Xn se va a corresponder con esas preguntas que nosotros nos hacíamos y que respondíamos con un 1 o con un 0. Respondiendo de manera afirmativa o de manera negativa.

Bien, pues recibimos este vector, esta lista de acuerdo con esas entradas que se corresponderán con las respuestas a esas preguntas. Y lo que hacemos es computar esa función de agregación que decíamos que era una función zeta que recibía todas esas entradas, esos valores unos y ceros y los sumaba devolviendo la suma de todos ellos. De acuerdo, concretamente esa función de agregación es esta de aquí. Fijaros que nosotros simplemente la podríamos sacar de aquí, vamos a modificar un poco nuestro codigo y a comentarlo, para que nos queda más claro.

Podemos denominar una variable z que básicamente se corresponderá con la suma de las entradas (vector x), es decir, una función de agregación de esa lista de acuerdo, de esos valores de entrada que le estamos proporcionando, de esos 1 y esos 0.

Y después qué hacíamos?

Pues aplicábamos lo que hemos denominado una función de activación que, por decirlo de alguna manera, lo que hacía era comprobar si esa suma de las entradas era mayor o igual al 3, En el caso de que fuese mayor o igual, iba a devolver un resultado positivo, iba a devolver un 1 o un verdadero o un true y en el caso de que fuese menor, iba a devolver un resultado negativo o un false. Bien, con esto ya tendríamos implementada nuestra neurona uuuuyeah super fácil no?.

Sin embargo, en muchas ocasiones nosotros lo que vamos a necesitar es que realice varias predicciones de manera simultánea es decir, es como si yo respondiese a esas preguntas de diferente forma, en otras palabras, si tuviese varios vectores de entrada y quisiese evaluar todas esas posibilidades, todas esas instancias, es como si mi input en lugar de ser un único vector, fuese una lista de listas o un vector de vectores, vale, fijaros, pues tendríamos por ejemplo estas dos listas que se corresponderán con respuestas a cuatro preguntas.

Por ejemplo, es fin de semana, tengo tarea que realizar, etc. He respondido a ellas dos veces. En la primera he puesto que un sí o un no, un sí o no? y así con varias listas de manera simultánea, lo estáis viendo ??

Fijaros que es muy sencillito lo que hace primero inicializa una variable y que se va a corresponder con el resultado de nuestra neurona.

Recorre con la funcion “for” cada una de las listas y llama a esta función que habíamos visto anteriormente -> self.model(x) que equvale a cada uno de los valores de la lista X y el resultado simplemente lo que hace es concatenar en esta misma lista Y, lo retorna convirtiéndolo en un array de numpy, muy bien !!!!, pues esta sería nuestra MPNeuron.

Como podéis observar, es muy sencillito implementarla y si ejecutamos esta celda ya la tenemos definida en el contexto de nuestro Notebook y ya podríamos empezar a hacer pruebas.

Fijaros, lo primero que vamos a hacer es instanciar nuestra clase es decir, crear un objeto que hemos denominado mp_neuron = MPNeuron, vamos a establecer un threshold o límite, por ejemplo, voy a establecer 3, nosotros ya podríamos empezar a evaluar diferentes casos de uso.

Fijaros que yo invoco el método predict(), que es el que hemos dicho que puede evaluar varios casos de manera simultánea y le voy a pasar, pues, unas respuestas a esas cuatro preguntas, como veis doy varias posibilidades a las cuatro preguntas basicas, en muchas de las predicciones nos devolvera claramente un false, con lo cual me indica que no es bueno que vaya al cine ya que no cumplo con las consultas hechas basandonos en el threshold o límite esteblecido.

La predicción o la decisión tiene que ser negativa debido a que la suma no supera el threshold o límite, que son tres y esta de aquí y esta de aquí debe ser positiva vamos a ejecutar nuestras celdas de codigo en python a por ello.

Como es nuetras primera toma de contacto con codigo en python , es necesario tener en cuenta que vamos a ejecutar celdas de codigo y algunas veces no nos damos cuenta que nuestra celda debe estar inicializada, este error basicamente no dice que no hemos ejecutado la celda de arriba que arranca nuestras dependencias de numpy y el contructor de una clase, venga vamos a darle al de arriba y luego suscecivamente hacia abajo, además tener en cuenta los paréntesis de la clase ^_^.

Si nosotros ejecutamos esta celda, lo que observamos es que el resultado de nuestra neurona es precisamente lo que esperamos, es un array que tiene un false para lo primero que estamos evaluando, true para lo segundo y true para el tercero, etc.

Fijaros que yo podría haber sustituido mi threshold o límite, por ejemplo, por uno, de acuerdo? Y si mi Threshold fuera uno? en este caso todos son true, lógicamente, porque todos son mayores o igual al threshold o límite.

Bien, pues este es el primer caso práctico y hemos construido nuestra primera neurona y con alguna complejidad añadida mas bien en los inputs no lo creeis ?? fijaros que es muy sencillito, lo único que hemos hecho ha sido implementar esta neurona de McCulloch y Pitts, esta primera neurona artificial de la historia podríamos decir que se implementa de manera muy sencilla y básica.

Y lo siguiente que vamos a ver es cómo podemos utilizar esta neurona ya aplicada a un caso práctico real, eso ya lo dejamos para el siguiente artículo, venga a picar un poco de IA, buen findeeeeeeeeee.

--

--