R语言判别分析
(2017-07-20 14:14:11)
标签:
r语言大数据挖掘数据分析数据分析师数据分析师培训 |
本文中分三个方法介绍判别分析,Bayes判别,距离判别,Fisher判别。前两种判别方法都要考虑两个、或多个总体协方差(这里是算方差,方差是协方差的一种)相等或不等的情况,由var.equal=的逻辑参数表示,默认是FALSE,表示认为两总体协方差不等。用样本的协方差可以估计总体的协方差。在Bayes方法中我们把相等和不等的两个结果都列了出来,距离判别里我们默认两总体协方差不等。事实上,一般使用时,我们都以两总体的协方差不等作为标准来进行后续计算。
协方差计算公式: S(xy) = N,i ∑ [(xi-x均)(yi-y均)]/(N-1) ; 这里要计算的总体协方差就是方差,为 S
= N,i ∑ [(xi-x均)*(xi-x均)^T]/(N-1)
1. Bayes判别
Bayes判别是假定对研究对象已有一定的认识,这种认识常用先验概率来描述,当取得样本后,就可以用样本来修正已有的先验概率分布,得出后验概率分布,现通过后验概率分布进行各种统计推断.
* 1.1 两总体判别的Bayes判别程序*
在程序中,输入变量TrnX1,TrnX2表示X1类,X2类训练样本,其输入格式是数据框,或矩阵(样本按行输入).rate=
L(1|2) / L(2|1)*p2/p1 , 缺省值为1.
TstX是待测样本,其输入格式是数据框,或矩阵(样本按行输入),或向量(一个待测样本).如果不输入TstX(缺省值),则待测样本为两个训练样本之和,即计算训练样本的回代情况.输入变量var.equal是逻辑变量,var.equal=TRUE表示认为两总体的协方差阵是相同的;否则(缺省值)是不同的.
函数的输出是由”1”,”2”构成的一维矩阵,”1”代表待测样本属于X1类,”2”代表待测样本属于X2类
discriminiant.bayes<-function
}
* 1.2 例. 用1.1中Bayes判别程序对冠心病和正常人进行判别分类*
为研究舒张期血压与血浆胆固醇对冠心病的作用,调查了50~59岁的女冠心病人15例和正常人16例。他们的舒张压(x1)与血浆胆固醇(x2)列在下表中。试用判别分析法建立判别冠心病与正常人的判别函数
#它们的先验概率pi分别用15/31、16/31来估计
#载入数据
TrnX1<-matrix(
TrnX2<-matrix(
#输入待测样本TrnX
TstX<-matrix(
#载入两总体的贝叶斯判别函数
source("discriminiant.bayes.R")
#### 总体协方差阵相同
discriminiant.bayes(TrnX1,
TrnX2,rate=16/15,var.equal=TRUE)
discriminiant.bayes(TrnX1,
TrnX2,TstX,rate=16/15,var.equal=TRUE)
#### 总体协方差阵不同
discriminiant.bayes(TrnX1, TrnX2,rate=16/15)
discriminiant.bayes(TrnX1, TrnX2,TstX,rate=16/15)
在判别函数的鉴定下,有5个被错判,3个样本从冠心病组被错判为正常组,两个样本从正常组错判到冠心病组,分别为1,6,7,17,18
待测样本分类结果为:
* 1.3 用R包里的lda函数进行判别,得到判别函数*
#也可以csv格式导入数据,先将以上两类数据存为csv格式文档
coronary_disease <-
read.csv("coronary_disease.csv")
#把分组变量变为定性变量
group <- factor(coronary_disease$group)
#随机抽取20个一般样本做训练样本
#train <- sample(1:31,20)
#显示训练样本中各类的比例
#table(group[train])
#group作为分组变量,X1,X2作为判别变量,使用训练样本生成判别函数,先验概率各为50%
library(MASS)
Z <- lda(group~.,data = coronary_disease
,prior=c(1,1)/2) #subset=train
Z
判别函数是Z = -0.6379195 * X1 -0.8001452 * X2
* 1.4 取原数据80%做train,20%做test,查看结果*
coronary_disease <-
read.csv("coronary_disease.csv")
#读取行数
N =
length(coronary_disease$group)
#ind=1的是0.7概率出现的行,ind=2是0.3概率出现的行
ind=sample(2,N,replace=TRUE,prob=c(0.8,0.2))
#生成训练集(这里训练集和测试集随机设置为原数据集的80%,20%)
coronary_train <- coronary_disease[ind==1,]
#生成测试集
coronary_test <- coronary_disease[ind==2,]
#固定这个28分组
set.seed(7)
#可以看到这里的train中,i个1组,j个2组,共i j个数据,则test里有(31-i-j个)数据
i <- table(coronary_train$group)[[1]]
j <- table(coronary_train$group)[[2]]
i;j
* 1.4.1 用1.1中Bayes判别程序对测试集进行判别分类*
#输入train的组别1、2,TrnXi;输入test
TrnX1 <- coronary_train[1:i,2:3]
TrnX2 <- coronary_train[(i 1):(i j),2:3]
TstX <- coronary_test[,2:3]
source("discriminiant.bayes.R")
#### 总体协方差阵相同
##它们的先验概率pi分别用i/24、j/24来估计
discriminant_train1 <- discriminiant.bayes(TrnX1,
TrnX2,rate=j/i,var.equal=TRUE) ;
discriminant_train1
discriminant_test1 <- discriminiant.bayes(TrnX1,
TrnX2,TstX,rate=j/i,var.equal=TRUE) ; discriminant_test1
#### 总体协方差阵不同
discriminant_train2 <- discriminiant.bayes(TrnX1,
TrnX2,rate=j/i) ; discriminant_train2
discriminant_test2 <- discriminiant.bayes(TrnX1,
TrnX2,TstX,rate=j/i) ; discriminant_test2
* 1.4.2 导出结果到csv文件中*
#在原始训练集,测试集中加入一列Is,表示是训练集还是测试集
coronary_train$Is <- c(rep("train",(i j)))
;coronary_test$Is <- c(rep("test",(31-i-j)))
#在原始训练集,测试集中分别加入总体协方差相同或不同时候的判定组别Discriminant
coronary_train$Belong_VarSame <-
discriminant_train1[1:(i j)]
coronary_test$Belong_VarSame <-
discriminant_test1[1:(31-i-j)]
coronary_train$Belong_VarDiff <-
discriminant_train2[1:(i j)]
coronary_test$Belong_VarDiff <-
discriminant_test2[1:(31-i-j)]
#合成一张表
coronary_result <-
rbind(coronary_train,coronary_test)
write.csv(coronary_result,"coronary_result.csv")
* 1.4.3 总体协方差相同或不同时,train和test的正确率*
#以train里的Var相同情况为例:
true_value_VarSame_train =
coronary_result[coronary_result$Is=="train",]$Belong_VarSame
predict_value_VarSame_trian =
coronary_result[coronary_result$Is=="train",]$group
#计算模型精确度
error_VarSame_train =
predict_value_VarSame_trian-true_value_VarSame_train
accuracy_VarSame_train =
(nrow(coronary_train)-sum(abs(error_VarSame_train)))/nrow(coronary_train)
#精确度--判断正确的数量占总数的比例
accuracy_VarSame_train
2. 距离判别(二分类与多分类)
* 2.1 两分类的距离判别程序*
在程序中,输入变量TrnX1,TrnX2表示X1类,X2类训练样本,其输入格式是数据框,或矩阵(样本按行输入).TstX是待测样本,其输入格式是数据框,或矩阵(样本按行输入),或向量(一个待测样本).如果不输入TstX(缺省值),则待测样本为两个训练样本之和,即计算训练样本的回代情况.输入变量var.equal是逻辑变量,var.equal=TRUE表示认为两总体的协方差阵是相同的;否则(缺省值)是不同的.
函数的输出是由”1”,”2”构成的一维矩阵,”1”代表待测样本属于X1类,”2”代表待测样本属于X2类
discriminiant.distance<-function