Ejemplo Práctico - Cuantización Vectorial
Apliquemos la difusión a un problema práctico. La Cuantización Vectorial (VQ) es una técnica utilizada en la compresión y clasificación de datos. Un paso clave es encontrar el vector de "código" más cercano de un "codebook" (libro de códigos) a un vector de "observación" dado. La difusión hace que este cálculo sea eficiente.
Imaginemos que tenemos una observación (por ejemplo, el peso y la altura de un atleta) y un libro de códigos de diferentes tipos de atletas. Queremos encontrar a qué tipo se parece más nuestra observación.
Reemplace el código en broadcasting.py con el siguiente:
import numpy as np
## An observation vector (e.g., weight, height)
observation = np.array([111.0, 188.0])
## A codebook of vectors
codes = np.array([[102.0, 203.0],
[132.0, 193.0],
[45.0, 155.0],
[57.0, 173.0]])
## Use broadcasting to subtract the observation from all codes at once
## observation (2,) is broadcast to (4, 2)
diff = codes - observation
## Calculate the squared Euclidean distance
dist_sq = np.sum(diff**2, axis=-1)
## Find the index of the minimum distance
closest_index = np.argmin(dist_sq)
## Get the closest code from the codebook
closest_code = codes[closest_index]
print("Observation:", observation)
print("Codebook:\n", codes)
print("Distances squared:", dist_sq)
print("Closest code index:", closest_index)
print("Closest code:", closest_code)
Ejecute el script en su terminal:
python broadcasting.py
La salida mostrará las distancias al cuadrado desde la observación a cada código e identificará el vector de código coincidente más cercano. Todo este cálculo se realizó sin bucles explícitos de Python, gracias a la difusión.
Observation: [111. 188.]
Codebook:
[[102. 203.]
[132. 193.]
[ 45. 155.]
[ 57. 173.]]
Distances squared: [ 306. 466. 5445. 3141.]
Closest code index: 0
Closest code: [102. 203.]