ホームページ >バックエンド開発 >C++ >C++ 開発におけるデータ正規化例外に対処する方法

C++ 開発におけるデータ正規化例外に対処する方法

WBOY
WBOYオリジナル
2023-08-22 14:06:211565ブラウズ

C++ 開発におけるデータ正規化例外に対処する方法

C 開発でデータ正規化例外に対処する方法

概要:

C 開発では、データ正規化は一般的に使用されるデータ処理テクノロジです。特定の範囲内でデータを均等に分散し、モデルのパフォーマンスを向上させます。ただし、データの正規化中に、データの分布が集中しすぎたり、外れ値が大きすぎたりするなど、異常な状況が発生し、正規化の結果が不十分になる場合があります。この記事では、C開発におけるデータ正規化異常への対処方法を紹介します。

1. データ正規化の基本原理

データ正規化とは、データを指定された範囲にマッピングすることです。一般的な正規化方法には、線形正規化、Z スコア正規化、正則化などが含まれます。その中で、線形正規化は最も一般的に使用される方法であり、データを [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. アプリケーション例

以下は、分位点ベースの正規化方法を使用したアプリケーション例です。

#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.00402931 0.00483516 0.00564102 0.00644688 0.00725273 0.99838

分位点ベースの正規化処理を行うと、よりデータの分布に適した正規化結果が得られることがわかります。

以上がC++ 開発におけるデータ正規化例外に対処する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。