5000만 포인트 산점도 완벽 다운샘플링을 위한 매트릭스 필터
유정 압력 데이터 5천만 포인트를 렌더링할 때 매트릭스 필터는 100% 커버리지와 시각적 충실도를 제공합니다. 기존 알고리즘(LTTB 등)은 데이터 밀도 최대 59% 손실. 이 방법은 정렬 없이 단일 패스로 작동하며, 출력은 화면 픽셀 수로 제한됩니다.
산점도는 불규칙 데이터와 간극에 필수적입니다: 선 그래프는 단절을 왜곡하고 클러스터를 숨깁니다. 기존 방법은 선 차트에 최적화되어 2D 구조를 간과합니다.
기존 알고리즘의 한계
MinMax, M4, LTTB, 하이브리드는 X축을 빈으로 나누고 빈당 1~4개 Y 포인트를 선택합니다. 밀집 열에서 96~99% 데이터 손실: 구름이 극단으로 붕괴됩니다.
- MinMax: 최소/최대 — 피크는 잡지만 분포 무시.
- M4: 처음/마지막/최소/최대 — 선 그래프에 픽셀 퍼펙트.
- LTTB: 최대 삼각형 면적 — 곡선 실루엣.
- MinMaxLTTB: 극단 고정 후 스무딩.
산점도에서 치명적 결함: 빈 내 Y 좌표 무시.
매트릭스 필터 원리
그래픽스의 Voxel Grid Filter와 유사: 포인트를 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만~5천만+ 포인트. 산점(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%.
| 알고리즘 | 평균 출력 | 총 ms | 커버 | 정밀 | 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만~5천만 포인트에서 Matrix는 ~ms/1만 포인트로 시각 100% 유지. LTTB는 밀집 데이터에서 커버리지 16~40% 급락.
주요 결론
- 매트릭스 필터: 정렬 없이 픽셀 퍼펙트 산점도, O(n) 시간.
- 기존 알고리즘: 넉넉한 예산에도 밀집 구름 구조 손실.
- ±1px 시각 점수: Matrix 800×600은 풀 렌더와 구분 불가.
- 시각화 전용: 선/통계는 별도 방법.
- 불규칙 간극 산업 유전 데이터셋 테스트.
— Editorial Team
아직 댓글이 없습니다.