# Filtro de Matriz para Muestreo Perfecto por Píxeles en Diagramas de Dispersión con 50M de Puntos
El filtro de matriz ofrece cobertura del 100% y fidelidad visual al renderizar 50 millones de puntos de presión de pozos petroleros. Algoritmos tradicionales como LTTB pierden hasta el 59% de la densidad de datos. Este método funciona en un solo pase sin ordenar, limitando la salida al número de píxeles de la pantalla.
Los diagramas de dispersión son esenciales para datos irregulares con huecos: las líneas distorsionan las rupturas y ocultan clusters. Los métodos estándar están optimizados para gráficos de líneas, ignorando la estructura 2D.
Limitaciones de los Algoritmos Tradicionales
MinMax, M4, LTTB y sus híbridos dividen el eje X en bins y seleccionan 1–4 puntos Y por bin. En columnas densas, eliminan el 96–99% de los datos: las nubes se reducen a extremos.
- MinMax: mínimo y máximo — captura picos pero ignora la distribución.
- M4: primero, último, min/max — perfecto por píxeles para líneas.
- LTTB: área de triángulo más grande — silueta de curva.
- MinMaxLTTB: fija extremos, luego suaviza.
Para diagramas de dispersión, este es un defecto fundamental: los algoritmos ignoran las coordenadas Y dentro de los bins.
Principio del Filtro de Matriz
Similar al Filtro de Rejilla de Vóxeles en gráficos: proyecta puntos en una rejilla de píxeles W×H. Un punto por celda en orden de recorrido.
public static void downsample(
double[] times, double[] values,
int width, int height,
List<double[]> result) {
int n = times.length;
if (n == 0) return;
// Paso 1: límites
double tMin = times[0], tMax = times[0];
double vMin = values[0], vMax = values[0];
for (int i = 1; i < n; i++) {
if (times[i] < tMin) tMin = times[i];
if (times[i] > tMax) tMax = times[i];
if (values[i] < vMin) vMin = values[i];
if (values[i] > vMax) vMax = values[i];
}
double tRange = Math.max(tMax - tMin, 1e-10);
double vRange = Math.max(vMax - vMin, 1e-10);
// Paso 2: rejilla
boolean[] grid = new boolean[width * height];
// Paso 3: filtro
for (int i = 0; i < n; i++) {
int px = (int) Math.min(width - 1, (times[i] - tMin) / tRange * (width - 1));
int py = (int) Math.min(height - 1, (values[i] - vMin) / vRange * (height - 1));
int idx = py * width + px;
if (!grid[idx]) {
grid[idx] = true;
result.add(new double[]{times[i], values[i]});
}
}
}
El método imita el renderizado: ilumina píxeles que brillarían con el conjunto completo. Es estrictamente para visualización, no para estadísticas.
Metodología de Pruebas
~3000 conjuntos de datos de telemetría de pozos: de 19k a 50M+ puntos. Comparación píxel por píxel con originales en modos dispersión (2×2px) y líneas (1px).
Métricas:
- Cobertura: % de píxeles originales cubiertos por el algoritmo.
- Precisión: % de píxeles del algoritmo presentes en el original.
- F1-score: media armónica.
- Puntuación Visual: F1 con tolerancia ±1px (considerando subpíxeles).
Algoritmos clásicos con presupuesto para igualar salida de MatrixFilter a 1920×1080. Benchmark: i7-7700K, Java 17, un solo hilo.
Resultados en Datos Reales
Regulares (~20k puntos, 2930 archivos)
Dispersión: MatrixFilter 1920×1080 — 100% en todas las métricas. MatrixFilter 800×600 — Visual 99.6%, mitad de puntos. Clásicos: Cobertura 63–84%, Visual 76–95%.
| Algoritmo | Salida Prom. | ms Total | Cobert. | Prec. | F1 | Visual |
|------------------|--------------|----------|---------|-------|------|--------|
| Matrix 1920×1080 | 4939 | 695 | 100% | 100% | 100% | 100% |
| Matrix 800×600 | 2867 | 497 | 84.6% | 100% | 91.5%| 99.6% |
| MinMaxLTTB x4 | 4932 | 494 | 84.1% | 100% | 90.9%| 95.2% |
Medianos y Grandes
Con 500k–50M puntos, Matrix mantiene 100% Visual en ~ms/10k puntos. LTTB cae a 16–40% Cobertura en datos densos.
Conclusiones Clave
- El filtro de matriz ofrece dispersión perfecta por píxeles sin ordenar, tiempo O(n).
- Algoritmos tradicionales pierden estructura de nubes densas, incluso con presupuestos generosos.
- Puntuación Visual con ±1px coincide con la percepción: Matrix 800×600 es indistinguible del renderizado completo.
- Estrictamente para visuales: usa otros métodos para líneas/estadísticas.
- Probado en datasets industriales de campos petroleros con huecos irregulares.
— Editorial Team
Aún no hay comentarios.