>백엔드 개발 >C++ >C++ 개발에서 데이터 정규화 예외를 처리하는 방법

C++ 개발에서 데이터 정규화 예외를 처리하는 방법

WBOY
WBOY원래의
2023-08-22 14:06:211586검색

C++ 개발에서 데이터 정규화 예외를 처리하는 방법

C++ 개발에서 데이터 정규화 예외를 처리하는 방법

개요:

C++ 개발에서 데이터 정규화는 일반적으로 사용되는 데이터 처리 기술로, 특정 범위 분포 내에서 데이터 균형을 유지하여 모델 성능을 향상시킬 수 있습니다. 그러나 때로는 데이터 정규화 중에 데이터 분포가 너무 집중되어 있거나 이상값이 너무 커서 정규화 결과가 좋지 않은 등 비정상적인 상황이 발생합니다. 이 기사에서는 C++ 개발에서 데이터 정규화 예외를 처리하는 방법을 소개합니다.

1. 데이터 정규화의 기본 원칙

데이터 정규화는 데이터를 지정된 범위로 매핑하는 것입니다. 일반적인 정규화 방법에는 선형 정규화, Z-점수 정규화, 정규화 등이 있습니다. 그 중 선형 정규화(Linear Normalization)가 가장 일반적으로 사용되는 방법으로 데이터를 [0, 1] 범위로 스케일링합니다. 선형 정규화를 구현하는 코드는 다음과 같습니다.

double linear_normalize(double x, double min_value, double max_value) {
    return (x - min_value) / (max_value - min_value);
}

2. 비정상적인 데이터 정규화 문제 분석

데이터의 분포가 치우쳐 있거나 특정 구간에 너무 집중된 경우 선형 정규화를 사용하면 정규화가 발생할 수 있습니다. 통일된 데이터 분포가 고르지 않습니다. 예상한 결과를 얻을 수 없습니다. 또한 데이터 세트에 이상값이 있는 경우 정규화 결과에 추가 영향을 미칩니다.

예를 들어 다음 데이터 세트의 경우:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 100}

선형 정규화를 사용한 후의 결과는 다음과 같습니다.

{0, 0.011 , 0.022, 0.033, 0.044, 0.055, 0.066, 0.077, 0.088, 1}

이상치 100의 존재로 인해 다른 데이터가 [0, 1] 사이에 너무 집중되어 있고 100은 멀리 떨어져 있음을 알 수 있습니다. 다른 데이터에서 .

3. 데이터 정규화 이상을 처리하는 방법

  1. 분위수 기반 정규화 방법

데이터 집합의 이상값 문제를 해결하기 위해 분위수 기반 정규화 방법을 사용할 수 있습니다. 이 방법은 먼저 데이터 세트에서 이상값을 제거한 다음 이를 정규화합니다. 구체적인 단계는 다음과 같습니다.

(1) 데이터 세트의 상위 사분위수(Q3)와 하위 사분위수(Q1)를 계산합니다.

(2) 데이터 세트의 내부 거리(IQR), 즉 IQR = Q3 - Q1을 계산합니다.

(3) 위 공식에 따라 데이터 세트에서 Q1-1.5IQR보다 작고 Q3+1.5IQR보다 큰 이상값을 제거합니다.

(4) 이상값을 제거한 후 데이터를 선형 정규화합니다.

참조 코드는 다음과 같습니다.

vector<double> quantile_normalize(vector<double> data) {
    sort(data.begin(), data.end());
    int n = data.size();
    double q1 = data[(n - 1) / 4];
    double q3 = data[(3 * (n - 1)) / 4];
    double iqr = q3 - q1;
    
    vector<double> normalized_data;
    for (double x : data) {
        if (x < q1 - 1.5 * iqr || x > q3 + 1.5 * iqr) {
            continue;
        }
        double normalized_x = linear_normalize(x, q1 - 1.5 * iqr, q3 + 1.5 * iqr);
        normalized_data.push_back(normalized_x);
    }
    
    return normalized_data;
}
  1. 비선형 정규화 방법

선형 정규화 외에도 로그 정규화 또는 지수 정규화와 같은 비선형 정규화 방법을 사용해 볼 수도 있습니다. 이러한 방법은 데이터의 분포 특성에 더 잘 적응하기 위해 데이터를 비선형적으로 확장할 수 있습니다.

double log_normalize(double x, double base) {
    return log(x) / log(base);
}

double exp_normalize(double x, double base) {
    return pow(base, x);
}

4. 예제 응용

다음은 Quantile 기반 정규화 방법을 사용한 예제 응용 프로그램입니다.

#include 
#include 
#include 

using namespace std;

double linear_normalize(double x, double min_value, double max_value) {
    return (x - min_value) / (max_value - min_value);
}

vector<double> quantile_normalize(vector<double> data) {
    sort(data.begin(), data.end());
    int n = data.size();
    double q1 = data[(n - 1) / 4];
    double q3 = data[(3 * (n - 1)) / 4];
    double iqr = q3 - q1;
    
    vector<double> normalized_data;
    for (double x : data) {
        if (x < q1 - 1.5 * iqr || x > q3 + 1.5 * iqr) {
            continue;
        }
        double normalized_x = linear_normalize(x, q1 - 1.5 * iqr, q3 + 1.5 * iqr);
        normalized_data.push_back(normalized_x);
    }
    
    return normalized_data;
}

int main() {
    vector data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 100};
    vector normalized_data = quantile_normalize(data);
    
    cout << "原始数据:" << endl;
    for (double x : data) {
        cout << x << " ";
    }
    cout << endl;
    
    cout << "归一化后的数据:" << endl;
    for (double x : normalized_data) {
        cout << x << " ";
    }
    cout << endl;
    
    return 0;
}

출력 결과는 다음과 같습니다.

원본 데이터:
1 2 3 4 5 6 7 8 9 100
정규화된 데이터:
0.000805859 0.00161172 0.00241759 0.00322345 0.00 402931 0.00483516 0.00564102 0.00644688 0.00725273 0.99838

Quantile 이후에 보면 알 수 있습니다. 정규화를 통해 데이터 분포에 더 적합한 정규화된 결과를 얻을 수 있습니다.

위 내용은 C++ 개발에서 데이터 정규화 예외를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.