Outlier Handling (Data fitting)

  • 최초 작성일: 2023년 6월 9일 (금)

목차

[TOC]


내용

1차원 데이터를 최대한 Outlier를 제거하여 부드럽게 피팅하고자 여러 가지 방법을 사용해보았다.


코드

선형 보간법

std::vector<float> handleOutliers(const std::vector<float>& values, int windowSize, float threshold) {
    int size = values.size();
    std::vector<float> smoothedValues = values;

    for (int i = 0; i < size; ++i) {
        float sum = 0;
        int count = 0;

        for (int j = std::max(0, i - windowSize); j <= std::min(size - 1, i + windowSize); ++j) {
            sum += values[j];
            ++count;
        }

        float mean = sum / count;

        if (std::abs(values[i] - mean) > threshold) {
            // Outlier를 찾았으므로 선형 보간법으로 대체
            float prevValue = (i > 0) ? values[i - 1] : values[i];
            float nextValue = (i < size - 1) ? values[i + 1] : values[i];
            smoothedValues[i] = (prevValue + nextValue) / 2.0f;
        }
    }

    return smoothedValues;
}


이동 평균

std::vector<float> handleOutliers(const std::vector<float>& values, int windowSize, float threshold) {
    int size = values.size();
    std::vector<float> smoothedValues = values;
    
    std::vector<float> movingAverages(size);
    for (int i = 0; i < size; ++i) {
        float sum = 0;
        int count = 0;

        for (int j = std::max(0, i - windowSize); j <= std::min(size - 1, i + windowSize); ++j) {
            sum += values[j];
            ++count;
        }

        movingAverages[i] = sum / count;
    }

    for (int i = 0; i < size; ++i) {
        if (std::abs(values[i] - movingAverages[i]) > threshold) {
            // Outlier를 찾았으므로 이동평균으로 대체
            smoothedValues[i] = movingAverages[i];
        }
    }

    return smoothedValues;
}