如何判别测量数据中是不是有异常ŀ
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判别测量数据中是不是有异常ŀ相关的知识,希望对你有一定的参考价值。
参考技术A异常值outlier:指样本中的个别值,其数值明显偏离它(或他们)所属样本的其余观测值,也称异常数据,离群值。
目前人们对异常值的判别与剔除主要采用物理判别法和统计判别法两种方法。
所谓物理判别法就是根据人们对客观事物已有的认识,判别由于外界干扰、人为误差等原因造成实测数据值偏离正常结果,在实验过程中随时判断,随时剔除。
统计判别法是给定一个置信概率,并确定一个置信限,凡超过此限的误差,就认为它不属于随机误差范围,将其视为异常值剔除。当物理识别不易判断时,一般采用统计识别法。
对于多次重复测定的数据值,异常值常用的统计识别与剔除法有:
拉依达准则法(3δ):简单,无需查表。测量次数较多或要求不高时用。是最常用的异常值判定与剔除准则。但当测量次数《=10次时,该准则失效。
如果实验数据值的总体x是服从正态分布的,则
式中,μ与σ分别表示正态总体的数学期望和标准差。此时,在实验数据值中出现大于μ+3σ或小于μ—3σ数据值的概率是很小的。因此,根据上式对于大于μ+3σ或小于μ—3σ的实验数据值作为异常值,予以剔除。具体计算方法参见http://202.121.199.249/foundrymate/lessons/data-analysis/13/131.htm
在这种情况下,异常值是指一组测定值中与平均值的偏差超过两倍标准差的测定值。与平均值的偏差超过三倍标准差的测定值,称为高度异常的异常值。在处理数据时,应剔除高度异常的异常值。异常值是否剔除,视具体情况而定。在统计检验时,指定为检出异常值的显著性水平α=0.05,称为检出水平;指定为检出高度异常的异常值的显著性水平α=0.01,称为舍弃水平,又称剔除水平(reject level)。
标准化数值(Z-score)可用来帮助识别异常值。Z分数标准化后的数据服从正态分布。因此,应用Z分数可识别异常值。我们建议将Z分数低于-3或高于3的数据看成是异常值。这些数据的准确性要复查,以决定它是否属于该数据集。
肖维勒准则法(Chauvenet):经典方法,改善了拉依达准则,过去应用较多,但它没有固定的概率意义,特别是当测量数据值n无穷大时失效。
狄克逊准则法(Dixon):对数据值中只存在一个异常值时,效果良好。担当异常值不止一个且出现在同侧时,检验效果不好。尤其同侧的异常值较接近时效果更差,易遭受到屏蔽效应。
罗马诺夫斯基(t检验)准则法:计算较为复杂。
格拉布斯准则法(Grubbs):和狄克逊法均给出了严格的结果,但存在狄克逊法同样的缺陷。朱宏等人采用数据值的中位数取代平均值,改进得到了更为稳健的处理方法。有效消除了同侧异常值的屏蔽效应。国际上常推荐采用格拉布斯准则法。
R语言如何进行线性判别分析?
判别分析是一种有监督的训练方法。对于线性判别,先是将样本点投影到一维空间,也就是直线上,若效果不明显,就可以考虑增加一个维度,变成二维空间,如果还是不明显,就继续增加维度。
在R语言中,MASS软件包中的lda()是实现线性判别的核心函数。下面将通过一个简单实例来进行介绍。
1 读取数据集。
sz_data=read.csv("sz_data.csv",head=T,encoding="utf-8")
head(sz_data);dim(sz_data) #查看数据的前几行和数据维度
2 进行数据预处理。在实际应用中,如果数据有缺失值,需要先按照一定的方法先对缺失值进行处理。这里我们直接划分训练集和测试集,并且随机抽取70%的样本作为训练集。
n=0.7*nrow(sz_data) #作为训练集的样本量
sub_train=sample(nrow(sz_data),n)#随机抽取n个样本
data_train=sz_data[sub_train,-1]#训练集
data_test=sz_data[-sub_train,-1]#测试集
head(data_train);dim(data_train)
head(data_test);dim(data_test)
3 线性判别分析。没有MASS安装包的要先安装MASS包。
fit_lda1=lda(is_rise~.,data_train) #判别分析公式
names(fit_lda1) #查看lda()可给出的输出项名称
fit_lda1$prior #查看本次执行过程中所使用的先验概率
fit_lda1$counts #查看数据集data_train中各类别的样本量
fit_lda1$means #查看各变量在每一类别中的均值
fit_lda1 #输出判别分析的各项结果
plot(fit_lda1) #判别规则可视
从运行结果可以看出,本次线性判别将样本点投射到了一维空间(LD1)。结果中展示了先验概率、各类别样本量,以及各变量在每一类别中的均值。
图形中展示了is_rise取值为0和1时,分布具有一定的差异性。
4 对测试集进行预测。
pre_lda1=predict(fit_lda1,data_test)
data_test$pre_rise=pre_lda1$class #输出类别预测结果
head(data_test) #查看含有预测结果的数据
5 验证模型准确性。
table(data_test$is_rise,pre_lda1$class) #生成is_rise的预测值和实际值的混淆矩阵
error_lda1=sum(pre_lda1$class!=data_test$is_rise)/nrow(data_test);error_lda1#计算错误率
混淆矩阵中,对角线上的数据是被准确判别了的。计算出的错误率在15%以下,具有较高的准确性。
以上是关于如何判别测量数据中是不是有异常ŀ的主要内容,如果未能解决你的问题,请参考以下文章
R语言中多分类问题 multicalss classification 的性能测量