Maximum-Likelihood
用最大似然法尋找類別
假設我們有關於男性和女性身高的信息。
代碼:
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)
我們能否使用最大似然法以某種方式估計女性和男性的平均身高和標準差?
我們知道男性和女性的身高是正態分佈的。
這是一個經典的無監督學習問題,具有簡單的最大似然解決方案。該解決方案是期望最大化算法的一個激勵示例。過程是:
- 初始化組分配
- 估計分組方式和可能性。
- 計算每個觀察到任一組的成員的可能性
- 基於 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?