判别分析(Discriminant Analysis, DA) - ricket-sjtu/bi028 GitHub Wiki

1. 判别分析

判别分析是判别个体所属群体的一种统计学方法,常用的判别分析方法主要包括:

  • 基于距离的判别分析方法
  • 基于贝叶斯的判别分析方法
  • Fisher判别分析方法(Fisher's discriminant analysis, FDA)

1.1 贝叶斯判别分析

  • 先验概率:对分析对象的先验知识:$\pi_i$
  • 通过样本分析得到后验概率分布:$p(\pi_i | x) = \frac{\pi_i f(x|\pi_i)}{\sum_{j=1}^g \pi_j f(x | \pi_j)}$
  • 通过后验概率分布进行统计推断:$\operatorname{argmax}_i p(\pi_i | x)$ (后验概率最大化) 实际上就是使得平均误判损失(误判概率与误判损失的加权和)ECM达到最小的过程。

1.2 判别分析的过程

  1. 收集数据
  2. 设置先验概率(prior):
  • 等配先验(equal prior):$\hat{\pi}_i = 1/g$;
  • 任意先验(arbitrary prior):$\sum_i \hat{\pi}_i = 1$
  • 经验先验(estimated prior):$\hat{\pi}_i = n_i / N$
  1. 使用Bartlett检验确定方差-协方差矩阵(variance-covariance matrix)是否同质(homogeneous):
  • 如果同质,则采用线性判别分析(linear discriminant analysis, LDA);
  • 如果异质,则采用二次判别分析(quadratic discriminant analysis, QDA);
  1. 确定条件概率密度函数的参数,必须满足以下假设:
  • 第$i$组数据具有相同的平均向量$\mu_i$;
  • 第$i$组数据具有相同的方差-协方差矩阵$\Sigma$;
  • 个体的独立性(independence)
  • 数据呈多元正态分布(multivariate normal distribution)
  1. 计算判别函数(discriminant function)
  2. 使用**交叉验证(cross validation)**估计误分类概率(misclassification probabilities)
  3. 为未知分组样本确定其分组

1.2.1 线性判别分析(Linear discriminant analysis, LDA)

假定在总体$i$中,$X \sim N(\mu_i, \Sigma_p)$多元正态分布: $$ f(x | \pi_i) = \frac{1}{(2\pi)^{p/2} |\Sigma|^{1/2}} \exp \left[ (x-\mu_i)^T \Sigma^{-1} (x-\mu_i)\right] $$ 因此分组就是最大化$\pi_i (f(x | \pi_i))$,也可以转化为$\log [\pi_i (f(x | \pi_i))] $。

线性打分函数 (Linear Score Function)

$$ s^L_i(\mathbf{X}) = -\frac{1}{2}\mathbf{\mu_i^T \Sigma^{-1}\mu_i + \mu_i^T \Sigma^{-1} x}+ \log \pi_i = d_{i0}+\sum_{j=1}^{p}d_{ij}x_j + \log \pi_i $$ 其中

  • $d_{i0} = -\frac{1}{2}\mathbf{\mu_i^T \Sigma^{-1}\mu_i}$;
  • $d_{ij}$是$\mu_i^T \Sigma^{-1}$的第$j$各元素

LDA步骤

  1. 设置先验概率:$p_i = Pr(\pi_i); i=1, 2, \ldots, g$;
  2. 计算每个组的均值:$\mu_i = E(X | \pi_i) = \bar{x}_i, i=1,2, \ldots, g$;
  3. 计算方差-协方差矩阵:$\Sigma = var(X | \pi_i) = \mathbf{S}p = \frac{\sum{i=1}^{g}(n_i-1)\mathbf{S}i}{\sum{i=1}^{g}(n_i-1)}$;
  4. 估计线性打分函数:$\hat{s}^L_i(\mathbf{x}) = -\frac{1}{2}\mathbf{\bar{x}'_i S^{-1}_p \bar{x}_i +\bar{x}'i S^{-1}p x } + \log{\hat{p}i} = \hat{d}{i0} + \sum{j=1}^{p}\hat{d}{ij}x_j + \log{p}_i$,其中
  • $\hat{d}_{i0} = -\frac{1}{2}\mathbf{\bar{x}'_i S^{-1}_p \bar{x}_i}$;
  • $\hat{d}_{ij}$是$\mathbf{\bar{x}'_iS^{-1}_p}$的第$j$个元素;
  1. 判别$\mathbf{x}$为令$\hat{s}^L_i(\mathbf{x})$最大的$i$。

1.2.2 二次判别分析(Quadratic discriminant analysis, QDA)

QDA与LDA相似,也要定义一个二次打分函数(Quadratic score function): $$ s_i^Q (\mathbf{x}) = -\frac{1}{2}\log{|\mathbf{\Sigma_i}|}-\frac{1}{2}{\mathbf{(x-\mu_i)^T \Sigma_i^{-1}(x - \mu_i)}}+\log{p_i} $$ 不同的是,这里$\Sigma_i$的采用估计值$\mathbf{S}_i$替代。

1.2.3 两个总体的贝叶斯判别分析方法

discriminant.bayes <- function(TrnX1, TrnX2, rate=1, TstX=NULL, var.equal=FALSE) {
  #@TrnX1, TrnX2: data.frame, training set for class 1 and class 2, respectively
  #@rate = p1/p2
  #@TstX: data.frame, test set
  #@var.equal: TRUE/FALSE, the two class has equal variance
  if (is.null(TstX)) TstX <- rbind(TrnX1, TrnX2)
  if (is.vector(TstX)) TstX <- t(as.matrix(TstX))
  if (!is.matrix(TstX)) TstX <- as.matrix(TstX)
  if (!is.matrix(TrnX1)) TrnX1 <- as.matrix(TrnX1)
  if (!is.matrix(TrnX2)) TrnX2 <- as.matrix(TrnX2)
  nx <- nrow(TstX)
  blong <- matrix(rep(0, nx), nrow=1, byrow=TRUE, 
                  dimnames=list("blong", 1:nx))
  mu1 <- colMeans(TrnX1)
  mu2 <- colMeans(TrnX2)
  if (var.equal) {
    S <- var(rbind(TrnX1, TrnX2))
    beta <- 2*log(rate)
    w <- mahalanobis(TstX, mu2, S) - mahalanobis(TstX, mu1, S)
  } else {
    S1 <- var(TrnX1)
    S2 <- var(TrnX2)
    beta <- 2*log(rate) + log(det(S1)/det(S2))
    w <- mahalanobis(TstX, mu2, S2) - mahalanobis(TstX, mu1, S1)
  }
  blong <- (w <= beta) + 1
  blong
}

TrnX1<-matrix(c(24.8, 24.1, 26.6, 23.5, 25.5, 27.4, 
                -2.0, -2.4, -3.0, -1.9, -2.1, -3.1),
              ncol=2)
TrnX2<-matrix(c(22.1, 21.6, 22.0, 22.8, 22.7, 21.5, 22.1, 21.4,
               -0.7, -1.4, -0.8, -1.6, -1.5, -1.0, -1.2, -1.3),
             ncol=2)
p <- nrow(TrnX1)
q <- nrow(TrnX2)
discriminant.bayes(TrnX1, TrnX2, rate=q/p,var.equal=TRUE)
discriminant.bayes(TrnX1, TrnX2, rate=q/p)

1.2.3 多总体贝叶斯判别分析

multiclass.discriminant.bayes <- function(TrnX, TrnG, p=rep(1, length(levels(TrnG))), TstX=NULL, var.equal=FALSE) {
  if (!is.factor(TrnG)) {
    mx <- nrow(TrnX); mg <- nrow(TrnG)
    TrnX <- rbind(TrnX, TrnG)
    TrnG <- factor(rep(1:2, c(mx, mg)))
  }
  if (is.null(TstX)) TstX <- TrnX
  if (is.vector(TstX)) TstX <- as.matrix(TstX)
  else if (!is.matrix(TstX)) TstX <- as.matrix(TstX)
  if (!is.matrix(TrnX)) TrnX <- as.matrix(TrnX)

  nx <- nrow(TstX)
  blong <- matrix(rep(0, nx), nrow=1, dimnames=list("blong", 1:nx))

  g <- length(levels(TrnG))
  mu <- matrix(0, nrow=g, ncol=ncol(TrnX))
  for (i in 1:g) {
    mu[i, ] <- colMeans(TrnX[TrnG==i, ])
  }
  D <- matrix(0, nrow=g, ncol=nx)
  if (var.equal) {
    for (i in 1:g) {
      d2 <- mahalanobis(TstX, mu[i, ], var(TrnX))
      D[i,] <- d2 - 2*log(p[i])
    }
  } else {
    for (i in 1:g) {
      S <- var(TrnX[TrnG==i,])
      d2 <- mahalanobis(TstX, mu[i, ], S)
      D[i,] <- d2 - 2*log(p[i]) - log(det(S)) 
    }
  }
  for (j in 1:nx) blong[j] <- which.min(D[,j])

  blong
}

data(iris)
X<-iris[,1:4]
G<-gl(3,50)
multiclass.discriminant.bayes(X, G, var.equal=T)
multiclass.discriminant.bayes(X, G)