矩阵滤波器:5000万点散点图像素级完美降采样
矩阵滤波器在渲染油井5000万个压力点时,实现100%覆盖率和视觉保真度。传统算法如LTTB会丢失高达59%的数据密度。该方法单次遍历、无需排序,输出严格限制在屏幕像素数量。
散点图适合处理带有间隙的不规则数据:折线图会扭曲断点并隐藏簇。标准方法针对折线图优化,忽略二维结构。
传统算法的局限性
MinMax、M4、LTTB及其混合方法对X轴分箱,每箱仅选1-4个Y点。在密集列中,它们丢弃96-99%数据:点云坍缩为极值。
- MinMax:最小值和最大值——捕捉峰值但忽略分布。
- M4:首尾、最小/最大——适合折线图像素级精确。
- LTTB:最大三角形面积——曲线轮廓。
- MinMaxLTTB:锁定极值后平滑。
对散点图而言,这是核心缺陷:算法忽略箱内Y坐标。
矩阵滤波器原理
类似于图形学中的体素网格滤波:将点投影到W×H像素网格上。遍历顺序下,每个单元格保留一个点。
public static void downsample(
double[] times, double[] values,
int width, int height,
List<double[]> result) {
int n = times.length;
if (n == 0) return;
// Step 1: bounds
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);
// Step 2: grid
boolean[] grid = new boolean[width * height];
// Step 3: filter
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]});
}
}
}
该方法模拟渲染过程:点亮完整数据集下会发光的像素。仅用于可视化,非统计用途。
测试方法
约3000个井下测井数据集:1.9万至5000万+点。像素级对比原始散点图(2×2px)和折线图(1px)模式。
指标:
- 覆盖率:算法覆盖原始像素的百分比。
- 精确率:算法像素在原始中的百分比。
- F1分数:调和平均数。
- 视觉分数:±1px容差的F1(考虑亚像素)。
经典算法预算匹配MatrixFilter在1920×1080的输出。基准:i7-7700K、Java 17、单线程。
真实数据结果
常规规模(~2万点,2930个文件)
散点图: MatrixFilter 1920×1080——所有指标100%。MatrixFilter 800×600——视觉99.6%,点数减半。经典算法:覆盖率63-84%,视觉76-95%。
| 算法 | 平均输出 | 总毫秒 | 覆盖率 | 精确率 | F1 | 视觉 |
|------------------|----------|--------|--------|--------|------|--------|
| 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% |
中大规模
在50万-5000万点上,Matrix保持100%视觉分数,~ms/万点。LTTB在密集数据上覆盖率降至16-40%。
关键要点
- 矩阵滤波器无需排序、O(n)时间,实现散点图像素级完美。
- 传统算法丢失密集点云结构,即使预算充足。
- ±1px视觉分数匹配感知:Matrix 800×600与全渲染无异。
- 仅限可视化:折线/统计用其他方法。
- 在工业油田不规则间隙数据集上验证。
— Editorial Team
暂无评论。