Rumbo Logo
DOCUMENTO DE DISEÑO MATEMÁTICO

Formalización Matemática del Motor de Búsqueda Geocontextual

Mejoras en certeza, precisión y eficiencia computacional para las tres fases del pipeline — Chambit

R3D
Por Laboratorio Rumbo3D
Marzo 18, 2026Versión 1.0
Formalización matemática y algoritmos
01

Fase 1 — Generación de Candidatos

El objetivo de esta fase es reducir el universo total $\mathcal{P}_{\text{total}}$ a un subconjunto $\mathcal{C}$ de candidatos geográficamente plausibles, con costo computacional $O(1)$ por consulta gracias a la indexación H3.

1.1 Modelo actual y su corrección

Definición — Generación de candidatos H3

Dado un usuario en la posición $u_{\text{loc}} = (\varphi_u, \lambda_u)$, se define el conjunto de candidatos como:

$$\mathcal{C} = \left\{ p \in \mathcal{P}_{\text{total}} \;\middle|\; H_r(p_{\text{loc}}) \in N_k\!\big(H_r(u_{\text{loc}})\big) \right\}$$

donde $H_r$ es la función de indexación hexagonal a resolución $r$, y $N_k(c)$ es el $k$-ring (vecindario de $k$ anillos) de la celda $c$.

Con la configuración actual ($r=7$, $k=2$), el k-ring produce 19 celdas con un radio efectivo de $\approx 5.6$ km en los vértices pero solo $\approx 4.2$ km en los lados, una asimetría de cobertura del $\sim$25%.

1.2 Mejora propuesta: Post-filtro circular+precisión+velocidad

Mejora M1 — Filtro isotrópico post-H3

Tras obtener $\mathcal{C}$ del k-ring, aplicar un post-filtro con la distancia Haversine:

$$\mathcal{C}' = \left\{ p \in \mathcal{C} \;\middle|\; d_{\text{hav}}(u_{\text{loc}}, p_{\text{loc}}) \leq d_{\max} \right\}$$

donde $d_{\text{hav}}$ es la distancia de Haversine:

$$d_{\text{hav}}(\varphi_1, \lambda_1, \varphi_2, \lambda_2) = 2R \arcsin\!\sqrt{\sin^2\!\tfrac{\Delta\varphi}{2} + \cos\varphi_1 \cos\varphi_2 \sin^2\!\tfrac{\Delta\lambda}{2}}$$

con $R = 6{,}371$ km. Esto se computa sobre $|\mathcal{C}| \approx 19 \times \bar{n}_{\text{celda}}$ candidatos, no sobre $|\mathcal{P}_{\text{total}}|$.

La complejidad adicional es $O(|\mathcal{C}|)$ operaciones aritméticas (sin, cos, arcsin), todas $O(1)$ por candidato. Para $|\mathcal{C}| \leq 500$, esto añade $< 1$ ms. Se elimina completamente el sesgo hexagonal sin degradar la latencia.

Nota sobre Haversine vs. Vincenty

Para Cali ($\varphi \approx 3.4°$N), cerca del ecuador, el error esférico máximo de Haversine es:

$$\epsilon_{\max} = \frac{a - b}{a} \cdot d \approx \frac{21.4}{6378.1} \cdot 5.6 \approx 0.019 \;\text{km} = 19\;\text{m}$$

donde $a = 6{,}378.137$ km (semieje mayor) y $b = 6{,}356.752$ km (semieje menor). Este error es inferior al ruido del GPS móvil ($\sigma_{\text{GPS}} \sim 5\text{–}15$ m), por lo que Vincenty es innecesario (Karney, 2013).

02

Fase 2 — Bayesian Average y el Valor de $C_g$

2.1 Formulación actual

Definición — Bayesian Average (Shrinkage Estimator)

$$S_{\text{bayes}}(p) = \frac{v_p \cdot \bar{R}_p + m \cdot C_g}{v_p + m}$$

donde $v_p$ = número de ratings del proveedor $p$, $\bar{R}_p$ = media aritmética de sus ratings, $m$ = parámetro de credibilidad (pseudo-conteo), y $C_g$ = prior global.

Esta expresión es equivalente al estimador de contracción lineal de James-Stein (James & Stein, 1961) y al estimador posterior bajo un modelo Normal con prior conjugado.

2.2 Análisis del valor $C_g = 3.5$: ¿es correcto?

La respuesta corta es: depende del estado del marketplace. El valor $C_g = 3.5$ corresponde al punto medio de la escala [1, 5], lo cual implica un prior no informativo o de máxima entropía sobre la calificación. Esto es correcto como elección pre-lanzamiento cuando no hay datos, pero se vuelve subóptimo en cuanto se acumula evidencia.

Problema empírico: la distribución J-shape

La literatura en marketplaces y plataformas muestra consistentemente que la distribución de ratings sigue una J-shape con concentración en 4★ y 5★. Hu et al. (2009) documentaron que en Amazon, eBay y otros, la media empírica de ratings oscila entre $\bar{R}_{\text{global}} \in [3.8, 4.3]$. Zervas et al. (2017) reportaron $\bar{R} \approx 4.7$ en Airbnb.

Si la media real del marketplace evoluciona a $\bar{R}_{\text{global}} = 4.1$, un prior de $C_g = 3.5$ introduce un sesgo sistemático:

$$\text{Bias}(p) = S_{\text{bayes}}(p) - \bar{R}_p = \frac{m(C_g - \bar{R}_p)}{v_p + m}$$

Para un proveedor nuevo con $v_p = 0$: $S_{\text{bayes}} = C_g = 3.5$, cuando debería ser $\approx 4.1$. Esto lo penaliza con $-0.6$ puntos antes de recibir un solo rating. Este handicap se traduce en menor ranking y menor exposición, creando un ciclo de retroalimentación negativa (cold-start loop).

2.3 Mejora M2: $C_g$ adaptativo+certeza+precisión

Mejora M2 — Prior adaptativo con media móvil exponencial

Reemplazar $C_g$ estático por un estimador adaptativo que se recalcula periódicamente:

$$C_g^{(t)} = \alpha \cdot \bar{R}_{\text{global}}^{(t)} + (1 - \alpha) \cdot C_g^{(t-1)}$$

con $C_g^{(0)} = 3.5$ (prior de máxima entropía) y $\alpha \in [0.05, 0.2]$ como tasa de suavizado.

El estimador global ponderado es:

$$\bar{R}_{\text{global}}^{(t)} = \frac{\sum_{p \in \mathcal{P}_{\text{activos}}} v_p \cdot \bar{R}_p}{\sum_{p \in \mathcal{P}_{\text{activos}}} v_p}$$

La media móvil exponencial (EMA) tiene propiedades deseables: (i) converge al verdadero $\mu$ bajo condiciones ergódicas, (ii) tiene memoria controlada por $\alpha$, y (iii) se computa en $O(1)$ por actualización incremental (Hunter, 1986). Se recomienda $\alpha = 0.1$ como balance entre reactividad y estabilidad.

Velocidad de convergencia de $C_g^{(t)}$

Tras $n$ actualizaciones, el peso residual del valor inicial es $(1-\alpha)^n$. Para $\alpha = 0.1$:

ActualizacionesPeso residual de $C_g^{(0)}$Interpretación
10$0.9^{10} = 0.349$$C_g^{(0)}$ aún tiene 35% de influencia
20$0.9^{20} = 0.122$Dominan los datos reales
50$0.9^{50} = 0.005$Prior inicial prácticamente eliminado

Si se recalcula semanalmente, el prior de 3.5 pierde relevancia tras $\sim$5 meses de operación, lo cual es coherente con el ciclo de maduración de un marketplace nuevo.

2.4 Mejora M3: $m$ adaptativo al volumen+certeza

Mejora M3 — Parámetro de credibilidad escalonado

En lugar de $m = 10$ fijo, usar:

$$m^{(t)} = \min\!\left(m_{\max},\; \max\!\left(m_{\min},\; \gamma \cdot \text{mediana}(v_p)^{(t)}\right)\right)$$

con $m_{\min} = 3$, $m_{\max} = 15$, $\gamma = 0.5$.

La mediana de ratings por proveedor es una estadística robusta que crece con la madurez del marketplace. Cuando la mediana es baja (lanzamiento), $m$ es bajo y permite que los proveedores construyan reputación rápido. Cuando crece (marketplace maduro), $m$ aumenta y protege contra ratings anómalos.

El número de ratings para que el peso propio alcance una fracción $\phi$ del score es:

$$v_p^{*} = \frac{\phi \cdot m}{1 - \phi}$$

$m$$v_p^*$ para $\phi = 0.8$Contexto
312Lanzamiento agresivo
520Balanceado
1040Marketplace establecido
03

Fase 2 — Señales Normalizadas

3.1 Señal de distancia: de lineal a Gaussiana+precisión~velocidad

Actual — Decaimiento lineal

$$f_{\text{dist}}^{\text{lin}}(d) = \max\!\left(0,\; 1 - \frac{d}{d_{\max}}\right)$$

La lineal asume que el costo marginal de un kilómetro extra es constante. Esto viola la ley de Weber-Fechner, que establece que la percepción humana de un estímulo es proporcional al logaritmo de su intensidad (Fechner, 1860). En la práctica urbana, la diferencia entre 0 y 1 km es mucho más significativa que entre 4 y 5 km.

Mejora M4 — Decaimiento Gaussiano

$$f_{\text{dist}}^{\text{gauss}}(d) = \exp\!\left(-\frac{d^2}{2\sigma^2}\right), \qquad \sigma = \frac{d_{\max}}{3}$$

La Gaussiana es el único kernel isotrópico que maximiza la entropía sujeta a una varianza fija (Cover & Thomas, 2006), lo que la convierte en la elección de máxima ignorancia cuando solo se conoce la escala de distancia. Con $\sigma = d_{\max}/3$, se tiene que $f_{\text{dist}}(d_{\max}) = e^{-9/2} \approx 0.011$, es decir, los proveedores al borde del radio tienen score de distancia $\approx 1\%$. Esto es más agresivo que la lineal (que da $\approx 0\%$) pero la caída es suave, no abrupta.

El costo computacional de $\exp(-x)$ es $O(1)$ y en hardware moderno toma $\sim$3 ns (idéntico a una multiplicación con pipeline SIMD). No hay degradación de velocidad.

Comparación cuantitativa

$d$ (km)LinealGaussiana ($\sigma = 1.87$)$\Delta$
0.01.0001.0000.000
0.50.9110.965+0.054
1.00.8210.868+0.047
2.00.6430.5690.074
3.00.4640.2800.184
4.00.2860.1040.182
5.00.1070.0290.078

La Gaussiana favorece a los proveedores cercanos ($d < 1.5$ km) y penaliza más agresivamente a los lejanos ($d > 2$ km). Esto es exactamente el efecto de percepción deseado.

3.2 Señal de actividad: exponencial continua+precisión+certeza

Actual — Step function (5 escalones)

$$f_{\text{activ}}^{\text{step}}(\Delta t) = \begin{cases} 1.0 & \Delta t < 1\text{h} \\ 0.8 & 1 \leq \Delta t < 24\text{h} \\ 0.6 & 24 \leq \Delta t < 168\text{h} \\ 0.4 & 168 \leq \Delta t < 720\text{h} \\ 0.2 & \Delta t \geq 720\text{h} \end{cases}$$

El diagnóstico previo documentó errores de hasta 567% entre la step function y la exponencial diseñada. Un proveedor inactivo 6 días (144h) recibe 0.6 con la step function pero debería recibir $\approx 0.12$.

Mejora M5 — Decaimiento exponencial con half-life

$$f_{\text{activ}}(\Delta t) = 2^{-\Delta t / \tau_{1/2}} = \exp\!\left(-\frac{\ln 2}{\tau_{1/2}} \cdot \Delta t\right)$$

con $\tau_{1/2} = 48$ horas (half-life: el score cae a la mitad cada 48h).

Equivalentemente, con $\lambda = \ln 2 / \tau_{1/2} \approx 0.01444 \;\text{h}^{-1}$:

$$f_{\text{activ}}(\Delta t) = e^{-\lambda \Delta t}$$

Es la única distribución con la propiedad de sin memoria (memoryless property): $P(\Delta t > s + t \mid \Delta t > s) = P(\Delta t > t)$. Es decir, el decaimiento relativo entre la hora 100 y la hora 148 es idéntico al decaimiento entre la hora 0 y la hora 48 (siempre 50%). Esto es coherente con la expectativa de que la "frescura" de un proveedor se degrada a tasa constante.

El half-life $\tau_{1/2} = 48$h es parametrizable y debería calibrarse con datos de re-contratación. Se puede almacenar en Firestore como configuración dinámica.

3.3 Señal de categoría: de binaria a fuzzy+precisión

Mejora M6 — Match de categoría jerárquico

$$f_{\text{cat}}(q, p) = \begin{cases} 1.0 & \text{si } \text{subcat}(q) = \text{subcat}(p) \\ 0.5 & \text{si } \text{cat}(q) = \text{cat}(p) \\ \beta_{ij} & \text{si } (\text{cat}(q), \text{cat}(p)) \in \mathcal{R}_{\text{afin}} \\ 0.0 & \text{otro caso} \end{cases}$$

donde $\mathcal{R}_{\text{afin}}$ es una tabla estática de afinidades entre categorías (ej: "electricista" $\leftrightarrow$ "técnico HVAC", $\beta = 0.3$).

Esto convierte el 15% del presupuesto de scoring asignado a $f_{\text{cat}}$ en señal discriminante real. Actualmente se desperdicia porque el hard-filter hace que $f_{\text{cat}} = 1.0$ para todo candidato que pasa.

La tabla $\mathcal{R}_{\text{afin}}$ puede mantenerse manualmente ($\sim$20 pares) al inicio y luego derivarse empíricamente de la matriz de co-contratación $\mathbf{M}_{ij} = \#\{$usuarios que contrataron categoría $i$ y también $j\}$.

04

Fase 2 — Función de Scoring Unificada

4.1 Problema: tres fórmulas divergentes

El diagnóstico identificó tres implementaciones diferentes. Esto genera comportamiento impredecible y es un riesgo de consistencia grave.

4.2 Mejora M7: Scoring multi-señal único+certeza+precisión

Mejora M7 — Función de scoring consolidada

$$S(q, p) = \sum_{i=1}^{K} w_i \cdot f_i(q, p), \qquad \sum_{i=1}^{K} w_i = 1, \quad w_i \geq 0$$

con las $K = 5$ señales normalizadas:

$$S(q, p) = w_d \cdot f_{\text{dist}}(d_{q,p}) + w_r \cdot \tilde{S}_{\text{rep}}(p) + w_a \cdot f_{\text{activ}}(\Delta t_p) + w_c \cdot f_{\text{cat}}(q, p) + w_v \cdot f_{\text{avail}}(p)$$

donde $\tilde{S}_{\text{rep}}(p) = S_{\text{bayes}}(p) / 5$ es la reputación normalizada a $[0, 1]$.

Pesos recomendados

Modo$w_d$$w_r$$w_a$$w_c$$w_v$Justificación
Relevancia (default)0.300.250.200.150.10Spec E02
Sort by rating0.150.450.150.150.10Reputación domina
Sort by distance0.500.150.100.150.10Distancia domina

Los pesos deben almacenarse como ScoringWeights en Firestore, no hardcodeados. Esto permite A/B testing sin redespliegue.

4.3 Mejora M8: Umbral mínimo de reputación+certeza

Mejora M8 — Gate de calidad mínima

Antes del scoring, aplicar un gate multiplicativo:

$$S_{\text{final}}(q, p) = g(\tilde{S}_{\text{rep}}) \cdot S(q, p)$$

donde:

$$g(r) = \begin{cases} 1 & r \geq \theta_{\min} \\ r / \theta_{\min} & r < \theta_{\min} \end{cases}, \qquad \theta_{\min} = 0.5 \;\;\text{(equivalente a 2.5★)}$$

Esto resuelve el escenario problemático del diagnóstico donde un proveedor con 2.0★ a 100m superaba a uno con 4.8★ a 3km. El gate reduce el score del proveedor de 2.0★ por un factor de $g(0.4) = 0.4/0.5 = 0.8$, lo que lo desplaza varios puestos hacia abajo sin eliminarlo completamente del ranking.

05

Fase 3 — Wilson Lower Bound

5.1 Formulación correcta

Definición — Wilson Lower Bound (Wilson, 1927)

Para una proporción observada $\hat{p}$ con $n$ observaciones y nivel de confianza $1-\alpha$ (con $z = z_{1-\alpha/2}$):

$$W_{\text{LB}} = \frac{\hat{p} + \frac{z^2}{2n} - z\sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2}{4n^2}}}{1 + \frac{z^2}{n}}$$

Con $z = 1.96$ (IC 95%), este es el límite inferior del intervalo de confianza de Wilson para una proporción binomial. Reddit lo usa para ordenar comentarios (Miller, 2009).

5.2 Conversión de ratings a proporciones

El diagnóstico identificó que la conversión lineal $\hat{p} = (r-1)/4$ no es óptima. Propongo una conversión calibrada a la distribución J-shape:

Mejora M9 — Conversión no-lineal de ratings

$$\phi(r) = \begin{cases} 1.00 & r = 5 \\ 0.85 & r = 4 \\ 0.35 & r = 3 \\ 0.10 & r = 2 \\ 0.00 & r = 1 \end{cases}$$

Y la proporción agregada del proveedor $p$:

$$\hat{p}_p = \frac{1}{v_p} \sum_{i=1}^{v_p} \phi(r_i)$$

Esta conversión refleja que en marketplaces, un rating de 3★ es percibido como negativo (no como "neutral"). La calibración se basa en los hallazgos de Hu et al. (2009) y puede refinarse con datos propios midiendo la tasa de re-contratación por nivel de rating.

5.3 Uso en el pipeline

Wilson LB no reemplaza al Bayesian Average sino que lo complementa:

$$S_{\text{rep}}(p) = \begin{cases} S_{\text{bayes}}(p) / 5 & \text{si } v_p < n_{\text{min}} \;\;(\text{pocos datos, usar shrinkage})\\ W_{\text{LB}}(\hat{p}_p, v_p) & \text{si } v_p \geq n_{\text{min}} \;\;(\text{suficientes datos, usar confianza}) \end{cases}$$

con $n_{\min} = 10$. Esto da estabilidad en cold-start (Bayesian Average) y discriminación en caliente (Wilson LB).

06

Fase 3 — Modelo Beta-Binomial

6.1 Unificación Bayesian Average + Wilson en un solo framework

Tanto el Bayesian Average como el Wilson LB son aproximaciones de un modelo más general: el modelo Beta-Binomial conjugado (Gelman et al., 2013).

Proposición — Modelo Beta-Binomial para reputación

Prior:

$$\theta_p \sim \text{Beta}(\alpha_0, \beta_0)$$

Likelihood: Cada rating convertido $x_i = \phi(r_i) \in \{0, 1\}$ (o tratado como Bernoulli suavizado):

$$x_i \mid \theta_p \sim \text{Bernoulli}(\theta_p)$$

Posterior:

$$\theta_p \mid \mathbf{x} \sim \text{Beta}\!\left(\alpha_0 + \textstyle\sum x_i,\;\; \beta_0 + v_p - \textstyle\sum x_i\right)$$

Definiendo $\alpha_n = \alpha_0 + \sum x_i$ y $\beta_n = \beta_0 + v_p - \sum x_i$:

$$E[\theta_p \mid \mathbf{x}] = \frac{\alpha_n}{\alpha_n + \beta_n} = \frac{\alpha_0 + \sum x_i}{\alpha_0 + \beta_0 + v_p}$$

Esto es exactamente el Bayesian Average si definimos $m = \alpha_0 + \beta_0$ y $C_g = \alpha_0 / (\alpha_0 + \beta_0)$.

Conexión con el prior adaptativo

Los hiperparámetros del prior se calibran con los estimadores adaptativos M2 y M3:

$$\alpha_0 = m \cdot C_g, \qquad \beta_0 = m \cdot (1 - C_g)$$

Con $C_g^{(t)} = 0.82$ (correspondiente a $\bar{R}_{\text{global}} \approx 4.1$ en escala [0,1] vía $\phi$) y $m = 5$:

$$\alpha_0 = 5 \times 0.82 = 4.1, \qquad \beta_0 = 5 \times 0.18 = 0.9$$

6.2 Ventaja: ranking por percentil del posterior

Mejora M10 — Score por percentil 5% del posterior Beta

En lugar de rankear por la media $E[\theta_p]$, usar el percentil $q$ del posterior:

$$S_{\text{beta}}(p) = F_{\text{Beta}}^{-1}\!\left(q;\; \alpha_n, \beta_n\right), \qquad q = 0.05$$

Donde $F_{\text{Beta}}^{-1}$ es la función cuantil de la distribución Beta. Esto es matemáticamente equivalente al Wilson Lower Bound para el caso binomial con aproximación normal, pero más preciso porque:

(i) No requiere la aproximación normal ($n$ puede ser pequeño).
(ii) Incorpora naturalmente el prior (Wilson LB no tiene prior).
(iii) Unifica Bayesian Average y Wilson LB en una sola expresión.

Complejidad computacional

La función cuantil Beta se computa numéricamente vía inversión de la función Beta incompleta regularizada. Librerías estándar (scipy, jStat) lo hacen en $O(1)$ con $\sim$10 iteraciones de Newton-Raphson. Para $|\mathcal{C}'| \leq 200$ candidatos, el costo total es $< 0.5$ ms.

07

Fase 3 — Estrategia de Machine Learning

7.1 Feature Engineering

El vector de características $\Phi(q, p)$ para el modelo LTR se construye como la concatenación de sub-vectores especializados:

$$\Phi(q, p) = \big[\underbrace{\Phi_{\text{geo}}}_{\text{espacial}} \;\|\; \underbrace{\Phi_{\text{rep}}}_{\text{reputación}} \;\|\; \underbrace{\Phi_{\text{activ}}}_{\text{actividad}} \;\|\; \underbrace{\Phi_{\text{match}}}_{\text{afinidad}} \;\|\; \underbrace{\Phi_{\text{ctx}}}_{\text{contexto}}\big]$$

Feature vector propuesto

$\Phi_{\text{geo}}$ (3 features):

$$\Phi_{\text{geo}} = \big[d_{\text{hav}}(q, p),\;\; k_{\text{ring}}(q, p),\;\; \mathbb{1}_{\text{mismo\_barrio}}(q, p)\big]$$

donde $k_{\text{ring}} \in \{0, 1, 2\}$ es la distancia en anillos H3 y $\mathbb{1}_{\text{mismo\_barrio}}$ es indicadora binaria.

$\Phi_{\text{rep}}$ (4 features):

$$\Phi_{\text{rep}} = \big[S_{\text{bayes}}(p),\;\; v_p,\;\; S_{\text{beta}}(p),\;\; \text{Var}[\theta_p \mid \mathbf{x}]\big]$$

donde $\text{Var}[\theta_p \mid \mathbf{x}] = \frac{\alpha_n \beta_n}{(\alpha_n + \beta_n)^2(\alpha_n + \beta_n + 1)}$ es la varianza del posterior Beta (incertidumbre).

$\Phi_{\text{activ}}$ (3 features):

$$\Phi_{\text{activ}} = \big[f_{\text{activ}}(\Delta t_p),\;\; \bar{t}_{\text{resp}}(p),\;\; \rho_{\text{compl}}(p)\big]$$

donde $\bar{t}_{\text{resp}}$ = tiempo medio de respuesta y $\rho_{\text{compl}}$ = tasa de completación de servicios.

$\Phi_{\text{match}}$ (2 features):

$$\Phi_{\text{match}} = \big[f_{\text{cat}}(q, p),\;\; \text{precio}_p / \text{PRC}_{\text{subcat}}\big]$$

$\Phi_{\text{ctx}}$ (3 features):

$$\Phi_{\text{ctx}} = \big[\text{hora\_del\_dia},\;\; \text{dia\_semana},\;\; f_{\text{avail}}(p)\big]$$

Total: 15 features. Para el volumen esperado de Chambit ($< 100$k usuarios), este es un tamaño de feature vector adecuado para gradient boosted trees sin riesgo de overfitting (Hastie et al., 2009).

7.2 Modelo LTR: LambdaMART

Definición — LambdaMART (Burges, 2010)

LambdaMART es un algoritmo de Learning to Rank que combina MART (Multiple Additive Regression Trees) con gradientes $\lambda$ derivados de la métrica NDCG:

$$f(x) = \sum_{t=1}^{T} \eta \cdot h_t(x)$$

donde $h_t$ es un árbol de regresión y $\eta$ es el learning rate. Los gradientes $\lambda$ para el par $(i, j)$ donde $i$ es más relevante que $j$ son:

$$\lambda_{ij} = \frac{-\sigma}{1 + e^{\sigma(s_i - s_j)}} \cdot |\Delta \text{NDCG}_{ij}|$$

donde $\Delta \text{NDCG}_{ij}$ es el cambio en NDCG al intercambiar las posiciones de $i$ y $j$.

Etiquetas de entrenamiento

Las etiquetas de relevancia para entrenamiento se derivan de las interacciones observadas en una escala ordinal de 5 niveles:

$$y_{q,p} = \begin{cases} 0 & \text{no click (impresión sin interacción)} \\ 1 & \text{click en perfil} \\ 2 & \text{solicitud de contacto} \\ 3 & \text{servicio contratado} \\ 4 & \text{servicio contratado + rating} \geq 4\text{★} \end{cases}$$

Métrica de evaluación: NDCG@k

$$\text{NDCG@}k = \frac{\text{DCG@}k}{\text{IDCG@}k}, \qquad \text{DCG@}k = \sum_{i=1}^{k} \frac{2^{y_i} - 1}{\log_2(i + 1)}$$

Se recomienda evaluar en $k \in \{3, 5, 10\}$, siendo $k=5$ el principal KPI porque es el número típico de resultados visibles en una pantalla móvil.

7.3 Inferencia: ONNX Runtime

El modelo entrenado se exporta a formato ONNX y se ejecuta en Cloud Functions. Para un ensemble de 500 árboles con profundidad máxima 6 y 15 features:

$$\text{Latencia}_{\text{inferencia}} \approx \frac{T \cdot d}{C_{\text{throughput}}} \approx \frac{500 \times 6}{10^8\;\text{nodos/s}} \approx 30\;\mu\text{s por candidato}$$

Para 100 candidatos en la fase de re-ranking: $\sim$3 ms total. Esto está bien dentro del presupuesto de latencia.

7.4 Feature logging para entrenamiento futuro

Mejora M11 — Logging de features desde el MVP

Desde el primer día de producción, almacenar para cada impresión de búsqueda:

$$\text{log}(q, p, t) = \big\{\Phi(q, p),\;\; \text{rank\_position},\;\; y_{q,p},\;\; \text{timestamp}\big\}$$

Esto permite entrenar el modelo LTR cuando se acumulen $\geq 10{,}000$ impresiones de búsqueda.

El logging no afecta la latencia del usuario si se hace de forma asíncrona (fire-and-forget a una cola Pub/Sub).

08

PRC: Precio de Referencia Robusto

8.1 Actual: media ponderada

$$\text{PRC} = \frac{\sum_{p} w_p \cdot \text{precio}_p}{\sum_{p} w_p}, \qquad w_p = \max(1, v_p)$$

8.2 Mejora M12: Detección de bimodalidad + IC+certeza

Mejora M12 — PRC con detección de clusters

Calcular el coeficiente de variación:

$$\text{CV} = \frac{s_w}{\text{PRC}}, \qquad s_w = \sqrt{\frac{\sum_p w_p(\text{precio}_p - \text{PRC})^2}{(n-1) \cdot \bar{w}}}$$

Si $\text{CV} \leq 0.5$: Reportar PRC único con intervalo de confianza:

$$\text{IC}_{95\%} = \text{PRC} \pm 1.96 \cdot \frac{s_w}{\sqrt{n_{\text{eff}}}}, \qquad n_{\text{eff}} = \frac{(\sum w_p)^2}{\sum w_p^2}$$

donde $n_{\text{eff}}$ es el tamaño de muestra efectivo de Kish (Kish, 1965).

Si $\text{CV} > 0.5$: Aplicar k-medoids (más robusto que k-means para precios con outliers) con $k = 2$ y reportar:

$$\text{PRC}_{\text{eco}} = \text{medoide}_1, \qquad \text{PRC}_{\text{prem}} = \text{medoide}_2$$

Esto transforma el PRC de un solo número a un rango informativo ("$45,000 – $55,000") o dos segmentos ("Económico: $30,000 / Premium: $120,000"), mejorando la utilidad para el usuario.

09

Resumen de Complejidad Computacional

OperaciónComplejidadLatencia est.Cambio vs actual
H3 k-ring lookup$O(19)$ Firestore reads$\sim$50 msSin cambio
Post-filtro Haversine (M1)$O(|\mathcal{C}|)$$< 1$ msNuevo, despreciable
Bayesian Average + gate (M7, M8)$O(|\mathcal{C}'|)$$< 0.5$ msSin cambio
$f_{\text{dist}}$ Gaussiana (M4)$O(|\mathcal{C}'|)$ — 1 exp()$< 0.1$ ms$\approx$ igual a lineal
$f_{\text{activ}}$ exponencial (M5)$O(|\mathcal{C}'|)$ — 1 exp()$< 0.1$ msMás rápido (sin branches)
Scoring multi-señal (M7)$O(K \cdot |\mathcal{C}'|)$$< 0.5$ msSin cambio
Beta quantile (M10)$O(|\text{Top-}k|)$ — Newton-Raphson$< 0.5$ msNuevo, solo Top-k
LTR inference (M11)$O(T \cdot d \cdot |\text{Top-}k|)$$\sim$3 msNuevo, fase 3 only
Total pipeline$\sim$55 ms+$\sim$5 ms vs actual

El overhead total de todas las mejoras es de $\sim$5 ms, bien dentro del presupuesto de 200 ms típico para búsquedas en tiempo real. La mejora M5 (exponencial vs step function) es marginalmente más rápida porque elimina las 5 comparaciones condicionales y las reemplaza por una sola operación aritmética, lo cual es más eficiente en pipelines de CPU modernos (branch prediction-friendly).

10

Referencias

[1] Burges, C. J. C. (2010). From RankNet to LambdaRank to LambdaMART: An Overview. Microsoft Research Technical Report MSR-TR-2010-82.

[2] Cover, T. M. & Thomas, J. A. (2006). Elements of Information Theory, 2nd ed. Wiley-Interscience.

[3] Fechner, G. T. (1860). Elemente der Psychophysik. Breitkopf und Härtel.

[4] Gelman, A., Carlin, J. B., Stern, H. S., Dunson, D. B., Vehtari, A., & Rubin, D. B. (2013). Bayesian Data Analysis, 3rd ed. CRC Press.

[5] Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning, 2nd ed. Springer.

[6] Hu, N., Zhang, J., & Pavlou, P. A. (2009). Overcoming the J-shaped distribution of product reviews. Communications of the ACM, 52(10), 144–147.

[7] Hunter, J. S. (1986). The exponentially weighted moving average. Journal of Quality Technology, 18(4), 203–210.

[8] James, W. & Stein, C. (1961). Estimation with quadratic loss. Proceedings of the Fourth Berkeley Symposium, 1, 361–379.

[9] Karney, C. F. F. (2013). Algorithms for geodesics. Journal of Geodesy, 87(1), 43–55.

[10] Kish, L. (1965). Survey Sampling. John Wiley & Sons.

[11] Koren, Y., Bell, R., & Volinsky, C. (2009). Matrix factorization techniques for recommender systems. Computer, 42(8), 30–37.

[12] Miller, E. (2009). How Not To Sort By Average Rating. evanmiller.org.

[13] Wilson, E. B. (1927). Probable inference, the law of succession, and statistical inference. Journal of the American Statistical Association, 22(158), 209–212.

[14] Zervas, G., Proserpio, D., & Byers, J. W. (2017). The rise of the sharing economy: Estimating the impact of Airbnb on the hotel industry. Journal of Marketing Research, 54(5), 687–705.

Temas relacionados
ChambitMachine LearningBayesianScoringGeoespacial