判别分析1

理论

两总体协方差阵相等(但未知)时均值向量的检验

为来自总体的随机样本;为来自总体的随机样本,且相互独立,未知。
检验
取检验统计量

可计算样本均值,样本离差阵,进一步计算得



给定显著水平,只需计算值,即,若,即可否定,即两组样本间存在显著性差异。在这种情况下,可能犯第一类错误,犯第一类错误的概率为.

马氏距离判别

设总体元总体(考察m个指标),均值向量为,协方差阵为,则样品与总体马氏距离定义为

用估计量替代上式的距离和方差,均值用样本均值代,方差用组内协方差阵代替
其中
称为组间离差阵。
当假定时,反映分散性的协方差的估计为


,判,否则判
所以计算马氏距离可改为对线性函数的计算

  • 二次判别





其中的二次函数,是一常数

注意:经检验不能拒绝协方差相等时,一般可采用线性判别,但仍可采用二次判别,二次判别的正确率高于线性判别;如果数据量很大,二次判别需要的时间远大于线性判别。

  • 多总体距离判别

判给距离最近的那一个,设时,若

贝叶斯判别及广义平方距离判别

当先验概率总体分布的密度函数及损失函数给定时,贝叶斯判别的解满足:
其中
,进一步,如果,则的概率测度为0。

在正态总体下,的贝叶斯判别法,则贝叶斯判别的解为

可以求得它的线性判别函数

其中为与无关的依赖于的常数。
,并且称线性判别函数,称判别系数为常数项。贝叶斯判别的解为最大的对应的下标。

这与用广义平方距离判别是一致的,定义样品到总体广义平方距离

将样本判给广义平方距离最小的对应总体。

我们之前所熟知的后验概率最大法判别

其实就是贝叶斯判别法的一种特殊情况。

Fisher判别

直观来讲,基本思想是投影将来自不同总体的样本间的距离拉大。
设从元总体分别抽取样本如下


投影后为

投影后为一元数据,其组间平方和为


组内离差阵为


使得投影后组间差异尽可能大,即使得尽可能大。

不过按照老师的讲法,更常见的分母是各个总体的直接求和。

实例及代码实现

在天气预报中,常根据当天天气的湿温差(x1)和气温差(x2),来预测第二天是否下雨。试利用观测到的天气数据ex5.2(见附件),判断当今天测得(x1, x2)=(8.1,2.0) 或 (7.5, 3.5)时,明天的天气应判断为下雨还是不下雨?

  • 读入数据,计算均值和协方差
1
2
3
4
5
6
7
data1<-read.csv("ex5.2.csv")

gp<-data1$G # 1下雨 2不下雨
tr<-data1[,2:3]

x1<-tr[gp=="1",];x1m<-apply(x1,2,mean);S1<-var(x1)
x2<-tr[gp=="2",];x2m<-apply(x2,2,mean);S2<-var(x2)
1
2
3
4
5
6
7
8
> head(data1)
G x1 x2
1 1 -1.9 3.2
2 1 -6.9 0.4
3 1 5.2 2.0
4 1 5.0 2.5
5 1 7.3 0.0
6 1 6.8 12.7
  • step1 是否有均值差异
1
2
3
4
5
6
n=nrow(x1);m=nrow(x2);A1<-(n-1)*S1;A2<-(m-1)*S2;
Dsq=(n+m-2)%*%t(x1m-x2m)%*%solve(A1+A2)%*%(x1m-x2m)
p=2
Tsq=n*m/(n+m)*Dsq
FF=(n+m-p-1)/((n+m-2)*p)*Tsq
pf(FF, df1=p, df2=n+m-p-1, lower.tail = F)# P[X > x]

, 故在显著水平0.01时两总体的均值有显著差异, 即讨论两个总体的判别是有意义的。

  • step2 马氏距离判别
1
2
3
4
5
6
7
8
9
10
11
dsq1<-function(x){
return(t(x-x1m)%*%solve(S1)%*%(x-x1m))
}
dsq2<-function(x){
return(t(x-x2m)%*%solve(S2)%*%(x-x2m))
}
d1<-apply(tr,1,dsq1)
d2<-apply(tr,1,dsq2)
re<-cbind(d1,d2)
regp<-apply(re,1,function(a){which(a==min(a),arr.ind=TRUE)})
redata<-cbind(data1,regp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
> head(redata)
G x1 x2 regp
1 1 -1.9 3.2 1
2 1 -6.9 0.4 1
3 1 5.2 2.0 1
4 1 5.0 2.5 1
5 1 7.3 0.0 1
6 1 6.8 12.7 1
> table(redata$G==redata$regp)
FALSE TRUE
2 18
> table(redata$G==redata$regp)/nrow(redata)
FALSE TRUE
0.1 0.9

第一列为原来的类别,最后一列为数据回代后的判别结果,20个数据错判了2个,错判比例为0.1。

1
2
3
4
5
6
> dsq1(c(8.1,2))<dsq2(c(8.1,2))
[,1]
[1,] TRUE
> dsq1(c(7.5,3.5))<dsq2(c(7.5,3.5))
[,1]
[1,] TRUE

两组数据均被判断为下雨。