【题目背景】
在机器学习中,对数据进行归一化处理是一种常用的技术。
将数据从各种各样分布调整为平均值为0、方差为1的标准分布,在很多情况下都可以有效地加速模型的训练。
【问题描述】
这里假定需萎处理的数据为n个整教a1, a2,..., an。
这组数据的平均值:
方差:
使用如下函数处理所有数据,得到的 n 个浮点数f(a1),f(a2),…,f(an)即满足平均值为 0 且方差为 1 .
【输入形式】
从标准输入读入数据。
第一行包含一个整数n,表示待处理的整数个数.
第二行包含空格分隔的n个整数,依次表示a1, a2,..., an.
【输出形式】
输出到标准输出。
输出共n行,每行一个浮点数,依次表示按上述方法归一化处理后的数据f(a1),f(a2)…,f(an)。
【样例输入】
7
-4 293 0 -22 12 654 1000
【样例输出】
-0.7485510379073613
0.0450428467481226
-0.7378629047806881
-0.7966476369773906
-0.7057985054006686
1.0096468614303775
1.9341703768876082
【样例解释】
【子任务】
全部的测试数据保证ni|ai|≤1000,其中|ai|表示ai的绝对值。
且输入的n个整数a1, a2,… , an 满足:方差 D(a)≥1.
【评分方式】
如果你输出的每个浮点数与参考结果相比,均满足绝对误差不大子10-4,则该测试点满分,否则不得分。
【提示】
-
C/C++:建议使用 double 类型存储浮点数,并使用printf("%f", x): $$’进行输出。
-
Python:直接使用 print(x) 进行输出即可。
-
Java:建议使用 double 类型存储浮点数,可以使用 System. out. print(x): 进行输出。
思路很简单,直接用代码把题目的公式表示出来,只需要稍微注意一下输出结果的精度就好。
#include<bits/stdc++.h>
#define N 10000
using namespace std;
int main()
{
double n,a[N];
double s=0,aver;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
s+=a[i];
}
aver=s*1.0/n;
s=0.0;
for(int i=0;i<n;i++) s+=(a[i]-aver)*(a[i]-aver);
double dd=sqrt(s*1.0/n);
for(int i=0;i<n;i++)
{
printf("%.16lf\n",(a[i]-aver)*1.0/dd);
printf("\n");
}
return 0;
}