问题描述
试题编号: | 202206-1 |
试题名称: | 归一化处理 |
时间限制: | 500ms |
内存限制: | 512.0MB |
问题描述: | 题目背景在机器学习中,对数据进行归一化处理是一种常用的技术。 问题描述这里假定需要处理的数据为 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)。 样例输入 Data 样例输出 Data 样例解释平均值:a¯≈276.14285714285717 方差:D(a)≈140060.69387755104 标准差:D(a)≈374.24683549437134 子任务全部的测试数据保证 n,|ai|≤1000,其中 |ai| 表示 ai 的绝对值。 且输入的 n 个整数 a1,a2,⋯,an 满足:方差 D(a)≥1。 评分方式如果你输出的每个浮点数与参考结果相比,均满足绝对误差不大于 10−4,则该测试点满分,否则不得分。 提示
|
题解:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int a[1010];
int sum = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
sum += a[i];
}
double ax = 0;
ax = static_cast<double>(sum) / n; // 使用浮点数除法
double f[1010], temp = 0, d = 0;
// 计算 temp = 偏差平方和
for (int i = 0; i < n; i++)
{
temp += pow(a[i] - ax, 2);
}
d = sqrt(temp / n); // 计算标准差
// 计算归一化后的值
for (int i = 0; i < n; i++)
{
f[i] = (a[i] - ax) / d;
}
// 输出归一化后的值
for (int i = 0; i < n; i++)
{
printf("%.16f\n", f[i]);
}
return 0;
}