用最大似然法寻找类别

机器算法验证 最大似然 缺失数据 无监督学习 高斯混合分布 期望最大化
2022-01-30 07:35:27

假设我们有关于男性和女性身高的信息。

代码:

set.seed(1) 
Women=rnorm(80, mean=168, sd=6) 
Men=rnorm(120, mean=182, sd=7) 
par(mfrow=c(2,1)) 
hist(Men, xlim=c(150, 210), col="skyblue") 
hist(Women, xlim=c(150, 210), col="pink")

不幸的是,发生了一些事情,我们失去了谁是女人谁是男人的信息。

代码:

heights=c(Men, Women) 
par(mfrow=c(1,1)) 
hist(heights, col="gray70") 
rm(women, men) 

我们能否使用最大似然法以某种方式估计女性和男性的平均身高和标准差?

我们知道男性和女性的身高是正态分布的。

2个回答

这是一个经典的无监督学习问题,具有简单的最大似然解决方案。该解决方案是期望最大化算法的一个激励示例。过程是:

  1. 初始化组分配
  2. 估计分组方式和可能性。
  3. 计算每个观察到任一组的成员的可能性
  4. 基于 MLE 分配组标签

重复步骤 2-4 直到收敛,即没有重新分配组。

WLOG 我可以假设我知道所有 200 人中有 80 人是女性。另一件需要注意的事情是,如果我们不建立女性比男性矮的假设,那么聚类算法就不太清楚哪个组被标记为哪个组,有趣的是,聚类标签分配可以颠倒。

    set.seed(1) 
    Women=rnorm(80, mean=168, sd=6) 
    Men=rnorm(120, mean=182, sd=7) 
    AllHeight <- c(Women, Men)
    trueMF <- rep(c('F', 'M'), c(80, 120))
    
    ## case1  assume women are shorter, so assign first 
    ## 80 lowest height
    MF <- ifelse(order(AllHeight) <= 80, 'F', 'M')
    
    ## case 2 try randomly allocating 
    # MF <- sample(trueMF, replace = F)
    
    steps <- 0
    
    repeat {
      steps <- steps + 1
      mu <- tapply(AllHeight, MF, mean)
      sd <- tapply(AllHeight, MF, sd)
      logLik <- mapply(dnorm, x=list(AllHeight), mean=mu, sd=sd, 
                        log=T)
      MFnew <- c('F', 'M')[apply(logLik, 1, which.max)]
      if (all(MF==MFnew)) break
      else MF <- MFnew
    }
    
    ## case 1: 
    # 85% correct
    # 2 steps
    # Means
    # F        M 
    # 168.7847 183.5424 
    
    ## case 2:
    ## 15% correct
    ## 7 steps
    # F        M 
    # 183.5424 168.7847 
    
    ## what else?

您所描述的是两个高斯的混合

f(x)=πN(μ1,σ12)+(1π)N(μ2,σ22)

在哪里π(0,1)是混合比例。请注意,要找到两个组的均值和标准差,您需要知道组分配。如果您要找到组分配,最好的方法是将最接近每个组的平均值的观察分配给集群。这是一个先有鸡还是先有蛋的问题。该问题可以通过使用期望最大化算法来解决,该算法从随机分配组开始,给定它们计算参数,然后对观察结果重新分类,并重复直到收敛。还有其他算法,但这是最流行的一种。你可能知道从k- 表示聚类,这是高斯混合的一个特例。