R语言中地多元统计之判别分析报告.docx
- 文档编号:10337452
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:11
- 大小:131.39KB
R语言中地多元统计之判别分析报告.docx
《R语言中地多元统计之判别分析报告.docx》由会员分享,可在线阅读,更多相关《R语言中地多元统计之判别分析报告.docx(11页珍藏版)》请在冰豆网上搜索。
R语言中地多元统计之判别分析报告
前言
判别分析(discriminantanalysis)是多元统计分析中较为成熟的一种分类方法,它的核心思想是“分类与判断”,即根据已知类别的样本所提供的信息,总结出分类的规律性,并建立好判别公式和判别准则,在此基础上,新的样本点将按照此准则判断其所属类型。
例如,根据一年甚至更长时间的每天的湿度差及压差,我们可以建立一个用于判别是否会下雨的模型,当我们获取到某一天(建立模型以外的数据)的湿度差及压差后,使用已建立好的模型,就可以得出这一天是否会下雨的判断。
根据判别的组数来区分,判别分析可以分为两组判别和多组判别。
接下来,我们将学习三种常见的判别分析方法,分别是:
∙距离判别
∙Bayes判别
∙Fisher判别
一、距离判别基本理论
假设存在两个总体
和
,另有
为一个
维的样本值,计算得到该样本到两个总体的距离
和
如果
大于
,则认为样本
属于总体
,反之样本
则属于总体
;若
等于
,则该样本待判。
这就是距离判别法的基本思想。
在距离判别法中,最核心的问题在于距离的计算,一般情况下我们最常用的是欧式距离,但由于该方法在计算多个总体之间的距离时并不考虑方差的影响,而马氏距离不受指标量纲及指标间相关性的影响,弥补了欧式距离在这方面的缺点,其计算公式如下:
,
为总体之间的协方差矩阵
二、距离判别的R实现(训练样本)
首先我们导入数据
#读取SAS数据
>library(sas7bdat)
>data1<-read.sas7bdat('disl01.sas7bdat')
#截取所需列数据,用于计算马氏距离
>testdata<-data1[2:
5]
>head(testdata,3)
X1X2X3X4
1-0.45-0.411.090.45
2-0.56-0.311.510.16
30.060.021.010.40
#计算列均值
>colM<-colMeans(testdata)
>colM
X1X2X3X4
0.096304348-0.0069565222.0334782610.431739130
#计算矩阵的协方差
>cov_test<-cov(testdata)
>cov_test
X1X2X3X4
X10.0681838160.0277670530.14996870-0.002566763
X20.0277670530.0153638650.058782510.001252367
X30.1499686960.0587825121.013098740.028607150
X4-0.0025667630.0012523670.028607150.033912464
#样本的马氏距离计算
>distance<-mahalanobis(testdata,colM,cov_test)
>head(distance,5)
[1]12.72646511.2246811.6927021.3478852.369820
这样,我们得到了距离判别中最关键的马氏距离值,在此基础上就可以进行进一步的判别分析了。
不过我们介绍一个R的第三方包WMDB,该包的wmd()函数可以简化我们的距离判别过程,函数将输出样本的分类判别结果、错判的样本信息以及判别分析的准确度。
>library(WMDB)
>head(data1,3)
AX1X2X3X4
11-0.45-0.411.090.45
21-0.56-0.311.510.16
310.060.021.010.40
#提取原始数据集的A列生成样品的已知类别
>testdata_group<-data1$A
#转换为因子变量,用于wmd()函数中
>testdata_group<-as.factor(testdata_group)
>wmd(testdata,testdata_group)
123456789101112131415161718192021222324252627
blong111111111111112211121111222
28293031323334353637383940414243444546
blong2222221222111112122
[1]"numofwrongjudgement"
[1]15162022232434383940414244
[1]"samplesdividedto"
[1]2221111111111
[1]"samplesactuallybelongsto"
[1]1112222222222
Levels:
12
[1]"percentofrightjudgement"
[1]0.7173913
由分析结果可知,根据已知分类的训练样品建立的判别规则,重新应用于训练样品后,出现了13个错判样品,拥有71.7%的准确度。
三、距离判别的R实现(测试样本)
接着,当我们获取到未分类的新样本数据时,使用wmd()函数,在训练样本的基础上进行这些数据的距离判别
#导入数据,一共10个样本
>data2<-read.sas7bdat('disldp01.sas7bdat')
#截取所需列数据
>newtestdata<-data2[1:
4]
#进行判别分析
>wmd(testdata,testdata_group,TstX=newtestdata)
12345678910
blong1111112221
根据马氏距离判别分析得到的结果,10个待判样品中,第一类7个,第二类3个。
距离判别方法简单实用,它只要求知道总体的数字特征,而不涉及总体的分布,当总体均值和协方差未知时,就用样本的均值和协方差矩阵来估计,因此距离判别没有考虑到每个总体出现的机会大小,即先验概率,没有考虑到错判的损失。
因此,我们进一步学习贝叶斯判别法。
一、贝叶斯判别基本理论
贝叶斯判别法的前提是假定我们已经对所要分析的数据有所了解(比如数据服从什么分别,各个类别的先验概率等),根据各个类别的先验概率求得新样本属于某类的后验概率。
该算法应用到经典的贝叶斯公式,该公式为:
假设有两个总体
和
,分别具有概率密度函数
和
,并且根据以往的统计分析,两个总体各自出现的先验概率为
和
,当一个样本
发生时,求该样本属于某一类的概率,计算公式为:
这样,我们得到了该样本属于两类总体的概率,分别为
和
,属于哪一类总体的概率值大,我们则将样本划分到该类中。
二、贝叶斯判别的R实现
在R中,我们使用klaR包中的NaiveBayes()函数实现贝叶斯判别分析,函数调用公式如下:
>NaiveBayes(formula,data,...,subset,na.action=na.pass)
#formula指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3
#na.action指定缺失值的处理方法,默认情况下不将缺失值纳入模型计算,也不会发生报错信息,当设为“na.omit”时则会删除含有缺失值的样本
#数据准备,使用R内置数据集iris
#通过抽样建立训练样本(70%)和测试样本(30%)
>index<-sample(2,size=nrow(iris),replace=TRUE,prob=c(0.7,0.3))
>train_data<-iris[index==1,]
>test_data<-iris[index==2,]
#载入所用包
>library(klaR)
#构建贝叶斯模型
>Bayes_model<-NaiveBayes(Species~.,data=train_data)
#进行预测
>Bayes_model_pre<-predict(Bayes_model,newdata=test_data[,1:
4])
#生成实际与预判交叉表
>table(test_data$Species,Bayes_model_pre$class)
setosaversicolorvirginica
setosa2000
versicolor0170
virginica037
从上表生成的交叉表中,我们可以看到在该模型中错判了3个。
#生成预判精度
>sum(diag(table(test_data$Species,Bayes_model_pre$class)))
+/sum(table(test_data$Species,Bayes_model_pre$class))
[1]0.9361702
三、Fisher判别基本理论
Fisher判别法的基本思想是“投影”,将
组
维的数据向低维空间投影,使其投影的组与组之间的方差尽可能的大,组内的方差尽可能的小。
因此,Fisher判别法的重点就是选择适当的“投影轴”。
判别函数为
,接下来我们以两类总体举例。
首先我们将样本点投影到一维空间,旋转坐标轴至总体单位尽可能分开的方向,此时分类变量被简化为一个,判别函数
;如果划分的效果不理想,可以考虑投影到二维空间(
),以此类推。
上图为二维空间的Fisher判别,从图中可以看到,无论我们把总体
和
投影到
还是
轴,都不能很好的把两类总体区分出来。
为此,我们需要寻找一条合适的投影线,使得两类总体向该线投影后的区分程度达到最大,线性判别函数
即为该投影线的表达形式(这里我们仅介绍Fisher判别的基本原理,不涉及参数的具体推导和求解,这些都可用R程序求得)。
四、Fisher判别的R实现
在R中,我们使用MASS包中的lda()函数实现Fisher判别分析,函数调用公式如下:
>lda(formula,data,...,subset,na.action)
#formula:
指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3
#na.action:
指定缺失值的处理方法,默认情况下,缺失值的存在使算法无法运行,当设置为“na.omit”时则会删除含有缺失值的样本
#数据准备,使用R内置数据集iris
#通过抽样建立训练样本(70%)和测试样本(30%)
>index<-sample(2,size=nrow(iris),replace=TRUE,prob=c(0.7,0.3))
>train_data<-iris[index==1,]
>test_data<-iris[index==2,]
#载入所用包
>library(MASS)
#构建Fisher判别模型
>fisher_model<-lda(Species~.,data=train_data)
#进行预测
>fisher_model_pre<-predict(fisher_model,newdata=test_data[,1:
4])
#生成实际与预判交叉表
>table(test_data$Species,fisher_model_pre$class)
setosaversicolorvirginica
setosa2000
versicolor0141
virginica0018
#生成预判精度
>sum(diag(table(test_data$Species,fisher_model_pre$class)))
+/sum(table(test_data$Species,fisher_model_pre$class))
[1]0.9811321
五、Fisher判别进阶——非线性判别
在判别分析的实际应用中,对复杂的数据使用线性判别可能无法得到理想的效果。
为此,我们需要使用类似于二次判别函数的非线性分类方法,将样本点投影到若干种二次曲面中,实现理想的判别效果。
在R中,非线性判别使用MASS包的qda()函数来实现,调用公式为:
>qda(formula,data,...,subset,na.action)
#使用lda()函数同样的数据集
>fisher_model_2<-qda(Species~.,data=train_data)
>fisher_model_pre_2<-predict(fisher_model_2,newdata=test_data[,1:
4])
>table(test_data$Species,fisher_model_pre_2$class)
setosaversicolorvirginica
setosa2000
versicolor0141
virginica0018
>sum(diag(table(test_data$Species,fisher_model_pre_2$class)))
+/sum(table(test_data$Species,fisher_model_pre_2$class))
[1]0.9811321
结果我们发现,线性判别法和非线性的二次判别法得到的结果一致,这说明线性判别法已经能够很好的将数据的类别划分出来了,且准确率达到98%。
不过我们需要认识到,这一结果主要是由于我们所用的数据集较为简单直观,对于更为复杂的高维数据,非线性判别要比线性判别在准确度上有着较大的提升。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 多元 统计 判别分析 报告