SolveConPython

La neurona artificial en Python — pesos, bias y suma ponderada (explicado paso a paso)

En el artículo anterior vimos la función sigmoide y cómo convierte números en probabilidades.
Ahora vamos a construir la pieza que viene antes: la neurona artificial.

Este artículo responde a una pregunta clave:

¿De dónde sale el número que entra en la sigmoide?

¿Qué es una neurona artificial?

Una neurona artificial es una operación matemática muy simple:

  1. Toma varios valores de entrada
  2. Los multiplica por pesos
  3. Suma todo
  4. Añade un sesgo (bias)

El resultado de esa operación se llama normalmente z.

La fórmula de la neurona

Matemáticamente, una neurona se escribe así:z=x1w1+x2w2++xnwn+bz = x_1 w_1 + x_2 w_2 + \dots + x_n w_n + bz=x1​w1​+x2​w2​+⋯+xn​wn​+b

Donde:

  • xix_ixi​ son las entradas
  • wiw_iwi​ son los pesos
  • bbb es el bias

En forma vectorial (la que usaremos en Python):z=XW+bz = XW + bz=XW+b

Intuición (sin matemáticas pesadas)

Piensa en la neurona como una balanza:

  • Cada entrada tiene un peso (importancia)
  • Algunas entradas pesan más que otras
  • El bias ajusta el punto de equilibrio

El modelo aprende ajustando los pesos y el bias, no las entradas.

Visualizando una neurona

Observa:

  • Varias entradas → una sola salida
  • Los pesos controlan la influencia de cada entrada
  • El bias desplaza el resultado final

Implementar una neurona simple en Python (1 muestra)

Empecemos con el caso más simple: una sola entrada.

import numpy as np
x = np.array([2.0, 3.0]) # entradas
w = np.array([0.5, -1.0]) # pesos
b = 1.0 # bias
z = np.dot(x, w) + b
print(z)

Cálculo manual:

  • 2.00.5=1.02.0 \cdot 0.5 = 1.02.0⋅0.5=1.0
  • 3.01.0=3.03.0 \cdot -1.0 = -3.03.0⋅−1.0=−3.0
  • Suma = −2.0
  • Bias = +1.0
    ➡️ z = −1.0

Ese z es exactamente lo que luego pasará a la sigmoide.

Varias muestras a la vez (forma correcta)

En redes neuronales nunca procesamos un dato aislado, sino muchos a la vez.

Supongamos:

  • 3 muestras
  • 2 características por muestra
Python
X = np.array([
[2.0, 3.0],
[1.0, -1.0],
[0.5, 2.0]
])
W = np.array([
[0.5],
[-1.0]
])
b = 1.0
Z = X @ W + b
print(Z)

Dimensiones:

  • X → (3, 2)
  • W → (2, 1)
  • Z → (3, 1)

Cada fila de Z es el resultado de una neurona aplicada a una muestra.

¿Por qué el bias es tan importante?

Sin bias, la neurona estaría obligada a pasar siempre por el origen (0,0).

El bias permite:

  • Desplazar la decisión
  • Ajustar umbrales
  • Aprender patrones más flexibles

En la práctica:

Una red sin bias aprende mucho peor.

Uniendo con la sigmoide (primera neurona completa)

Ahora juntamos este artículo con el anterior.

def sigmoid(x):
return 1 / (1 + np.exp(-x))
Z = X @ W + b
A = sigmoid(Z)
print(A)

Aquí:

  • Z → salida lineal de la neurona
  • A → salida activada (probabilidad)

Esto ya es una neurona funcional.

Pieza reutilizable (guárdala)

Esta función se usará en todas las capas de la red:

def linear_forward(X, W, b):
return X @ W + b

Más adelante haremos:

Z1 = linear_forward(X, W1, b1)
A1 = tanh(Z1)

Qué viene después

En el Artículo #3 añadiremos el siguiente bloque esencial:

Funciones de activación: por qué una red sin ellas no puede aprender
Compararemos sigmoide vs tanh y veremos por qué se usan en capas distintas.