CCF-CSP 202206-1 归一化处理

CCF-CSP 202206-1 归一化处理

  • 题目要求
    • ‍⬛题目背景
    • ‍⬛问题描述
    • ‍⬛输入格式
    • ‍⬛输出格式
    • ‍⬛样例说明
      • 样例输入
      • 样例输出
      • 样例解释
    • ‍⬛子任务
    • ‍⬛评分方式
    • ‍⬛提示
  • 问题解决
    • 满分代码(含逐行代码解释)
      • C++
    • 场景拓展

题目要求

‍⬛题目背景

在机器学习中,对数据进行归一化处理是一种常用的技术。
将数据从各种各样分布调整为平均值为 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=1n(aia)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) aiaˉ

‍⬛输入格式

从标准输入读入数据。

第一行包含一个整数 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,ai1000,其中 ∣ 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} 104,则该测试点满分,否则不得分。

‍⬛提示

  • C/C++:建议使用 double 类型存储浮点数,并使用 printf("%f", x);$$' 进行输出。
  • Python:直接使用 print(x) 进行输出即可。
  • Java:建议使用 double 类型存储浮点数,可以使用 System.out.print(x); 进行输出。

问题解决

满分代码(含逐行代码解释)

C++

#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; 
}

场景拓展

上述代码主要实现了一组数据的归一化处理。归一化是一种数据预处理方法,目的是将原始数据变换到同一量度标准下,常用于机器学习、数据分析、统计学等领域中。本题需要学会的考点是求和、求方差的计算方法以及归一化的运算过程,这种处理在数据预处理中及其常见,同时要注意双精度变量的定义。

你可能感兴趣的:(CCF-CSP,算法,c++,python)