Inicio · Parte 05 — Álgebra lineal I: vectores y matrices
similitud(u,v) = u·v / (‖u‖‖v‖)
puntuación(i) = Σ sim(u,w)·rᵥᵢ / Σ |sim(u,w)|
El capstone construye un sistema de recomendación por filtrado colaborativo basado en usuarios, y su interés está en lo que no usa: ninguna biblioteca de machine learning, ningún modelo entrenado, ninguna red neuronal. Es producto punto, norma y media ponderada.
El algoritmo tiene tres pasos. Calcular la similitud coseno entre el usuario objetivo y todos los demás; usar esas similitudes como pesos para promediar las valoraciones de los demás sobre los ítems que el objetivo no ha visto; recomendar el ítem con mayor puntuación estimada. Los pesos se normalizan dividiendo por la suma de similitudes absolutas para que la escala se conserve.
Las limitaciones son reales y conviene declararlas. El arranque en frío: un usuario nuevo no tiene vector, así que no hay similitud que calcular. La dispersión: en un catálogo real, cada usuario ha valorado una fracción minúscula de los ítems, y los vectores son casi todo ceros. Y el coste: comparar con todos los usuarios es O(n·d) por consulta, inviable con millones de usuarios sin índices aproximados.
Los sistemas industriales resuelven esas limitaciones con factorización matricial —que es la parte 06— y con embeddings aprendidos, pero la métrica de comparación sigue siendo la de esta clase. Entender el caso simple es lo que permite entender por qué las soluciones complejas hacen lo que hacen.
Recomendar a «ana» entre cuatro usuarios.
valoraciones (0 = no visto):
ana [5, 3, 0, 1]
beto [4, 0, 0, 1]
cata [1, 1, 0, 5]
dario [0, 0, 5, 4]
similitud coseno con ana:
beto 0.9783 ← el más parecido
cata 0.4707
dario 0.0900
ítems no vistos por ana: índice 2
puntuación estimada del ítem 2:
(0.9783·0 + 0.4707·0 + 0.0900·5) / (0.9783+0.4707+0.0900) = 0.29
recomendación: ítem 2 (el único no visto)
Capstone: recomendación lineal por similitud coseno entre usuarios.
python classes/part-05-algebra-lineal-i-vectores-y-matrices/120-capstone-resolver-un-sistema-de-recomendacion-lineal/lab.py
compmath run 120
usuariosobjetivosimilitudesvecino_mas_parecidopuntajes_estimadositems_no_vistosrecomendaciontodo_es_producto_punto{
"usuarios": {
"ana": [
5.0,
3.0,
0.0,
1.0
],
"beto": [
4.0,
0.0,
0.0,
1.0
],
"cata": [
1.0,
1.0,
0.0,
5.0
],
"dario": [
0.0,
0.0,
5.0,
4.0
]
},
"objetivo": "ana",
"similitudes": {
"beto": 0.860916,
"cata": 0.42289,
"dario": 0.105593
},
"vecino_mas_parecido": "beto",
"puntajes_estimados": [
2.782897,
0.304369,
0.379995,
2.445473
],
"items_no_vistos": [
2
]
}
Sistemas de recomendación, búsqueda por similitud, agrupación de usuarios y motores de contenido relacionado. El mismo cálculo, con embeddings en lugar de valoraciones, es la base de la recuperación semántica.
Cada capa densa es un producto matriz-vector. Los embeddings viven en subespacios y la similitud entre ellos es producto punto normalizado.
9781071621974, pendiente de resolver.