对于具有不同量级或不同单位的数据,在进行数理统计之前,往往需要进行处理,使数据在更平等的条件下进行分析。这里主要介绍数据的标准化和归一化。[大谦MATLAB,dqmatlab点com]
标准化
假设xi为原观测值,\(\overline{X}\)为数据均值,S为标准差,则标准化后的观测值xi'为
\({x}_{i}^{ }=\frac{{x}_{i}-\overline{x}}{S}=\frac{{x}_{i}-\overline{x}}{\sqrt{\frac{\sum_{i=1}^{n} {({x}_{i}-\overline{X})}}{n-1}}}\), (1-1)
其中\(\overline{X}\)为样本均值。如果对总体数据进行标准化,则公式1-1中,\(\overline{X}\)换为总体均值,n-1换为n即可。
在MATLAB中用zscore函数实现数据的标准化。该函数的调用格式为:
Z = zscore(X) 返回X每个元素的z得分,X每列数据的均值为0,标准差为1。Z与X大小相同。
Z = zscore(X,flag) 使用flag标示的标准差对X进行标准化。如果flag为0(默认),则函数使用样本的标准差对X进行标准化,计算标准差的公式里面,除数取n-1。zscore(X,0)与zscore(X)等价。如果flag为1,函数使用总体的标准差对X进行标准化,计算标准差的公式里面,除数取n。
Z = zscore(X,flag,dim) 按照指定的维进行标准化。如果dim=1,对X的列数据进行标准化,如果dim=2,对X的行数据进行标准化。
[Z,mu,sigma] = zscore(___) 还返回均值mu和标准差sigma。
下面产生一个5行3列的随机数矩阵,然后用zscore函数对每列数据进行标准化。
>> A = rand(5,3)
A =
0.5328 0.6225 0.2305
0.3507 0.5870 0.8443
0.9390 0.2077 0.1948
0.8759 0.3012 0.2259
0.5502 0.4709 0.1707
>> B=zscore(A)
B =
-0.4697 1.0277 -0.3584
-1.2012 0.8304 1.7824
1.1621 -1.2813 -0.4829
0.9088 -0.7607 -0.3743
-0.4000 0.1839 -0.5668
>> mean(B)
ans =
1.0e-16 *
-0.5551 0.2776 -0.8882
>> std(B)
ans =
1.0000 1.0000 1.0000
B为标准化以后生成的矩阵,用mean函数和std函数计算每列的均值和标准差。
归一化
假设xi为原观测值,xmax为最大值,xmin为最小值,则归一化后的观测值为
归一化以后的数据介于0~1之间,常常根据需要映射到-1~1之间或0~255之间。
在MATLAB中,如果安装了神经网络工具箱,可以用mapminmax函数实现数据的极差标准化。该函数的调用格式为:
[Y,PS] = mapminmax(X,YMIN,YMAX)
对X每行的数据进行极差标准化。YMIN和YMAX分别为Y每行生成值的最小值和最大值,默认值分别为-1和1。
下面产生一个3行5列的随机数矩阵,然后用mapminmax函数对每列数据进行标准化。
>> A = rand(3,5)
A =
0.7112 0.2967 0.5079 0.8010 0.7303
0.2217 0.3188 0.0855 0.0292 0.4886
0.1174 0.4242 0.2625 0.9289 0.5785
>> [B,PS]=mapminmax(A)
B =
0.6439 -1.0000 -0.1625 1.0000 0.7197
-0.1618 0.2606 -0.7549 -1.0000 1.0000
-1.0000 -0.2439 -0.6424 1.0000 0.1365
PS =
name: 'mapminmax'
xrows: 3
xmax: [3x1 double]
xmin: [3x1 double]
xrange: [3x1 double]
yrows: 3
ymax: 1
ymin: -1
yrange: 2
gain: [3x1 double]
xoffset: [3x1 double]
no_change: 0
B矩阵是极差标准化后生成的矩阵,mapminmax函数对每行数据进行计算,默认时生成的值介于-1和1之间。也可以按照语法介绍,指定生成的值的最小值和最大值。