1 Normalization Method(标准化 / 归一化)
1.1 归一化方法(Normalization Method)
把数变为(0,1)之间的小数
主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。把有量纲表达式变为无量纲表达式
归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
比如,复数阻抗可以归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。
另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。
1.2 标准化方法(Normalization Method)
数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。由于信用指标体系的各个指标度量单位是不同的,为了能够将指标参与评价计算,需要对指标进行规范化处理,通过函数变换将其数值映射到某个数值区间。一般常用的有以下几种方法。
-
(1) 最小-最大规范化对原始数据进行线性变换。假定MaxA与MinA分别表示属性A的最大与最小值。最小最大规范化通过计算将属性A的值映射到区间[a, b]上的v。一般来说,将最小-最大规范化在用于信用指标数据上,常用的有以下两种函数形式:
- a) 效益型指标(越大越好型)的隶属函数:
- b) 成本型指标(越小越好型)的隶属函数:
(2) z-score规范化也称零-均值规范化。属性A的值是基于A的平均值与标准差规范化。
(3) 小数定标规范化是通过移动属性A的小数点位置来实现的。小数点的移动位数依赖于A的最大绝对值。
问卷数据一般采用Z标准化方法:
即每一变量值与其平均值之差除以该变量的标准差。无量纲化后各变量的平均值为0,标准差为1,从而消除量纲和数量级的影响。该方法是目前多变量综合分析中使用最多的一种方法。在原始数据呈正态分布的情况下,利用该方法进行数据无量纲处理是较合理的。
2 用R、Stata实现标准化
2.1 Stata:
- 对单个变量的标准化:
egen newvar = std(oldvar)
生成的newvar的均数为0,SD为1
-
对多个变量的标准化:
如:对一堆变量(var1-var50)进行标准化- 用
foreach
命令进行循环操作 - 外部命令
center
- 用
ssc install center
center var1 var2 ... , prefix(z_) standardize
2.2 R语言:
2.2.1 数据中心化和标准化
数据的中心化
所谓数据的中心化是指数据集中的各项数据减去数据集的均值。
例如有数据集1, 2, 3, 6, 3,其均值为3,那么中心化之后的数据集为1-3,2-3,3-3,6-3,3-3,即:-2,-1,0,3,0数据的标准化
所谓数据的标准化是指中心化之后的数据在除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。
例如有数据集1, 2, 3, 6, 3,其均值为3,其标准差为1.87,那么标准化之后的数据集为(1-3)/1.87,(2-3)/1.87,(3-3)/1.87,(6-3)/1.87,(3-3)/1.87,即:-1.069,-0.535,0,1.604,0
数据中心化和标准化的意义是一样的,为了消除量纲对数据结构的影响。
2.2.2 具体操作
2.2.2.1 使用scale方法
在R语言中可以使用scale
方法来对数据进行中心化和标准化:
#限定输出小数点后数字的位数为3位
options(digits=3)
data <- c(1, 2, 3, 6, 3)
#数据中心化
scale(data, center=T,scale=F)
[,1] [1,] -2 [2,] -1 [3,] 0 [4,] 3 [5,] 0
attr(,"scaled:center") //显示均值
[1] 3
#数据标准化
scale(data, center=T,scale=T)
[,1] [1,] -1.06904 [2,] -0.53452 [3,] 0.00000 [4,] 1.60357 [5,] 0.00000
attr(,"scaled:center") //显示均值
[1] 3
attr(,"scaled:scale") //显示标准差
[1] 1.8708
scale方法中的两个参数center和scale的解释:
1.center和scale默认为真,即T或者TRUE
2.center为真表示数据中心化
3.scale为真表示数据标准化
2.2.2.2 更多方法
数据集
x<-cbind(c(1,2,3,4),c(5,5,10,20),c(3,6,9,12))
自己写标准化
x_min_temp<-apply(x,2,min)
x_min<-matrix(rep(x_min_temp,4),byrow=TRUE,ncol=3) #需要输入行数和列数
abs(x-x_min) #当前值减去均值
x_extreme_temp<-apply(x,2,max)-apply(x,2,min)
x_extreme<-matrix(rep(x_extreme_temp,4),byrow=TRUE,ncol=3) #需要输入行数和列数
abs(x-x_min)/x_extreme
sweep函数
center <- sweep(x, 2, apply(x, 2, min),'-') #在列的方向上减去最小值,不加‘-’也行
R <- apply(x, 2, max) - apply(x,2,min) #算出极差,即列上的最大值-最小值
x_star<- sweep(center, 2, R, "/") #把减去均值后的矩阵在列的方向上除以极差向量
sweep函数更简洁、易懂,且不需要输入行数和列数,二者性能也差不多
sweep再举一个例子:
m<-matrix(c(1:9),byrow=TRUE,nrow=3)
//第一行都加1,第二行都加4,第三行都加7
sweep(m, 1, c(1,4,7), "+")
scale函数,这个比较简单,不多说
scale(x, center = TRUE, scale = TRUE)
有些地方说归一化,有些地方说标准化。