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) データ セットの上位四分位 (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; }
線形正規化に加えて、非線形正規化を使用することもできます。対数正規化や指数正規化などの方法。これらの方法では、データを非線形にスケーリングして、データの分布特性に適切に適応できます。
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 サイトの他の関連記事を参照してください。