数据标准化 - 数据挖掘算法(1)
数据的标准化(Normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是0-1标准化和Z标准化。
由于不同变量样本常常具有不同的单位和不同大小的数量值。如第一个变量的单位是kg,第二个变量的单位是cm,在计算绝对距离时将出现将两个变量样本值绝对值之差相加的情况,这时两个绝对值的单位不一致(如,3kg+5cm=?),产生矛盾;不同样本数量值差异相差较大时,会使在计算出的关系系数中,不同变量所占的比重大不相同。例如如果第一个变量的数值在2%到4%之间,而第二个变量的数值范围都在1000与5000之间,第二个变量将决定关系系数;如果变量量纲相同、数量等级接近,变量样本间差异显著,对计算结果也会产生较大影响。为了消除量纲影响和数值大小的影响,故将数据标准化。
数据标准化的主要方法有归一化方法、中心化方法和定基比率法。
1、归一化方法
也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间。
设有样本\(X_1,X_2,\dots,X_n\),样本最大值为\(max(X_i)\),样本最小值为\(min(X_i)\),归一化公式为:
如果将分子改为\(max(X_i)-X_i\),则有归一化公式为:
数据归一化方法可以将样本数据压缩到0-1之间,消除了不同变量样本之间量纲和数量值得差异,使得不同变量样本具有可比性。缺点是极大、极小值差异过大,会导致被压缩的样本失真,从而无法反映该变量样本在计算有关距离或相似性时的真实作用。
例如,现有10名学生的数学成绩,
67, 74, 76, 65, 80, 72, 60, 77, 65, 78
最高分和最低分分别为80和60,依据归一化公式\(_{min}Y_i\),数据归一化为,
0.35, 0.7, 0.8, 0.25, 1, 0.6, 0, 0.85, 0.25, 0.9
如果这10名学生的数学成绩最低分60分变为40分,其他学生成绩不变,即,
67, 74, 76, 65, 80, 72, 40, 77, 65, 78
最高分和最低分分别为80和40,依据归一化公式\(_{min}Y_i\),数据归一化为,
0.675, 0.85, 0.9, 0.625, 1, 0.8, 0, 0.925, 0.625, 0.95
由于最小值的变化,转换后的数据序列中,除了最大、最小值对应的样本保持不变(仍为1、0)。较小样本对应的转换数据放大很多、较大样本对应的转换数据放大相对较少(最小成绩为60,65转为0.25、76转为0.8;最小成绩为30,65转为0.625、76转为0.9)。
样本全距过大,归一化后的数据间的差异性减小,计算有关距离或相似性的贡献降低。
在上面的实例中,可以改用公式\(_{max}Y_i\)进行归一化,结果如下:
原始样本数据 | 67 | 74 | 76 | 65 | 80 | 72 | 60 | 77 | 65 | 78 |
变化样本数据 | 67 | 74 | 76 | 65 | 80 | 72 | 40 | 77 | 65 | 78 |
原始转换数据 | 0.65 | 0.3 | 0.2 | 0.75 | 0 | 0.4 | 1 | 0.15 | 0.75 | 0.1 |
原始转换数据 | 0.325 | 0.15 | 0.1 | 0.375 | 0 | 0.2 | 1 | 0.075 | 0.375 | 0.05 |
总之,无论用那种归一化公式,样本中个别极端值都会对所有转换数据产生显著影响,在使用归一化标准化方法时需要注意。
\(_{min}Y_i\)函数代码
## 函数
webTJ.Datamining.getYmin(arr);
##参数
【arr】
【一维数组】
注:数据挖掘类函数为webTJ.Datamining
\(_{max}Y_i\)函数代码
## 函数
webTJ.Datamining.getYmax(arr);
##参数
【arr】
【一维数组】
代码样例
webTJ.clear();
var oArr=[67,74,76,65,80,72,60,77,65,78];
var oYmin=webTJ.Datamining.getYmin(oArr);
webTJ.display("Ymin = "+oYmin,0);
var oYmax=webTJ.Datamining.getYmax(oArr);
webTJ.display("Ymax = "+oYmax,0);
进行数据挖掘时,一般是对多维变量进行数据标准化处理,这时用二维数组描述的多维变量样本,对应多维数据归一化类函数为,
\(_{min}YS_i\)函数代码
## 函数
webTJ.Datamining.getYSmin(arrs);
##参数
【arrs】
【二维数组】
\(_{max}YS_i\)函数代码
## 函数
webTJ.Datamining.getYSmax(arrs);
##参数
【arrs】
【二维数组】
代码样例
webTJ.clear();
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oYSmin=webTJ.Datamining.getYSmin(oArrs);
webTJ.show(oYSmin,2);
var oYSmax=webTJ.Datamining.getYSmax(oArrs);
webTJ.show(oYSmax,2);
2、中心化方法
数据中心化方法也叫标准差标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1。
设有样本\(X_1,X_2,\dots,X_n\),样本平均数为\(\overline{X}\),样本标准差为\(\sigma\),中心化公式为:
如果利用\(3\sigma\)进行中心化,样本接近正态分布时,落在[-1,1]之间的概率是99.7%,在实际应用中可将落在[-1,1]区间之外的值均设成-1和1,以保证所有的数值均落在[-1,1]范围之内。中心化公式为:
当样本量较大时,个别极端值对样本转换产生的作用被大大消减。数据中心化方法可以将样本数据压缩到一定范围内,消除了不同变量样本之间量纲和数量值得差异,使得不同变量样本具有可比性。缺点是数据压缩范围难以确定。
一维数组中心化函数代码
## 函数
webTJ.Datamining.getYZarr(arr,k);
##参数
【arr,k】
【一维数组,k倍标准差】
注:k=1按1倍标准差中心化、k=3按3倍标准差中心化
代码样例
webTJ.clear();
var oArr=[67,74,76,65,80,72,60,77,65,78];
var oZarr=webTJ.Datamining.getYZarr(oArr,1);
webTJ.display("1倍标准差中心化 : "+oZarr,0);
oZarr=webTJ.Datamining.getYZarr(oArr,3);
webTJ.display("3倍标准差中心化 : "+oZarr,0);
对于多维变量进行数据标准化处理,用二维数组描述的多维变量样本,对应多维数据中心化类函数为,
二维数组中心化函数代码
## 函数
webTJ.Datamining.getYZarrs(arrs,k);
##参数
【arrs,k】
【二维数组,k倍标准差】
注:k=1按1倍标准差中心化、k=3按3倍标准差中心化
代码样例
webTJ.clear();
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oYZarrs=webTJ.Datamining.getYZarrs(oArrs,1);
webTJ.show(oYZarrs,2);
oYZarrs=webTJ.Datamining.getYZarrs(oArrs,3);
webTJ.show(oYZarrs,2);
3、定基比率法
定基比率法是选择一个适当的数(样本初始值、平均数、中位数、标准差或其它给定数值)为除数除以所有样本,以便消除量纲和样本数值的量级差别。
设有样本\(X_1,X_2,\dots,X_n\),基数为V,定基比率为,
定基比率法的优点是基数选择比较灵活,但数据压缩范围不宜确定。
一维数组定基比率法函数代码
## 函数
webTJ.Datamining.getYRate(arr,v);
##参数
【arr,v】
【一维数组,基数】
注:应根据样本计算出基数v,或先给定基数v
代码样例
webTJ.clear();
var oArr=[67,74,76,65,80,72,60,77,65,78];
var oArr1=oArr.slice(0); //复制数组
var oMedian=webTJ.Formula.getMedian(oArr);
var oRarr=webTJ.Datamining.getYRate(oArr1,oMedian);
webTJ.display("按中位数计算定基比率 : "+oRarr,0);
对于多维变量进行数据标准化处理,运用定基比率法时应首先计算数各样本列的计算,然后再对所有样本进行比率处理,函数及代码为,
二维数组比率法函数代码
## 函数
webTJ.Datamining.getYRates(arrs,crr);
##参数
【arrs,crr】
【二维数组,列基数值数组】
代码样例
webTJ.clear();
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oCols=oArrs[0].length; //获得数组列数
var oCrr=[]; //定义列基数数组
var oColData;
for (var i=0; i<oCols; i++) {
oColData=webTJ.Array.getColData(oArrs,i); //获得数组i列
oCrr[i]=webTJ.Formula.getMedian(oColData); //基数i列中位数
}
var oRarrs=webTJ.Datamining.getYRates(oArrs,oCrr); //按数组各列中位数计算比率
webTJ.show(oRarrs,2);
进行数据标准化处理方法灵活多样,建议运用正态中心化方法。
4、获得数组各列均值和样本标准差
二维数组各列均值和样本标准差函数代码
## 函数
webTJ.Datamining.getCMSD(arrs);
##参数
【arrs】
【二维数组】
代码样例
webTJ.clear();
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oCMSD=webTJ.Datamining.getCMSD(oArrs);
webTJ.show(oCMSD,2);
注:此函数计算学习样本各列数据的均值和样本标准差,用于测试样本的标准化
5、获得数组各列最大值和最小值
二维数组各列最大值和最小值函数代码
## 函数
webTJ.Datamining.getCExtremes(arrs);
##参数
【arrs】
【二维数组】
代码样例
webTJ.clear();
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oCExtremes=webTJ.Datamining.getCExtremes(oArrs);
webTJ.show(oCMSD,2);
注:此函数计算学习样本各列数据的最大值和最小值,用于测试样本的标准化
6、将数组按给定均值和样本标准差标准化
二维数组按给定均值和样本标准差标准化函数代码
## 函数
webTJ.Datamining.getSZarr(arrs,marrs);
##参数
【arrs,marrs】
【二维数组,数组各列均值和样本标准差标数组】
代码样例
webTJ.clear();
var oSarrs=[[75,90,93,79,76,37],[72,69,66,64,81,75],[87,49,70,50,88,56]];
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oCMSD=webTJ.Datamining.getCMSD(oArrs);
var oZrrs=webTJ.Datamining.getSZarr(oSarrs,oCMSD);
webTJ.show(oZrrs,2);
注:此段代码先计算学习样本oArrs各列均值和标准差数组oCMSD,再用oCMSD将测试样本oSarrs标准化
7、将数组按给定最大值和最小值标准化
二维数组按给定最大值和最小值标准化函数代码
## 函数
webTJ.Datamining.getSEarr(arrs,marrs,k);
##参数
【arrs,marrs,k】
【二维数组,数组各列最大值和最小值数组,最小或最大值标准化】
注:最小值标准化公式分子为样本值减最小值,k=0;最大值标准化公式分子为最大值减样本值,k=1
代码样例
webTJ.clear();
var oSarrs=[[75,90,93,79,76,37],[72,69,66,64,81,75],[87,49,70,50,88,56]];
var oStr="67,63,73,75,44,91|74,69,66,94,81,55|76,93,93,79,71,27|65,38,85,85,61,45|80,39,48,75,41,52|72,80,70,88,86,43|60,50,91,95,42,64|77,49,69,50,89,55|65,89,50,70,99,85|78,41,55,89,71,28";
var oArrs=webTJ.getArrs(oStr,"|",",");
oArrs=webTJ.Array.getQuantify(oArrs);
var oCExtremes=webTJ.Datamining.getCExtremes(oArrs);
var oSEarr=webTJ.Datamining.getSEarr(oSarrs,oCExtremes,0);
webTJ.show(oSEarr,2);
注:此段代码先计算学习样本oArrs各列最小值和最大值数组oCExtremes,再用oCExtremes将测试样本oSarrs标准化
代码窗口
注:可将例题实例代码复制、粘贴到“代码窗口”,点击“运行代码”获得计算结果(鼠标选择实例代码\(\rightarrow\)Ctrl+C:复制\(\rightarrow\)鼠标点击“代码窗口”使其获得焦点\(\rightarrow\)Ctrl+V:粘贴)
运行效果
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。