在机器学习中,对数据进行归一化处理是一种常用的技术。
将数据从各种各样分布调整为平均值为 0、方差为 1 的标准分布,在很多情况下都可以有效地加速模型的训练。
这里假定需要处理的数据为 n n n 个整数 a 1 , a 2 , ⋅ ⋅ ⋅ , a n a_1,a_2,···,a_n a1,a2,⋅⋅⋅,an。
这组数据的平均值:
a ˉ = a 1 + a 2 + ⋅ ⋅ ⋅ + a n n \bar{a}=\frac{a_1+a_2+···+a_n}{n} aˉ=na1+a2+⋅⋅⋅+an
方差:
D ( a ) = 1 n ∑ i = 1 n ( a i − a ) 2 D(a)=\frac{1}{n} \displaystyle\sum_{i=1}^n{({a_i}-a)}^2 D(a)=n1i=1∑n(ai−a)2
使用如下函数处理所有数据,得到的 n n n 个浮点数 f ( a 1 ) , f ( a 2 ) , ⋅ ⋅ ⋅ , f ( a n ) f(a_1),f(a_2),···,f(a_n) f(a1),f(a2),⋅⋅⋅,f(an) 即满足平均值为 0 且方差为 1:
f ( a i ) = a i − a ˉ D ( a ) f(a_i)=\frac{a_i-\bar{a}}{\sqrt{D(a)}} f(ai)=D(a)ai−aˉ
从标准输入读入数据。
第一行包含一个整数 n n n,表示待处理的整数个数。
第二行包含空格分隔的 n n n 个整数,依次表示 a 1 , a 2 , ⋅ ⋅ ⋅ , a n a_1,a_2,···,a_n a1,a2,⋅⋅⋅,an。
输出到标准输出。
输出共 n n n 行,每行一个浮点数,依次表示按上述方法归一化处理后的数据 f ( a 1 ) , f ( a 2 ) , ⋅ ⋅ ⋅ , f ( a n ) f(a_1),f(a_2),···,f(a_n) f(a1),f(a2),⋅⋅⋅,f(an)。
7
-4 293 0 -22 12 654 1000
-0.7485510379073613
0.04504284674812264
-0.7378629047806881
-0.7966476369773906
-0.7057985054006686
1.0096468614303775
1.9341703768876082
平均值: a ˉ ≈ 276.14285714285717 \bar{a}\approx 276.14285714285717 aˉ≈276.14285714285717
方差: D ( a ) ≈ 140060.69387755104 D(a)\approx 140060.69387755104 D(a)≈140060.69387755104
标准差: D ( a ) ≈ 374.24683549437134 \sqrt{D(a)}\approx 374.24683549437134 D(a)≈374.24683549437134
全部的测试数据保证 n , ∣ a i ∣ ≤ 1000 n,|a_i| \leq 1000 n,∣ai∣≤1000,其中 ∣ a i ∣ |a_i| ∣ai∣ 表示 a i a_i ai 的绝对值。
且输入的 n n n 个整数 a 1 , a 2 , ⋅ ⋅ ⋅ , a n a_1,a_2,···,a_n a1,a2,⋅⋅⋅,an 满足:方差 D ( a ) ≥ 1 D(a) \geq 1 D(a)≥1。
如果你输出的每个浮点数与参考结果相比,均满足绝对误差不大于 1 0 − 4 10^{-4} 10−4,则该测试点满分,否则不得分。
printf("%f", x);$$'
进行输出。print(x)
进行输出即可。System.out.print(x);
进行输出。#include
using namespace std;
int main(){
//输入
int n;
cin >> n;
vector<int>a(10001); //动态数组a[i],输入的都是整数
for(int i = 0; i < n; i++){
cin >> a[i];
}
//前置公式计算(求和、方差)
double sum = 0; //和
for(int i = 0; i < n; i++){
sum += a[i]; //求和的计算公式
}
double D = 0; //方差
for(int i = 0; i < n; i++){
D += (a[i] - sum / n) * (a[i] - sum / n); //求方差的计算公式
}
//归一化计算
vector<double>f(10001); //动态数组f[i],输出的都是浮点数
for(int i = 0; i < n; i++){
f[i] = (a[i] - sum / n) / (sqrt(D / n)); //归一化计算公式
}
//输出
for(int i = 0; i < n; i++){
cout << fixed << setprecision(16) << f[i] << endl; //固定保留16位小数
}
return 0;
}
上述代码主要实现了一组数据的归一化处理。归一化是一种数据预处理方法,目的是将原始数据变换到同一量度标准下,常用于机器学习、数据分析、统计学等领域中。本题需要学会的考点是求和、求方差的计算方法以及归一化的运算过程,这种处理在数据预处理中及其常见,同时要注意双精度变量的定义。