16  判别分析

16.1 基本思想

基于距离的判别,马氏距离,减少样本方差之间的影响。

有时候的,多元回归,进行组合,表示为被解释变量。

  • 判别,包含两组及以上

16.1.1 假设条件

  • 不存在多重共线性问题;
  • 各组变量的协方差矩阵相等;
  • 各变量之间多元正态分布;
  • 基本要求:分组两个以上,案例规模1以上;解释变量可测。

16.1.2 混合线性判别

16.1.3 灵活线性判别

16.1.4 距离判别法

根据类的中心距离进行判断类属。里哪里近就是属于哪一个类 欧氏距离: \[ d^2(x,G_1)=(x-\mu_1)'(x-\mu_1) \]

16.1.5 两个总体情况

样本对类的距离进行比较; 当总体\(G_1\)

\[ d^2(X,G_1)=(x-\mu_1)'\Sigma_1^{-1}(x-\mu_1)\\ d^2(X,G_2)=(x-\mu_2)'\Sigma_2^{-1}(x-\mu_2) \]

  • 当总体不是正态分布时候,也可以用马氏距离来描述X到总体的距离。 - 构造判别函数:

\[ W(x)=\frac{1}{2}[d^2(x,G_2)-d^2(x,G_1)] \]

  • 进一步根据\(\Sigma_1,\Sigma_2,\Sigma\)之间的关系来进行分类:

  • \(\Sigma_1=\Sigma_2=\Sigma\) 可以推出一个线性判别函数\(W(x)=(x-\overline \mu)'\Sigma^{-1}(\mu_1-\mu_2)\)

  • \(\Sigma_1\neq\Sigma_2\) \(W(x)\)显然是一个二次函数 可以使用x的二次函数作为判别式。

\[ \hat \mu_1=\frac{1}{n_1}\sum_{i=1} \]

\(\Sigma_1\neq\Sigma_2\)

例子:比如要求一个马氏距离,假设服从同一个正态分布。 计算样本(6,8,8)到两组的马氏距离,判断属于哪个组?

df<-data.frame()
x<-c(6,8,8)
mu1<-c(8.4,8,7.5)
mu2<-c(4,3.5,4.5)
(x-mu1)^T
[1] -2.4  0.0  0.5
sig<-matrix(c(11.2,-3.5,2.5,-3.5,10,1.25,2.5,1.25,8.5),3,3)
print(solve(sig))
            [,1]        [,2]        [,3]
[1,]  0.11184651  0.04406836 -0.03937668
[2,]  0.04406836  0.11923592 -0.03049598
[3,] -0.03937668 -0.03049598  0.13371314
ans1<-(x-mu1)%*%solve(sig)%*%(x-mu1)^T
ans2<-(x-mu2)%*%solve(sig)%*%(x-mu2)^T

对判别规则进行简化

16.1.6 Bayes判别方法

距离判别的不足,与总体中各自出现的概率无关,同时判别方法与错判之后的损失无关。

贝叶斯思想:假定对研究对象有一定对认知,再取得一定的样本。 先验概率分布,得到后验概率分布,各种统计推断。 - 贝叶斯+判别分析=贝叶斯判别

有k个总体\(G_1,G_2,\cdots,G_n\) 有p维密度函数,已知出现的概率为\(q_1,q_2,\cdots,q_k\)。 用\(D_1,\cdots,D_k\)表示一个划分方式,\(c(j|i)\)表示样本来自\(G_1\)而实际误判为\(G_j\)的损失。误判的概率为 \[ p(j|i)=\int_{D_j}p_i(x)dx \] ECM(expected cost of misclassification)为 \[ ECM(D_1,\cdots,D_k)=\sum_{i=1}q_i\sum_{j=1}^kc(j|i)p(j|i) \] 其中\(c(i|i)=0\) 总损失 根据这个表来计算属于哪一个组。

16.1.6.1 最大后验概率准则

k个总体,分布密度函数为\(f_1(x_1),f_2(x_2),\cdots,f_k(x_k)\)互不相同。 各自出现的先验概率为\(q_1,q_2,\cdots,q_k\)其中\(q_i\geq 0,\sum_{i=1}q_i=1\)。 - 最大后验概率是将样本\(x_0\)判别到后验概率最大的一类。

\[ P(G_l|x_0)=\frac{q_lf_l}{\sum_{j=1}^kq_kf_j(x_0)}=\max_{1\leq i\leq k}\frac{q_if_j}{\sum_{j=1}^kq_kf_j(x_0)}\Rightarrow x_i\in G_l \]

p<-matrix(c(0,20,60,10,0,50,200,100,0),3,3)
q<-c(0.05,0.65,0.30)
f<-c(0.1,0.63,2.4)
sum(q*f*p[,1])
[1] 51.39
sum(q*f*p[,2])
[1] 36.05
sum(q*f*p[,3])
[1] 41.95
p1<-q*f
ans<-p1%*%p
which.min(ans) #return the index of minimum
[1] 2

16.2 Fisher 判别法

基本思想:将K组的p纬数据投影到某一个方向,对投影点来说使得各组之间尽可能的分开。然后选择合适的判别规则,将新的样品进行分类判别。

组间离差: \[ SSG=\sum_{\alpha=1}^kn_\alpha(a^T\overline x_i-a^T\overline x)^2 \] 组内离差:

\[ SSE=\sum_{\alpha=1}^k\sum_{i=1}^{n_\alpha}(a^T\overline x_i-a^T\overline x)^2\\=a^TEa \]

优化方向:\(SSE\to \min;SSG\to max\)

\[ \Delta(\alpha)=\frac{a^T Ba}{a^T Ea}\to \max \]

  1. 把来自2类的训练样本集划分为2个子集\(X_1\)\(X_2\)

  2. 计算各类的均值向量\(\mu_i\)

  3. 计算各类的类内离散矩阵S_{wi},i=0,1,S_{wi}=_{xX_i};

  4. 计算类内总离散矩阵 ;

  5. 计算矩阵 的逆矩阵 ;

  6. 求出向量 (此处采用拉格朗日乘子法解出Fisher线性判别的最佳投影方向);

  7. 判别函数为 ;

  8. 判别函数的阈值 可采用以下两种方法确定:第一种是 ;第二种是 ;

  9. 分类规则:比较 值与阈值 的大小,得出其分类。

library(MASS)
data(iris)
diris<- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),species =rep(c(1,2,3), rep(50,3)))
head(diris)
  Sepal.L. Sepal.W. Petal.L. Petal.W. species
1      5.1      3.5      1.4      0.2       1
2      4.9      3.0      1.4      0.2       1
3      4.7      3.2      1.3      0.2       1
4      4.6      3.1      1.5      0.2       1
5      5.0      3.6      1.4      0.2       1
6      5.4      3.9      1.7      0.4       1
sa<-sample(1:150, 75)
table(diris$species[sa])

 1  2  3 
25 24 26 
z <- lda(species ~ ., diris, prior = c(1,1,1)/3, subset = sa,)
pre<-predict(z, diris[-sa, ])
  • Prior probabilities of 先验概率
  • groups:是各分类数据在总体中占得比例,是一个概率向量,用lda.sol$prior调用
  • Group means:是每个分类的均值向量,用lda.sol$means调用
  • Coefficients of linear
  • discriminants:是降维矩阵,用lda.sol$scaling调用。这个矩阵的列空间是输入空间,行空间是输出空间,左乘一个行向量以将其降维
  • Proportion of trace:降维后各分量的权重。在本例中,将4维向量降为2维,LD1占绝大比重。
irisdata=iris[,1:4]
irisgrp=iris[,5]
(lda.sol=lda(irisdata,irisgrp))
Call:
lda(irisdata, irisgrp)

Prior probabilities of groups:
    setosa versicolor  virginica 
 0.3333333  0.3333333  0.3333333 

Group means:
           Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa            5.006       3.428        1.462       0.246
versicolor        5.936       2.770        4.260       1.326
virginica         6.588       2.974        5.552       2.026

Coefficients of linear discriminants:
                    LD1         LD2
Sepal.Length  0.8293776  0.02410215
Sepal.Width   1.5344731  2.16452123
Petal.Length -2.2012117 -0.93192121
Petal.Width  -2.8104603  2.83918785

Proportion of trace:
   LD1    LD2 
0.9912 0.0088 
result = predict(lda.sol, irisdata)
table(irisgrp, result$class) #$class是预测结果
            
irisgrp      setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48         2
  virginica       0          1        49
P = lda.sol$scaling
# 将均值向量降维
means = lda.sol$means %*% P
# 加权平均的出总的降维均值向量,权重就是lda.sol$prior
total_means = as.vector(lda.sol$prior %*% means)
n_samples = nrow(irisdata)

# 把样本降维并平移
x<-as.matrix(irisdata) %*% P - (rep(1, n_samples) %o% total_means)

plot(x, cex=1.2,
     pch=rep(21:23, c(50,50,50)),
     col=rep(2:4, c(50,50,50)),
     bg=rep(2:4, c(50,50,50)))