Módulo / 1. Fundamentos matemáticos
0%
Módulo 1 · Fundamentos

Fundamentos matemáticos

Los modelos de Machine Learning son objetos matemáticos: funciones, vectores, matrices y distribuciones. Este módulo construye esas herramientas desde cero, con ejemplos numéricos y su traducción directa a código Python. No se asume cálculo avanzado.

10 lecciones 18 h estimadas Con ejercicios resueltos
0 de 10 lecciones completadas
Lección 1.1

Álgebra, funciones, exponenciales y logaritmos

18 minÁlgebraCon código

Al terminar podrás

Leer y manipular expresiones algebraicas
Distinguir funciones lineales y no lineales
Usar exponenciales y logaritmos con soltura
Resolver sistemas de ecuaciones sencillos

1. ¿Qué es una variable y qué es una función?

Una variable es un símbolo que representa un valor que puede cambiar; una constante es un valor fijo. Una función $f$ toma una entrada $x$ y produce exactamente una salida $f(x)$. El conjunto de entradas válidas es el dominio y el de salidas posibles es el rango.

Notación $$f: \mathcal{X} \to \mathcal{Y}, \qquad y = f(x)$$ En ML, $\mathcal{X}$ es el espacio de características (features) y $\mathcal{Y}$ el espacio de etiquetas.

2. Funciones lineales y no lineales

Una función es lineal (afín) si tiene la forma $f(x)=mx+b$: su gráfica es una recta y $m$ es la pendiente. Cualquier otra forma es no lineal: cuadrática $x^2$, exponencial $e^x$, logarítmica $\log x$, sigmoide $\frac{1}{1+e^{-x}}$.

FunciónFormaComportamientoUso en ML
Lineal$mx+b$Cambio constanteRegresión lineal, capas sin activación
Cuadrática$ax^2+bx+c$Curva parabólicaPérdida MSE, regularización L2
Exponencial$e^{x}$Crece muy rápidoSoftmax, verosimilitud
Logaritmo$\log x$Crece lento; inverso de $e^x$Entropía cruzada, escala de probabilidades
Sigmoide$\frac{1}{1+e^{-x}}$Comprime a $(0,1)$Probabilidad en clasificación binaria

3. Exponenciales y logaritmos

La exponencial $e^x$ modela crecimiento multiplicativo. El logaritmo es su inversa:

Propiedades esenciales $$\log_b(b^x)=x, \qquad \log_b(xy)=\log_b x+\log_b y, \qquad \log_b\left(\frac{x}{y}\right)=\log_b x-\log_b y, \qquad \log_b(x^k)=k\log_b x$$ $\ln x = \log_e x$. En ML usamos logaritmos porque convierten productos de probabilidades en sumas, más estables numéricamente.

Ejemplo numérico: $\log_2 1024 = 10$ porque $2^{10}=1024$. Y $\ln(e^3)=3$. Si una probabilidad es $p=0.001$, entonces $-\ln p \approx 6.91$: los sucesos improbables producen pérdidas grandes, idea central de la entropía cruzada.

4. Ecuaciones y sistemas

Resolver una ecuación es encontrar los valores que la satisfacen. Un sistema de dos ecuaciones lineales puede resolverse por sustitución o igualación.

1 Sistema 2×2 resuelto

Resolver:

$$2x+3y=13, \qquad x-y=1$$
1
De la segunda ecuación: $x=y+1$.
2
Sustituimos en la primera: $2(y+1)+3y=13 \Rightarrow 5y+2=13$.
3
$5y=11 \Rightarrow y=2.2$.
4
$x=y+1=3.2$. Verificación: $2(3.2)+3(2.2)=6.4+6.6=13$. ✓

En ML, los sistemas lineales aparecen al resolver mínimos cuadrados, al calcular estados estacionarios y en la formulación matricial de la regresión.

5. Aplicación en Machine Learning

Las transformaciones algebraicas preparan los datos. Si una variable como el ingreso tiene cola larga, aplicamos $\log(1+x)$ para comprimirla. Si queremos modelar probabilidades, usamos la función logística. La regresión lineal es literalmente una función afín de muchas variables:

$$\hat{y} = w_1x_1+w_2x_2+\cdots+w_dx_d+b = \mathbf{w}^{\top}\mathbf{x}+b$$

6. Código Python

Pythonalgebra_basica.py
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 200)

lineal      = 2 * x + 1
cuadratica  = x ** 2
exponencial = np.exp(x)
sigmoide    = 1 / (1 + np.exp(-x))

print("log2(1024) =", np.log2(1024))
print("ln(e^3)    =", np.log(np.exp(3)))

# Resolver un sistema 2x2: 2x + 3y = 13 ; x - y = 1
A = np.array([[2, 3], [1, -1]])
b = np.array([13, 1])
sol = np.linalg.solve(A, b)
print("x, y =", sol)          # [3.2 2.2]

plt.figure(figsize=(8, 5))
plt.plot(x, lineal, label="2x + 1")
plt.plot(x, cuadratica, label="x^2")
plt.plot(x, sigmoide, label="sigmoide")
plt.ylim(-2, 8); plt.grid(alpha=.3); plt.legend()
plt.title("Funciones básicas usadas en ML")
plt.show()
Intuición Una función lineal no puede representar una curva; una red neuronal sin activaciones tampoco. La no linealidad es lo que permite a un modelo adaptarse a relaciones complejas.
Ejercicios 1.1
  1. Evalúa $f(x)=3x^2-2x+1$ en $x=2$: $f(2)=12-4+1=9$.
  2. Resuelve $\log_3 x = 4$: $x=3^4=81$.
  3. Simplifica $\ln(a^2b)-\ln a$: $2\ln a+\ln b-\ln a=\ln a+\ln b=\ln(ab)$.
  4. ¿Para qué $x$ se cumple $e^{2x}=e^{x+3}$? Como $e$ es inyectiva, $2x=x+3 \Rightarrow x=3$.
  5. Un modelo predice $\hat{y}=0.8x+2$. ¿Qué predice para $x=10$? $\hat{y}=10$.
Lección 1.2

Vectores, normas y distancias

20 minÁlgebra linealCon código

Un vector es una lista ordenada de números. Puede representar un punto, una dirección o —lo más importante en ML— un conjunto de características de un ejemplo.

Vector en $\mathbb{R}^d$ $$\mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_d \end{bmatrix} \in \mathbb{R}^d$$ Un paciente con edad, presión, glucosa y colesterol es un vector de dimensión 4: $\mathbf{x}=(52, 130, 95, 210)$.

Operaciones básicas

  • Suma: componente a componente. $\mathbf{u}+\mathbf{v}=(u_1+v_1,\dots,u_d+v_d)$.
  • Escalar por vector: $c\mathbf{u}=(cu_1,\dots,cu_d)$; cambia la magnitud y, si $c<0$, el sentido.
  • Producto punto: $\mathbf{u}\cdot\mathbf{v}=\sum_{i=1}^d u_iv_i$. Produce un escalar.
  • Transpuesta: convierte un vector columna en fila: $\mathbf{x}^{\top}=(x_1,\dots,x_d)$.

Normas: cuánto mide un vector

Normas $L_1$, $L_2$ y $L_\infty$ $$\|\mathbf{x}\|_1=\sum_{i=1}^d |x_i|, \qquad \|\mathbf{x}\|_2=\sqrt{\sum_{i=1}^d x_i^2}, \qquad \|\mathbf{x}\|_\infty=\max_i |x_i|$$ La norma $L_2$ es la distancia euclidiana. La $L_1$ favorece soluciones dispersas (Lasso); la $L_2$ penaliza valores grandes (Ridge).

Producto punto, ángulo y similitud

Interpretación geométrica $$\mathbf{u}\cdot\mathbf{v}=\|\mathbf{u}\|_2\,\|\mathbf{v}\|_2\cos\theta \qquad\Longrightarrow\qquad \cos\theta=\frac{\mathbf{u}\cdot\mathbf{v}}{\|\mathbf{u}\|_2\|\mathbf{v}\|_2}$$ Si $\cos\theta\approx 1$, los vectores apuntan en la misma dirección; si es $0$, son ortogonales; si es $-1$, opuestos.

La similitud coseno es la base de la búsqueda semántica y de los sistemas de recomendación: dos documentos o embeddings son similares si el ángulo entre sus vectores es pequeño, sin importar su longitud.

2 Cálculo con $\mathbf{u}=(3,4)$ y $\mathbf{v}=(1,2)$
1
Producto punto: $3\cdot1+4\cdot2=3+8=11$.
2
Normas: $\|\mathbf{u}\|_2=\sqrt{9+16}=5$; $\|\mathbf{v}\|_2=\sqrt{1+4}=\sqrt5\approx2.236$.
3
$\cos\theta = 11/(5\cdot2.236)=11/11.18\approx0.984$. Ángulo $\theta\approx10.3^\circ$: vectores casi paralelos.
4
Distancia euclidiana: $\|\mathbf{u}-\mathbf{v}\|_2=\|(2,2)\|_2=\sqrt8\approx2.828$. Distancia Manhattan: $|2|+|2|=4$.

Distancias que usarás en ML

DistanciaFórmulaSe usa en
Euclidiana ($L_2$)$\sqrt{\sum(x_i-y_i)^2}$KNN, K-Means, SVM gaussiano
Manhattan ($L_1$)$\sum|x_i-y_i|$Robusta a outliers, K-Medoids
Coseno$1-\frac{\mathbf{x}\cdot\mathbf{y}}{\|\mathbf{x}\|\|\mathbf{y}\|}$Texto, embeddings
Mahalanobis$\sqrt{(\mathbf{x}-\mathbf{y})^\top\Sigma^{-1}(\mathbf{x}-\mathbf{y})}$Datos correlacionados, anomalías
HammingNúmero de posiciones distintasCadenas, códigos binarios
Escalas La distancia euclidiana es sensible a la escala. Si una variable se mide en miles y otra en decimales, la primera dominará. Por eso estandarizamos las features antes de usar KNN, K-Means o SVM con kernel RBF.

Aplicación: embeddings y regularización

En NLP, cada palabra o token se representa como un vector denso. La similitud entre «gato» y «felino» se mide con coseno. En regularización, añadir $\lambda\|\mathbf{w}\|_2^2$ a la pérdida castiga pesos grandes; añadir $\lambda\|\mathbf{w}\|_1$ empuja muchos pesos exactamente a cero, produciendo modelos dispersos e interpretables.

Pythonvectores.py
import numpy as np

u = np.array([3.0, 4.0])
v = np.array([1.0, 2.0])

print("suma:", u + v)
print("escalar:", 2 * u)
print("producto punto:", np.dot(u, v))          # 11.0
print("norma L2 u:", np.linalg.norm(u))         # 5.0
print("norma L1 v:", np.abs(v).sum())           # 3.0
print("distancia:", np.linalg.norm(u - v))      # 2.828...

coseno = np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
print("similitud coseno:", coseno)              # 0.9838...

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-12)

# Embeddings ficticios de 4 dimensiones
gato   = np.array([0.2, 0.9, -0.1, 0.4])
felino = np.array([0.1, 0.8, -0.2, 0.5])
auto   = np.array([-0.7, 0.1, 0.8, -0.3])
print("gato~felino:", cosine_similarity(gato, felino))
print("gato~auto:  ", cosine_similarity(gato, auto))
Ejercicios 1.2
  1. $\mathbf{a}=(1,2,2)$, $\mathbf{b}=(2,1,1)$: calcula producto punto (6), normas (3 y $\sqrt6$) y coseno ($6/(3\sqrt6)\approx0.816$).
  2. ¿Son ortogonales $(1,0,-1)$ y $(2,3,2)$? Producto: $2+0-2=0$. Sí.
  3. Con $\mathbf{u}=(3,4)$, verifica que $\|\mathbf{u}\|_1=7$ y $\|\mathbf{u}\|_\infty=4$.
  4. Explica por qué la similitud coseno no cambia si multiplicas un vector por 10. Porque numerador y denominador se multiplican por 10 y se cancelan.
Lección 1.3

Matrices, determinante e inversa

22 minÁlgebra linealCon código

Una matriz es una tabla rectangular de números. Si tiene $m$ filas y $n$ columnas, es de tamaño $m\times n$. En ML, una matriz de datos $X$ tiene una fila por ejemplo y una columna por característica.

$$X = \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1d} \\ x_{21} & x_{22} & \cdots & x_{2d} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nd} \end{bmatrix}_{n\times d}$$ $n$ ejemplos, $d$ características. Cada fila $\mathbf{x}_i^\top$ es un ejemplo.

Operaciones

Suma y escalar

Se suman matrices del mismo tamaño componente a componente. Multiplicar por un escalar afecta a cada entrada.

Transpuesta

$A^\top$ intercambia filas y columnas: $(A^\top)_{ij}=A_{ji}$. Si $A$ es $2\times3$, $A^\top$ es $3\times2$.

Identidad

$I_n$ tiene unos en la diagonal y ceros fuera. Cumple $AI=IA=A$.

Producto matricial

$(AB)_{ij}=\sum_k A_{ik}B_{kj}$. El número de columnas de $A$ debe igualar el de filas de $B$.

Determinante

Para $2\times2$: $\det(A)=ad-bc$. Mide el factor de escala del área y detecta singularidad.

Inversa

$A^{-1}$ cumple $AA^{-1}=I$. Existe solo si $\det(A)\neq0$.

Producto 2×2 y determinante $$\begin{bmatrix} a & b \\ c & d \end{bmatrix}\begin{bmatrix} e & f \\ g & h \end{bmatrix} = \begin{bmatrix} ae+bg & af+bh \\ ce+dg & cf+dh \end{bmatrix}, \qquad \det\begin{bmatrix} a & b \\ c & d \end{bmatrix}=ad-bc$$
Inversa 2×2 (solo si $ad-bc\neq0$) $$A^{-1}=\frac{1}{ad-bc}\begin{bmatrix} d & -b \\ -c & a \end{bmatrix}$$
3 Inversa y sistema lineal

Sea $A=\begin{bmatrix}2&1\\1&3\end{bmatrix}$ y $\mathbf{b}=(5,10)^\top$. Resolver $A\mathbf{x}=\mathbf{b}$.

1
$\det(A)=2\cdot3-1\cdot1=5\neq0$; la inversa existe.
2
$A^{-1}=\frac15\begin{bmatrix}3&-1\\-1&2\end{bmatrix}=\begin{bmatrix}0.6&-0.2\\-0.2&0.4\end{bmatrix}$.
3
$\mathbf{x}=A^{-1}\mathbf{b}=\frac15(3\cdot5-1\cdot10,\;-1\cdot5+2\cdot10)^\top=\frac15(5,15)^\top=(1,3)^\top$.
4
Verificación: $2(1)+1(3)=5$; $1(1)+3(3)=10$. ✓

Por qué importa el determinante

$\det(A)=0$ significa que las filas (o columnas) son linealmente dependientes: la matriz aplasta el espacio y no se puede invertir. Geométricamente, un determinante de 2 duplica áreas; de 0.5 las reduce a la mitad; negativo invierte la orientación.

Aplicación: regresión lineal en forma matricial

Con $X$ incluyendo una columna de unos para el intercepto, la solución de mínimos cuadrados es:

Ecuación normal $$\hat{\mathbf{w}} = (X^\top X)^{-1}X^\top \mathbf{y}$$ Válida si $X^\top X$ es invertible. En la práctica se usa una pseudo-inversa o un solver estable (SVD/QR), no la inversa explícita.

Una red neuronal es una secuencia de productos matriciales: $h=\sigma(Wx+b)$. Entrenar consiste en ajustar las entradas de $W$ y $b$.

Nunca inviertas una matriz a mano en producción Calcular $A^{-1}$ explícitamente es inestable y costoso ($O(n^3)$). Usa descomposiciones como LU, QR o SVD, o funciones como np.linalg.solve. La inversa se usa para entender, no para calcular.
Pythonmatrices.py
import numpy as np

A = np.array([[2., 1.],
              [1., 3.]])
B = np.array([[1., 0.],
              [4., 2.]])

print("A @ B:\n", A @ B)
print("A^T:\n", A.T)
print("det(A):", np.linalg.det(A))       # 5.0
print("inv(A):\n", np.linalg.inv(A))
print("identidad:\n", A @ np.linalg.inv(A))

b = np.array([5., 10.])
x = np.linalg.solve(A, b)                # preferible a inv(A) @ b
print("solución:", x)                    # [1. 3.]

# Regresión lineal con la ecuación normal
X = np.array([[1., 1.], [1., 2.], [1., 3.], [1., 4.]])
y = np.array([2., 4., 5., 4.])
w = np.linalg.solve(X.T @ X, X.T @ y)
print("intercepto, pendiente:", w)       # [2.0, 0.7]
Ejercicios 1.3
  1. Calcula $\det\begin{bmatrix}4&2\\1&3\end{bmatrix}=12-2=10$.
  2. Multiplica $\begin{bmatrix}1&2\\3&4\end{bmatrix}\begin{bmatrix}0&1\\1&0\end{bmatrix}$: el resultado intercambia columnas: $\begin{bmatrix}2&1\\4&3\end{bmatrix}$.
  3. ¿Es invertible $\begin{bmatrix}1&2\\2&4\end{bmatrix}$? No: determinante $4-4=0$; la segunda fila es el doble de la primera.
  4. Comprueba que $(AB)^\top=B^\top A^\top$ con matrices de tu elección.
Lección 1.4

Eigenvalores, SVD y descomposición matricial

20 minÁlgebra lineal avanzadaBase de PCA

Los eigenvectores son direcciones especiales que una transformación lineal no rota: solo las estira o comprime. Los eigenvalores cuantifican cuánto. Esta idea es la base de PCA, de la estabilidad numérica y del análisis espectral.

Ecuación de eigenvalores $$A\mathbf{v}=\lambda\mathbf{v}, \qquad \mathbf{v}\neq\mathbf{0}$$ $\mathbf{v}$ es el eigenvector y $\lambda$ el eigenvalor. Para encontrarlos: $\det(A-\lambda I)=0$.
4 Eigenvalores de una matriz simétrica

$A=\begin{bmatrix}2&1\\1&2\end{bmatrix}$.

1
$A-\lambda I=\begin{bmatrix}2-\lambda&1\\1&2-\lambda\end{bmatrix}$.
2
$\det=(2-\lambda)^2-1=0 \Rightarrow (2-\lambda)=\pm1$.
3
$\lambda_1=3$, $\lambda_2=1$.
4
Para $\lambda_1=3$: $A\mathbf{v}=3\mathbf{v}$ da $2v_1+v_2=3v_1 \Rightarrow v_2=v_1$. Eigenvector $(1,1)^\top$.
5
Para $\lambda_2=1$: $2v_1+v_2=v_1 \Rightarrow v_2=-v_1$. Eigenvector $(1,-1)^\top$.

Los eigenvectores son ortogonales porque $A$ es simétrica. Cualquier vector puede escribirse como combinación de ellos; la transformación estira 3× en una dirección y deja igual la otra.

Diagonalización

Si $A$ tiene $n$ eigenvectores linealmente independientes, podemos escribir $A=Q\Lambda Q^{-1}$, donde $Q$ tiene los eigenvectores como columnas y $\Lambda$ es diagonal con los eigenvalores. Para matrices simétricas, $Q$ es ortogonal ($Q^{-1}=Q^\top$).

Descomposición SVD

La Descomposición en Valores Singulares generaliza la diagonalización a cualquier matriz $m\times n$:

SVD $$A = U\Sigma V^\top$$ $U$: base ortonormal de salidas; $\Sigma$: valores singulares no negativos ordenados; $V$: base ortonormal de entradas. Los valores singulares son las raíces de los eigenvalores de $A^\top A$.

La SVD permite: comprimir imágenes (quedarse con los $k$ valores singulares mayores), resolver mínimos cuadrados de forma estable, calcular la pseudo-inversa y hacer reducción de dimensionalidad (PCA).

De eigenvalores a PCA

En PCA calculamos la matriz de covarianza $\Sigma$ de los datos centrados. Sus eigenvectores son las componentes principales y sus eigenvalores indican cuánta varianza explica cada dirección. La primera componente es la dirección de máxima varianza.

Varianza explicada $$\text{VE}_k = \frac{\sum_{i=1}^{k}\lambda_i}{\sum_{i=1}^{d}\lambda_i}, \qquad \lambda_1\geq\lambda_2\geq\cdots\geq\lambda_d\geq0$$

Si dos variables están muy correlacionadas, la covarianza tendrá un eigenvalor grande y otro pequeño; proyectar sobre el primero conserva casi toda la información con una sola dimensión.

Pythoneigen_svd.py
import numpy as np

A = np.array([[2., 1.],
              [1., 2.]])

# Eigenvalores y eigenvectores
vals, vecs = np.linalg.eigh(A)     # eigh para matrices simétricas
print("eigenvalores:", vals)       # [1. 3.]
print("eigenvectores:\n", vecs)

# SVD
U, S, Vt = np.linalg.svd(A)
print("valores singulares:", S)    # [3. 1.]

# PCA manual sobre datos 2D
rng = np.random.default_rng(42)
X = rng.multivariate_normal([0, 0], [[3, 2.4], [2.4, 3]], size=200)
Xc = X - X.mean(axis=0)
cov = np.cov(Xc, rowvar=False)
vals, vecs = np.linalg.eigh(cov)
order = np.argsort(vals)[::-1]
vals, vecs = vals[order], vecs[:, order]
print("varianza explicada:", vals / vals.sum())

proyectado = Xc @ vecs[:, 0]       # 1D
print("forma original:", X.shape, "→ proyectada:", proyectado.shape)
Conexión clave PCA no «inventa» información: rota los ejes para alinearlos con las direcciones de máxima varianza y descarta las de menor varianza. Es una compresión con pérdida, y la pérdida se mide por la varianza no explicada.
Ejercicios 1.4
  1. Verifica que $(1,1)^\top$ es eigenvector de $\begin{bmatrix}3&0\\0&1\end{bmatrix}$ con $\lambda=3$. $A(1,1)=(3,1)\neq3(1,1)$. Falso: no lo es; el eigenvector de $\lambda=3$ es $(1,0)^\top$. Este ejercicio muestra que hay que comprobar, no suponer.
  2. Si los eigenvalores de una covarianza 3D son $5,3,1$, ¿qué fracción explica la primera componente? $5/9\approx55.6\%$; las dos primeras, $8/9\approx88.9\%$.
  3. ¿Qué indica un eigenvalor cero? Que existe una dirección en la que los datos no varían: hay redundancia o dependencia lineal.
Lección 1.5

Límites y derivadas

22 minCálculoReglas + ejemplos

La derivada mide cómo cambia una función cuando cambia su entrada. En ML, casi todo entrenamiento consiste en calcular derivadas de una función de pérdida y moverse en la dirección que la reduce.

Límites: la base conceptual

El límite $\lim_{x\to a}f(x)=L$ significa que $f(x)$ se acerca arbitrariamente a $L$ cuando $x$ se acerca a $a$. No importa qué ocurre exactamente en $x=a$.

$$\lim_{x\to 2}\frac{x^2-4}{x-2}=\lim_{x\to2}\frac{(x-2)(x+2)}{x-2}=\lim_{x\to2}(x+2)=4$$ La expresión original no está definida en $x=2$, pero el límite sí existe: la discontinuidad es evitable.

Definición de derivada

Derivada como límite $$f'(x)=\frac{df}{dx}=\lim_{h\to0}\frac{f(x+h)-f(x)}{h}$$ Geométricamente, es la pendiente de la recta tangente en $x$; algebraicamente, la tasa instantánea de cambio.

Una derivada positiva indica crecimiento; negativa, decrecimiento; cero, un punto crítico (posible mínimo, máximo o punto de inflexión).

Reglas de derivación

ReglaFórmulaEjemplo
Constante$\frac{d}{dx}c=0$$\frac{d}{dx}7=0$
Potencia$\frac{d}{dx}x^n=nx^{n-1}$$\frac{d}{dx}x^3=3x^2$
Suma$(f+g)'=f'+g'$$(x^2+3x)'=2x+3$
Producto$(fg)'=f'g+fg'$$(x^2e^x)'=2xe^x+x^2e^x$
Cociente$\left(\frac{f}{g}\right)'=\frac{f'g-fg'}{g^2}$$\left(\frac{x}{x+1}\right)'=\frac{1}{(x+1)^2}$
Cadena$(f\circ g)'=f'(g(x))g'(x)$$(e^{3x})'=3e^{3x}$
Exponencial$\frac{d}{dx}e^x=e^x$$\frac{d}{dx}e^{2x}=2e^{2x}$
Logaritmo$\frac{d}{dx}\ln x=\frac{1}{x}$$\frac{d}{dx}\ln(3x)=\frac{1}{x}$
5 Derivada paso a paso

Sea $f(x)=3x^2+2x-5$. Calcular $f'(x)$ y evaluarla en $x=1$.

1
Derivamos término a término: $\frac{d}{dx}(3x^2)=6x$.
2
$\frac{d}{dx}(2x)=2$; $\frac{d}{dx}(-5)=0$.
3
$f'(x)=6x+2$.
4
$f'(1)=8$: la tangente en $x=1$ tiene pendiente 8. Si $x$ aumenta 0.01, $f$ aumenta aproximadamente $8\times0.01=0.08$.

Segunda derivada y curvatura

$f''(x)$ describe cómo cambia la pendiente. Si $f''(x)>0$, la función es convexa (curva hacia arriba) y un punto con $f'=0$ es un mínimo. Esta es la base de la optimización: las funciones de pérdida convexas tienen un único mínimo global.

Criterio de segunda derivada $$f'(x^*)=0 \;\text{y}\; f''(x^*)>0 \;\Longrightarrow\; x^* \text{ es un mínimo local}$$

Aplicación: derivada de la pérdida MSE

Para una predicción $\hat{y}=wx$ y un objetivo $y$, la pérdida cuadrática es $\ell(w)=\frac12(\hat{y}-y)^2=\frac12(wx-y)^2$. Su derivada respecto de $w$ es:

$$\frac{\partial \ell}{\partial w} = (wx-y)\cdot x$$ Aplicamos la regla de la cadena: derivada externa $(wx-y)$ por derivada interna $x$. Con muchos ejemplos, promediamos estas derivadas.
Pythonderivadas.py
import numpy as np

def f(x):
    return 3 * x**2 + 2 * x - 5

def f_prima(x):
    return 6 * x + 2

# Aproximación numérica de la derivada (diferencias centrales)
def derivada_numerica(fn, x, h=1e-6):
    return (fn(x + h) - fn(x - h)) / (2 * h)

x0 = 1.0
print("f'(1) analítica:", f_prima(x0))          # 8
print("f'(1) numérica: ", derivada_numerica(f, x0))  # ≈ 8

# Descenso del gradiente para minimizar f(x) = 3x^2 + 2x - 5
x = 5.0
lr = 0.05
for i in range(30):
    grad = f_prima(x)
    x = x - lr * grad
print("mínimo aproximado:", x)   # ≈ -1/3
print("f(mínimo):", f(x))        # ≈ -5.333
Regla mnemotécnica Derivar un polinomio: baja el exponente multiplicando y réstale uno. La derivada de $e^x$ es ella misma; la de $\ln x$ es $1/x$. Con estas tres ideas y la regla de la cadena se resuelve la mayoría de lo que necesitas.
Ejercicios 1.5
  1. $f(x)=x^4-3x^2+7$: $f'(x)=4x^3-6x$.
  2. $g(x)=(2x+1)^3$: $g'(x)=3(2x+1)^2\cdot2=6(2x+1)^2$.
  3. $h(x)=x\ln x$: $h'(x)=\ln x+1$ (regla del producto).
  4. $\lim_{x\to0}\frac{\sin x}{x}=1$ (resultado clásico; se usa en análisis de Fourier).
  5. ¿Dónde tiene un mínimo $f(x)=x^2-4x+1$? $f'=2x-4=0 \Rightarrow x=2$; $f''=2>0$, mínimo. $f(2)=-3$.
Lección 1.6

Derivadas parciales, gradiente y regla de la cadena

20 minCálculo multivariableBase de backpropagation

Los modelos tienen muchos parámetros. La derivada parcial mide cómo cambia la pérdida al mover un solo parámetro, manteniendo los demás fijos. El gradiente reúne todas esas derivadas en un vector que apunta hacia el máximo crecimiento.

Gradiente $$\nabla f(\mathbf{x}) = \left(\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\dots,\frac{\partial f}{\partial x_d}\right)^\top$$ Para minimizar, nos movemos en la dirección opuesta: $-\nabla f$. Esa es la idea del descenso del gradiente.
6 Gradiente de una función de dos variables

$f(x,y)=x^2y+3y^2$. Calcular el gradiente y evaluarlo en $(2,1)$.

1
$\frac{\partial f}{\partial x}=2xy$ (tratamos $y$ como constante).
2
$\frac{\partial f}{\partial y}=x^2+6y$.
3
$\nabla f(2,1)=(2\cdot2\cdot1,\;2^2+6\cdot1)=(4,10)^\top$.
4
En $(2,1)$, aumentar $x$ incrementa $f$ a razón de 4 por unidad; aumentar $y$, a razón de 10.

Derivada direccional

Si nos movemos en una dirección unitaria $\mathbf{u}$, la tasa de cambio es la proyección del gradiente:

$$D_{\mathbf{u}}f(\mathbf{x})=\nabla f(\mathbf{x})^\top\mathbf{u}$$ Se maximiza cuando $\mathbf{u}$ es paralela al gradiente; se minimiza en $-\nabla f$.

Regla de la cadena

Es la herramienta que hace posible entrenar redes profundas. Si $z=f(y)$ e $y=g(x)$, entonces:

Una variable $$\frac{dz}{dx}=\frac{dz}{dy}\cdot\frac{dy}{dx}$$ Varias variables $$\frac{\partial z}{\partial t}=\sum_{i}\frac{\partial z}{\partial y_i}\cdot\frac{\partial y_i}{\partial t}$$

Ejemplo: $z=(3x+1)^2$. Sea $y=3x+1$; entonces $z=y^2$, $\frac{dz}{dy}=2y$ y $\frac{dy}{dx}=3$. Por tanto $\frac{dz}{dx}=6(3x+1)$.

Ejemplo multivariable: $z=x^2+y^2$ con $x=t$, $y=t^2$. Entonces $\frac{dz}{dt}=2x\cdot1+2y\cdot2t=2t+4t^3$.

Por qué el gradiente es la dirección de máximo crecimiento

Para un desplazamiento pequeño $\Delta\mathbf{x}$, la aproximación de primer orden es $f(\mathbf{x}+\Delta\mathbf{x})\approx f(\mathbf{x})+\nabla f^\top\Delta\mathbf{x}$. Si $\|\Delta\mathbf{x}\|$ es fijo, el producto punto se maximiza cuando $\Delta\mathbf{x}$ apunta en la dirección del gradiente. Por eso el negativo del gradiente es la dirección de descenso más rápido.

Backpropagation en una frase Backpropagation es la regla de la cadena aplicada sistemáticamente, capa por capa, desde la salida hasta la entrada, reutilizando cálculos intermedios. Lo veremos en detalle en el Módulo 7.

Derivadas que conviene memorizar

FunciónDerivadaAparece en
$\sigma(x)=\frac{1}{1+e^{-x}}$$\sigma(x)(1-\sigma(x))$Regresión logística, redes
$\tanh(x)$$1-\tanh^2(x)$Redes recurrentes
$\text{ReLU}(x)=\max(0,x)$$1$ si $x>0$, $0$ si $x<0$Redes profundas
$\ln\sigma(x)$$1-\sigma(x)$Pérdida logística
$\|\mathbf{x}\|_2^2$$2\mathbf{x}$Regularización L2
Pythongradiente.py
import numpy as np

def f(x):
    return x[0]**2 * x[1] + 3 * x[1]**2

def grad_f(x):
    x1, x2 = x
    return np.array([2 * x1 * x2, x1**2 + 6 * x2])

p = np.array([2.0, 1.0])
print("f:", f(p))              # 10
print("gradiente:", grad_f(p)) # [4. 10.]

# Comprobación numérica de las parciales
h = 1e-6
gx = (f(p + [h, 0]) - f(p - [h, 0])) / (2 * h)
gy = (f(p + [0, h]) - f(p - [0, h])) / (2 * h)
print("numérico:", np.array([gx, gy]))
Ejercicios 1.6
  1. $f(x,y)=3x^2+2xy-y^2$: $\nabla f=(6x+2y,\;2x-2y)^\top$. En $(1,2)$: $(10,-2)$.
  2. $f(x,y,z)=xyz$: $\nabla f=(yz,xz,xy)$.
  3. Deriva $f(x)=e^{x^2}$: $f'(x)=2xe^{x^2}$.
  4. Deriva $f(x)=\ln(1+e^x)$ (softplus): $f'(x)=\frac{e^x}{1+e^x}=\sigma(x)$.
  5. Si $f(x,y)=x^2+y^2$, ¿en qué dirección desde $(1,1)$ decrece más rápido? En $-(2,2)^\top$, es decir, hacia el origen.
Lección 1.7

Descenso del gradiente

18 minOptimizaciónSimulador incluido

El descenso del gradiente (gradient descent) es el algoritmo de optimización más importante de ML. La idea es simple: si estás en una ladera y quieres bajar, camina en la dirección de mayor descenso, da un paso pequeño y repite.

Regla de actualización $$\mathbf{w}_{t+1} = \mathbf{w}_t - \eta \nabla L(\mathbf{w}_t)$$ $\mathbf{w}$: parámetros; $L$: función de pérdida; $\eta>0$: tasa de aprendizaje (learning rate); $t$: iteración.
7 Minimizar $f(x)=x^2$ desde $x_0=4$

Aquí $f'(x)=2x$. Con $\eta=0.2$: $x_{t+1}=x_t-0.2(2x_t)=0.6x_t$.

0
$x_0=4.000$, $f=16.000$, gradiente $=8$.
1
$x_1=4-0.2(8)=2.400$, $f=5.760$.
2
$x_2=2.4-0.2(4.8)=1.440$, $f=2.074$.
3
$x_3=0.864$, $f=0.746$; $x_4=0.518$, $f=0.269$.
n
La sucesión se acerca a 0, el mínimo global. Tras 10 pasos, $x\approx0.024$.

En general, para $f(x)=x^2$ la iteración es $x_{t+1}=(1-2\eta)x_t$. Converge si $|1-2\eta|<1$, es decir, $0<\eta<1$. Con $\eta=1.1$ diverge: el paso es demasiado grande.

El papel de la tasa de aprendizaje

$\eta$ComportamientoDiagnóstico
Muy pequeñoConvergencia lentísimaLa pérdida baja pero tarda horas
AdecuadoDescenso estable y rápidoCurva de pérdida suave
Muy grandeOscilación o divergenciaPérdida explota o se vuelve NaN

Variantes

  • Batch gradient descent: usa todos los datos para calcular el gradiente. Estable, pero costoso.
  • Stochastic gradient descent (SGD): usa un ejemplo por paso. Rápido y ruidoso; el ruido puede ayudar a escapar de mínimos locales.
  • Mini-batch: usa 32–512 ejemplos. Es el compromiso estándar en la práctica.
  • Momentum, RMSProp, Adam: adaptan la dirección o la magnitud del paso. Los veremos en el Módulo 7.

Convexidad: cuándo funciona bien

Si $L$ es convexa, todo mínimo local es global y el descenso del gradiente converge al óptimo con un $\eta$ adecuado. La regresión lineal con MSE y la regresión logística con entropía cruzada son convexas. Las redes neuronales no lo son: tienen muchos mínimos locales y puntos de silla, pero en la práctica el descenso estocástico encuentra soluciones útiles.

∇

Simulador · Descenso del gradiente

Ajusta la tasa de aprendizaje y observa cómo la bola busca el mínimo.

x = 4.00
f(x) = 16.00
∇f = 8.00
iteración = 0
Con η ≥ 1 en x² el algoritmo diverge. Prueba η = 0.05 frente a η = 0.9.
Pythongradient_descent.py
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x**2

def grad(x):
    return 2 * x

def gradient_descent(x0=4.0, lr=0.2, steps=15):
    x = x0
    history = [x]
    for _ in range(steps):
        x = x - lr * grad(x)
        history.append(x)
        if abs(x) > 1e6:       # divergencia
            break
    return np.array(history)

for lr in [0.05, 0.2, 0.9, 1.05]:
    hist = gradient_descent(lr=lr, steps=12)
    print(f"lr={lr:<4} x_final={hist[-1]: .4e}  pasos={len(hist)-1}")

# Visualización de la trayectoria
lr = 0.2
hist = gradient_descent(lr=lr, steps=6)
xs = np.linspace(-1, 5, 200)
plt.plot(xs, f(xs), label="f(x)=x²")
plt.scatter(hist, f(hist), c=range(len(hist)), cmap="viridis", zorder=3)
plt.plot(hist, f(hist), "--", alpha=.5)
plt.xlabel("x"); plt.ylabel("f(x)"); plt.legend(); plt.grid(alpha=.3)
plt.show()
Error frecuente Normalizar las features no es opcional cuando se usa descenso del gradiente. Si una feature varía entre 0 y 1 y otra entre 0 y 1 000 000, la superficie de pérdida se vuelve un valle alargado y el descenso zigzaguea. Estandarizar acelera y estabiliza.
Ejercicios 1.7
  1. Para $f(x)=(x-3)^2$, escribe la actualización: $x_{t+1}=x_t-2\eta(x_t-3)$.
  2. Con $\eta=0.1$ y $x_0=10$, calcula dos pasos: $x_1=10-0.1(14)=8.6$; $x_2=8.6-0.1(11.2)=7.48$.
  3. ¿Por qué no usamos $\eta=10$? Porque el paso es mayor que la curvatura permite; la iteración oscila y diverge.
  4. Diseña un criterio de parada razonable: detener cuando $\|\nabla L\|<10^{-5}$ o cuando la pérdida de validación deja de mejorar durante $k$ épocas.
Lección 1.8

Probabilidad y teorema de Bayes

24 minProbabilidadEjemplo médico

La probabilidad es el lenguaje de la incertidumbre. Un modelo de ML casi nunca está seguro: estima probabilidades, distribuciones y riesgos. Este tema introduce los axiomas, la probabilidad condicional y el teorema que gobierna la inferencia bayesiana.

Experimento, espacio muestral y eventos

  • Experimento aleatorio: proceso cuyo resultado no se puede predecir con certeza (lanzar un dado).
  • Espacio muestral $\Omega$: conjunto de todos los resultados posibles. Para un dado, $\Omega=\{1,2,3,4,5,6\}$.
  • Evento $A$: subconjunto de $\Omega$. «Salir par» es $A=\{2,4,6\}$.
  • Probabilidad $P(A)$: número entre 0 y 1 que cuantifica la verosimilitud de $A$.

Axiomas de Kolmogorov

$$P(\Omega)=1, \qquad P(A)\geq0, \qquad P\left(\bigcup_i A_i\right)=\sum_i P(A_i) \text{ si los } A_i \text{ son disjuntos}$$ De aquí se deduce $P(A^c)=1-P(A)$ y $P(A\cup B)=P(A)+P(B)-P(A\cap B)$.

Probabilidad condicional e independencia

Condicional $$P(A\mid B)=\frac{P(A\cap B)}{P(B)}, \qquad P(B)>0$$ «Probabilidad de A dado que ocurrió B». Cambia el espacio muestral efectivo a $B$.

$A$ y $B$ son independientes si $P(A\cap B)=P(A)P(B)$, equivalentemente $P(A\mid B)=P(A)$: saber que ocurrió $B$ no aporta información sobre $A$.

8 Dado: condicional simple

Se lanza un dado justo. Sabiendo que salió un número par, ¿cuál es la probabilidad de que sea un 6?

1
$A=\{6\}$, $B=\{2,4,6\}$.
2
$P(A\cap B)=P(\{6\})=1/6$.
3
$P(A\mid B)=\frac{1/6}{3/6}=\frac13$.

La información «es par» reduce el espacio muestral de 6 a 3 resultados equiprobables.

Teorema de Bayes

Regla de Bayes $$P(H\mid E)=\frac{P(E\mid H)\,P(H)}{P(E)} = \frac{P(E\mid H)\,P(H)}{P(E\mid H)P(H)+P(E\mid H^c)P(H^c)}$$ $P(H)$: probabilidad previa (prior); $P(E\mid H)$: verosimilitud; $P(H\mid E)$: probabilidad posterior; $P(E)$: evidencia o probabilidad total.
9 La prueba médica y la falacia de la tasa base

Una enfermedad afecta al 1% de la población. Una prueba tiene sensibilidad del 99% (detecta al 99% de enfermos) y especificidad del 95% (da negativo al 95% de sanos). Si una persona da positivo, ¿qué probabilidad tiene de estar enferma?

1
Prior: $P(E)=0.01$; sanos: $P(E^c)=0.99$.
2
Verdaderos positivos: $P(+\mid E)=0.99$. Falsos positivos: $P(+\mid E^c)=1-0.95=0.05$.
3
Evidencia: $P(+)=0.99(0.01)+0.05(0.99)=0.0099+0.0495=0.0594$.
4
Posterior: $P(E\mid +)=\frac{0.0099}{0.0594}\approx0.1667$.

Resultado: solo el 16.7%. Aunque la prueba parezca muy precisa, la enfermedad es rara y los falsos positivos dominan. Este es el error bayesiano más común en medicina y en detección de fraude.

Aplicación en ML

Naive Bayes aplica exactamente esta regla suponiendo independencia condicional de las features dada la clase:

$$P(y\mid x_1,\dots,x_d)\propto P(y)\prod_{j=1}^{d}P(x_j\mid y)$$ Aunque la independencia rara vez se cumple, el clasificador funciona sorprendentemente bien en texto.

La inferencia bayesiana también aparece en la calibración de probabilidades, en los modelos jerárquicos y en la optimización bayesiana de hiperparámetros.

Pythonbayes.py
# Teorema de Bayes: prueba médica
p_enf = 0.01
sensibilidad = 0.99      # P(+ | enfermo)
especificidad = 0.95     # P(- | sano)

p_pos_dado_enf = sensibilidad
p_pos_dado_sano = 1 - especificidad
p_pos = p_pos_dado_enf * p_enf + p_pos_dado_sano * (1 - p_enf)

p_enf_dado_pos = p_pos_dado_enf * p_enf / p_pos
print(f"P(enfermo | positivo) = {p_enf_dado_pos:.4f}")   # 0.1667

# Simulación Monte Carlo para verificar
import numpy as np
rng = np.random.default_rng(0)
n = 1_000_000
enfermos = rng.random(n) < p_enf
positivos = np.where(enfermos,
                     rng.random(n) < sensibilidad,
                     rng.random(n) < p_pos_dado_sano)
print("Monte Carlo:", enfermos[positivos].mean())
Falacia de la tasa base Ignorar $P(H)$ lleva a conclusiones absurdas. Si el fraude es 0.1% y un detector tiene 99% de precisión, la mayoría de las alertas pueden ser falsas. Siempre pregunta: ¿cuál es la prevalencia real?
Ejercicios 1.8
  1. Dos monedas justas. $P(\text{dos caras})=1/4$; $P(\text{al menos una cara})=3/4$.
  2. En una urna con 3 rojas y 2 azules, extraes una roja y no la devuelves. $P(\text{segunda roja}\mid\text{primera roja})=2/4=1/2$.
  3. Con los datos del ejemplo médico, ¿qué pasa si la prevalencia sube al 10%? $P(E\mid+)=\frac{0.099}{0.099+0.045}\approx0.688$. La misma prueba es mucho más informativa cuando la enfermedad es común.
  4. Demuestra $P(A\cup B)=P(A)+P(B)-P(A\cap B)$ usando un diagrama de Venn.
Lección 1.9

Variables aleatorias y distribuciones

20 minProbabilidadNormal + binomial

Una variable aleatoria es una función que asigna un número a cada resultado de un experimento. Nos permite describir el azar con funciones matemáticas y calcular esperanzas, varianzas y probabilidades.

Función de probabilidad y densidad $$P(X=x_i)=p_i \;\text{(discreta)}, \qquad P(a\leq X\leq b)=\int_a^b f(x)\,dx \;\text{(continua)}$$ En ambos casos, la probabilidad total es 1: $\sum_i p_i=1$ o $\int_{-\infty}^{\infty}f(x)dx=1$.

Esperanza y varianza

Momentos $$\mathbb{E}[X]=\sum_i x_i p_i \quad\text{o}\quad \int x f(x)\,dx, \qquad \operatorname{Var}(X)=\mathbb{E}\left[(X-\mathbb{E}[X])^2\right]=\mathbb{E}[X^2]-\mathbb{E}[X]^2$$ La desviación estándar es $\sigma=\sqrt{\operatorname{Var}(X)}$ y tiene las mismas unidades que $X$.
10 Dado justo: esperanza y varianza
1
$\mathbb{E}[X]=\frac16(1+2+3+4+5+6)=\frac{21}{6}=3.5$.
2
$\mathbb{E}[X^2]=\frac16(1+4+9+16+25+36)=\frac{91}{6}\approx15.167$.
3
$\operatorname{Var}(X)=15.167-3.5^2=15.167-12.25=2.917$.
4
$\sigma\approx1.708$. La mayoría de los lanzamientos caen entre $3.5\pm1.7$.

Distribuciones fundamentales

DistribuciónTipoParámetrosUso en ML
BernoulliDiscreta (0/1)$p$Clasificación binaria
BinomialDiscreta (conteos)$n,p$A/B testing, número de éxitos
PoissonDiscreta (conteos raros)$\lambda$Llegadas, eventos por intervalo
UniformeContinua$a,b$Inicialización, muestreo
NormalContinua$\mu,\sigma^2$Ruido, variables continuas
ExponencialContinua$\lambda$Tiempos de espera

La distribución normal

Densidad normal $$f(x)=\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$ Simétrica, campana centrada en $\mu$. El 68.3% de la masa cae en $\mu\pm\sigma$, el 95.4% en $\mu\pm2\sigma$ y el 99.7% en $\mu\pm3\sigma$.

Si $X\sim\mathcal{N}(100,15^2)$ (CI clásico), la probabilidad de estar entre 85 y 115 es ≈68%. Estandarizando $Z=(X-\mu)/\sigma$, obtenemos $\mathcal{N}(0,1)$ y podemos usar tablas.

Por qué la normal aparece tanto El teorema central del límite dice que la suma de muchas variables independientes tiende a una normal, sin importar su distribución original. Por eso los promedios y los errores de medición suelen modelarse como gaussianos.

Aplicación: verosimilitud y pérdida

Si asumimos $y_i = \mathbf{w}^\top\mathbf{x}_i+\varepsilon_i$ con $\varepsilon_i\sim\mathcal{N}(0,\sigma^2)$, maximizar la verosimilitud equivale a minimizar la suma de errores al cuadrado:

$$-\log L(\mathbf{w}) = \frac{1}{2\sigma^2}\sum_{i=1}^{n}(y_i-\mathbf{w}^\top\mathbf{x}_i)^2 + \text{constante}$$ Esta es la justificación probabilística de la pérdida MSE. La suposición de normalidad conecta estadística y optimización.
Pythondistribuciones.py
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# Dado justo
caras = np.arange(1, 7)
p = np.full(6, 1/6)
print("E[X] =", (caras * p).sum())          # 3.5
print("Var(X) =", (caras**2 * p).sum() - 3.5**2)  # 2.9167

# Normal
mu, sigma = 100, 15
x = np.linspace(40, 160, 300)
pdf = stats.norm.pdf(x, mu, sigma)
plt.plot(x, pdf, label="N(100, 15²)")
plt.fill_between(x, pdf, where=(x >= 85) & (x <= 115), alpha=.25, color="tab:green")
plt.title("68% de la masa entre μ ± σ")
plt.grid(alpha=.3); plt.legend(); plt.show()

print("P(85 < X < 115) =", stats.norm.cdf(115, mu, sigma) - stats.norm.cdf(85, mu, sigma))

# Binomial: 10 lanzamientos de moneda justa
print("P(X=5) =", stats.binom.pmf(5, 10, 0.5))   # 0.2461

# Muestreo de una normal
rng = np.random.default_rng(42)
muestra = rng.normal(loc=mu, scale=sigma, size=10_000)
print("media muestral:", muestra.mean(), "sd muestral:", muestra.std(ddof=1))
Ejercicios 1.9
  1. Una Bernoulli con $p=0.3$: $\mathbb{E}[X]=0.3$, $\operatorname{Var}(X)=0.3(0.7)=0.21$.
  2. Si $X\sim\mathcal{N}(50,10^2)$, ¿qué proporción supera 70? $z=2$; ≈2.3%.
  3. Lanzas 5 monedas justas. $P(\text{exactamente 2 caras})=\binom{5}{2}(0.5)^5=10/32=0.3125$.
  4. ¿Por qué la desviación estándar es más interpretable que la varianza? Porque está en las mismas unidades que la variable original.
Lección 1.10

Estadística descriptiva e inferencia

26 minEstadísticaIC + hipótesis

La estadística nos permite describir datos y, más importante, generalizar desde una muestra a una población. Sin ella, no podemos saber si una mejora de accuracy del 1% es real o ruido.

Medidas de tendencia central

$$\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i, \qquad \text{mediana}=\text{valor central ordenado}, \qquad \text{moda}=\text{valor más frecuente}$$ La media es sensible a outliers; la mediana es robusta. Si la distribución es muy asimétrica, conviene reportar ambas.

Dispersión

Varianza muestral y desviación estándar $$s^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2, \qquad s=\sqrt{s^2}$$ El denominador $n-1$ (corrección de Bessel) produce un estimador insesgado de la varianza poblacional.
11 Descriptiva de un conjunto pequeño

Datos: $2, 4, 4, 4, 5, 5, 7, 9$.

1
Media: $(2+4+4+4+5+5+7+9)/8=40/8=5$.
2
Mediana: al ordenar, los valores centrales son 4 y 5, luego $(4+5)/2=4.5$.
3
Moda: 4 (aparece tres veces).
4
Varianza poblacional: desviaciones al cuadrado $9,1,1,1,0,0,4,16$; suma 32; $32/8=4$. Desviación estándar 2.
5
Varianza muestral: $32/7\approx4.571$; $s\approx2.138$.

Correlación y covarianza

Covarianza y correlación de Pearson $$\operatorname{Cov}(X,Y)=\frac{1}{n-1}\sum_i(x_i-\bar{x})(y_i-\bar{y}), \qquad r=\frac{\operatorname{Cov}(X,Y)}{s_X s_Y}\in[-1,1]$$ $r$ mide relación lineal. Correlación no implica causalidad, y $r=0$ no implica independencia (puede haber relación no lineal).

Ejemplo: $x=(1,2,3)$, $y=(2,4,5)$. $\operatorname{Cov}=1.5$ (muestral), $s_x=1$, $s_y\approx1.528$, luego $r\approx0.982$: relación lineal positiva casi perfecta.

Muestreo y teorema central del límite

Una muestra aleatoria es indispensable para que las inferencias sean válidas. Si tomamos una muestra sesgada (por ejemplo, solo usuarios activos), ninguna técnica estadística repara el sesgo.

Distribución de la media muestral $$\bar{X}\approx\mathcal{N}\left(\mu,\frac{\sigma^2}{n}\right) \quad\text{para } n \text{ grande}, \qquad SE=\frac{s}{\sqrt{n}}$$ El error estándar disminuye con $\sqrt{n}$: para reducirlo a la mitad, necesitas cuatro veces más datos.

Intervalos de confianza

IC para la media (σ desconocida) $$\bar{x}\pm t_{1-\alpha/2,\,n-1}\cdot\frac{s}{\sqrt{n}}$$ Para $n=25$, $\bar{x}=52$, $s=10$ y 95%: $t_{0.975,24}=2.064$, margen $=2.064\cdot2=4.128$, IC $=[47.87,\,56.13]$.

Interpretación correcta: si repitiéramos el muestreo muchas veces, el 95% de los intervalos construidos así contendrían el verdadero $\mu$. No significa «hay 95% de probabilidad de que $\mu$ esté en este intervalo concreto».

Pruebas de hipótesis

  1. Formular $H_0$ (hipótesis nula) y $H_1$ (alternativa).
  2. Elegir un estadístico y un nivel de significancia $\alpha$ (típicamente 0.05).
  3. Calcular el estadístico y el valor $p$.
  4. Rechazar $H_0$ si $p<\alpha$; en caso contrario, no rechazar (no «aceptar»).
Prueba t de una muestra $$t=\frac{\bar{x}-\mu_0}{s/\sqrt{n}}, \qquad \text{grados de libertad}=n-1$$
12 ¿La media es distinta de 50?

$n=25$, $\bar{x}=52$, $s=10$, $H_0:\mu=50$, $H_1:\mu\neq50$, $\alpha=0.05$.

1
$t=\frac{52-50}{10/\sqrt{25}}=\frac{2}{2}=1.0$.
2
Con $df=24$, el valor crítico bilateral es $t_{0.975,24}=2.064$.
3
$|t|=1.0<2.064$, y el valor $p\approx0.327$.
4
No se rechaza $H_0$: los datos son compatibles con una media de 50. No se demuestra que $\mu=50$; solo que no hay evidencia suficiente en contra.
p-hacking Probar muchas hipótesis y reportar solo la que da $p<0.05$ infla los falsos positivos. Corrige por comparaciones múltiples (Bonferroni, Benjamini–Hochberg) o pre-registra el análisis. En ML, evaluar decenas de modelos en el mismo test y elegir el mejor también es una forma de sobreajuste.

Aplicación en evaluación de modelos

Cuando comparas dos modelos, una diferencia de 0.01 en accuracy puede ser ruido. Usa validación cruzada, reporta media y desviación estándar de las métricas, y aplica pruebas pareadas (por ejemplo, t-test sobre los folds o McNemar para clasificación). Un intervalo de confianza te dice cuánto puede variar el rendimiento en producción.

Pythonestadistica.py
import numpy as np
from scipy import stats

datos = np.array([2, 4, 4, 4, 5, 5, 7, 9])
print("media:", datos.mean())          # 5.0
print("mediana:", np.median(datos))    # 4.5
print("var muestral:", datos.var(ddof=1))
print("sd muestral:", datos.std(ddof=1))

x = np.array([1, 2, 3])
y = np.array([2, 4, 5])
print("correlación:", np.corrcoef(x, y)[0, 1])   # ≈ 0.982

# IC 95% para la media
n = 25
media, s = 52, 10
t_crit = stats.t.ppf(0.975, df=n-1)
margen = t_crit * s / np.sqrt(n)
print(f"IC 95%: [{media - margen:.2f}, {media + margen:.2f}]")

# Prueba t
t_stat, p_val = stats.ttest_1samp(np.random.default_rng(7).normal(52, 10, n), 50)
print(f"t={t_stat:.3f}, p={p_val:.3f}")
Resumen del módulo Álgebra y cálculo te dan el modelo y el gradiente; probabilidad y estadística te dan la incertidumbre y el criterio para decidir si un resultado es real. Juntas son la base de todo lo que sigue.
Ejercicios 1.10
  1. Datos $1,2,3,4,100$: media 22, mediana 3. La media está dominada por el outlier; la mediana describe mejor el centro típico.
  2. Si $r=0.9$ entre horas de estudio y nota, ¿puedes concluir causalidad? No. Puede haber confusores (motivación, calidad del curso) o causalidad inversa.
  3. Con $n=100$, $s=20$, el error estándar es 2. Un IC 95% aproximado es $\bar{x}\pm3.92$.
  4. Un test da $p=0.03$ con $\alpha=0.05$: rechazas $H_0$, pero el efecto puede ser pequeño. Reporta siempre el tamaño del efecto y el intervalo de confianza.
Curso de Machine Learning · teoría, matemáticas y práctica en Python Progreso local · 0% completado · Hecho para estudiar en cualquier lugar