跳到主要内容
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;
}

向 AI 提问(基于本文内容)

评论