0%
约 2 分钟
CSP 202206-1 归一化处理 C++ 100
题目
【题目背景】 在机器学习中,对数据进行归一化处理是一种常用的技术。 将数据从各种各样分布调整为平均值为0、方差为1的标准分布,在很多情况下都可以有效地加速模型的训练。
【问题描述】 这里假定需要处理的数据为n个整数a1,a2,···,an 这组数据的平均值:
$$ \bar{a}\mathrm{=}\frac{a_1+a_2+···+a_n}{n} $$
方差:
$$ D(a)=\frac{1}{n}\sum_{i=1}^{n}{(a_i-\bar{a})}^2 $$
使用如下函数处理所有数据,得到的n个浮点数f(a1),f(a2),···,f(an)即满足平均值为0且方差为1:
$$ f\left(a_i\right)=\frac{a_i-\bar{a}}{\sqrt{D(a)}} $$
【输入格式】 从标准输入读入数据。 第一行包含一个整数,表示待处理的整数个数。 第二行包含空格分隔的n个整数,依次表示a1,a2,···,an
【输出格式】 输出到标准输出。 输出共 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
代码
#include <bits/stdc++.h>
const int N=1005;
using namespace std;
int main()
{
int n;
int a[N];
double sum=0,avg=0;
double x,D,sumD;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
avg=sum/n;
for(int i=0;i<n;i++)
{
sumD+=pow(a[i]-avg,2);
}
D=pow(sumD/n,0.5);
for(int i=0;i<n;i++)
{
x=(a[i]-avg)/D;
printf("%f\n", x);
}
return 0;
}
评论