在此我将主要编译两种数据的标准化方法。
1.极差标准化处理
(1)、采用公式很简单,以下:
(2)、话很少说,上代码:ios
#include <iostream> #define n 3//实际问题需改动 #define m 5//实际问题需改动 void max(float a[][n], float b[], float c[]); int main() { FILE* fpr, * fpw; fopen_s(&fpr, "1.txt", "r"); fopen_s(&fpw, "2.txt", "w"); float a[m][n], b[n][m], minn[n], maxx[n]; for (int i = 0; i < m; i++)//读取数据 for (int j = 0; j < n; j++) fscanf_s(fpr, "%f", &a[i][j]); for (int j = 0; j < n; j++)//针对问题需改动,此示例问题全部数据均为逆指标(取倒数) for (int i = 0; i < m; i++) a[i][j] = 1.0 / a[i][j]; max(a, maxx, minn);//求最值 for (int j = 0; j < n; j++)//极差标准化处理 for (int i = 0; i < m; i++) a[i][j] = (a[i][j] - minn[j]) / (maxx[j] - minn[j]); for (int j = 0; j < m; j++)//输出结果 { for (int i = 0; i < n; i++) fprintf(fpw,"%f ", a[j][i]); fprintf(fpw, "\n"); } return 0; } void max(float a[][n], float b[], float c[])//求最大及最小值 { for (int i = 0; i < n; i++) b[i] = c[i] = a[0][i]; for (int j = 0; j < n; j++) for (int i = 0; i < m; i++) { if (a[i][j] > b[j]) b[j] = a[i][j]; if (a[i][j] < c[j]) c[j] = a[i][j]; } }
2.z-score 0均值标准化
(1)、公式以下所示(x是原始数据,u是样本均值,σ是样本标准差):
(2)、源代码(emmmmm由于嫌麻烦因此就只写了核心代码):web
for (int j = 0; j < n; j++)//求各列之和 for (int i = 0; i < m; i++) sum += a[i][j]; aver = sum / (n * m); for (int j = 0; j < n; j++) for (int i = 0; i < m; i++) c += abs((a[i][j] - aver) * (a[i][j] - aver) / (n * m)); r = sqrt(c);//标准差求解 for (int j = 0; j < n; j++)//归一化处理(z-score 0均值标准化) for (int i = 0; i < m; i++) a[i][j] = (a[i][j]-aver) / r;