查看原文
其他

脏数据-数据量纲差异

勾蒙蒙 R语言中文社区 2019-04-22

点击蓝字关注我们

作者:勾蒙蒙,R语言资深爱好者。

个人公众号:R语言及生态系统服务


我们在进行科学研究时,通常会收集到大量不同的指标变量,每个指标的性质、量纲等特征均存在着一定地差异,从而使得各指标之间不具有综合性,不能直接的进行综合分析,如在在进行主成分分析的时候,由于变量的量纲不同会使主成份得分系数的可解释性变差,使结果受到量纲大的变量影响,而忽略量纲较小的变量。因此,数据处理的前期除了数据清洗,离群值处理等,往往还需要一些处理量纲差异的方法,将数据标准化


数据标准化将数据按比例缩放,使其落到一个小的特定空间,归一化是最典型的数据标准化处理方式,即将数据统一映射到[0,1]区间上,常用的方法有四种:min-max标准化、log函数转换、atan函数转换、z-score标准化。


以下用一组实例数据加以详细地介绍数据来源于科学网赖江山博士的博客(http://blog.sciencenet.cn/u/laijiangshan),数据为古田山24公顷样地内随机抽取40个20m×20m的样方中的环境因子,主要包含高程、凹凸度、坡度、坡向、土壤N、P、K、PH等指标。



1、min-max标准化

也叫离差标准化,对原数据进行线性变换,使结果落到[0,1]区间内

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

##min-max标准化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((Data[i,j]-(min(Data[,j])))/(max(Data[,j])-min(Data[,j])))

}

}

View(stddata)

此方法在计算生态系统服务权衡均方根偏差法(RMSD)的第一步会用到



2、log函数转换

很多人误认为是log10(x),其实不然,由此获得的结果并非都落到[0,1]区间上,其结果需除以log10(max),并且所有的数据都必须大于0。


##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##log函数转化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-(log(Data[i,j])/log(max(Data[,j])))

}

}

View(stddata)

There were 25 warnings (use warnings() to see them)##数据中存在负值


3、atan函数转换

适用于数据均大于0的情况,否则小于0的数据将会被映射到[-1,0]的区间上。

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##atan函数转化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((atan(Data[i,j])*2)/pi)

}

}

View(stddata)


4、z-score标准化

是指中心化后的数据除以数据集的标准差。R中自带有scale()函数,适用于最大值和最小值未知的情况,或者有超出范围离群数据的情况,其标准化后的数据符合标准正态分布,即均值为0,标准差为1,若数据大于0水平说明高于平均水平,小于0说明低于平均水平。


scale函数详解

scale(data,center=T/F,scale=T/F)

1)center和scale默认为真,即T或者TRUE

2)center为真表示数据中心化

3)scale为真表示数据标准化

##原理的代码

##读取数据

setwd("C:/Users/lx/Desktop")

Data<-read.table("gtsenv.txt",head=TRUE,sep="")

View(Data)

##z-score标准化

dim(Data)

stddata<-data.frame()

for (i in 1:dim(Data)[1]){

for (j in 1:dim(Data)[2]){

stddata[i,j]<-((Data[i,j]-(mean(Data[,j])))/sd(Data[,j]))

}

}

View(stddata)


结束语

总结而知新,通过上文的梳理,希望能帮助大家在数据分析前期对数据标准化意义以及R的实现有初步的了解。当然,世上也没有万能的“黄金法则”,对于标准化处理方法的选择,还需要自己针对数据实际,选取恰当准确的方法。




大家都在看

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)


公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存