最近我和一个朋友讨论了以下话题。设置是我们有一组一维数据。(在示例中是学生的分数,我们将进行评分。)目标是进行密度估计,但不要使用像核密度估计这样的“花哨”的东西,而只是使用高斯作为估计。(当然,这是假设数据是高斯分布的,但这不是这里的重点。)我们讨论了两种方法:
- 使用无监督学习方法进行密度估计,例如使用 EM 算法。在这种情况下,声称简单地计算数据的平均值和标准推导已经给了一个参数以正确地对高斯参数化。
- 将每个值的出现次数相加,然后使用由优化算法提供支持的以高斯为函数的监督学习回归。
通过讨论,我们发现两者显然有不同的结果——尽管可能相似。对于案例 2,我们优化了高斯的参数,使得从高斯到出现点的距离之和最小化(如果你愿意,沿着 y 轴)。对于案例 1,如果您愿意,我们会沿 x 轴优化参数。
问题
- 初步问题: EM 算法与仅计算数据的均值和标准差具有相同的结果是否正确?
假设初步问题的答案是“是的,结果是一样的”:
- 这两种方法的直觉解释是什么?
- 它们中没有一个本身是错误的,但其中一个在错误使用的意义上可能是错误的。含义:我想做某事,但我使用了错误的方法,因为对所发生的事情的解释有误。所以从这个意义上说:其中一个在某种程度上是错误的吗?
示例代码
我设法用 R 代码表达自己。从图中可以看出,任何数据集的结果肯定都不一样。只有当数据是高斯且较大时,结果才会相似。但这对我来说意义不大(和对于都收敛到大,否则它们几乎没有共同点)。
library(ggplot2)
library(dplyr)
library(tidyr)
std <- 10
datasets <- list(
data.frame( x = round(rnorm(1000, sd = std))),
data.frame( x = round(rnorm(1000, sd = std))) %>% filter(x > 0)
)
for(data1 in datasets){
data1$densest <- dnorm(data1$x, mean = mean(data1$x), sd = std, log = FALSE)
data2 <- data1 %>%
group_by(x) %>%
summarise(count = n())
f <- function(x, m, sd, k) {
k * exp(-0.5 * ((x - m)/sd)^2) # 1/sqrt(2*pi*sd^2) *
}
cost <- function(par) {
rhat <- f(data2$x, par[1], par[2], par[3])
sum((data2$count - rhat)^2)
}
o <- optim(c(0, std, 10), cost, method="BFGS", control=list(reltol=1e-9))
data1$regr <- f(data1$x, o$par[1], o$par[2], o$par[3])
data1$regrNormalized <- dnorm(data1$x, mean = o$par[1], sd = abs(o$par[2]), log = FALSE)
g1 <- ggplot(data=data1, aes(x=x)) +
geom_point(data=data2, aes(x=x, y=count), alpha=0.2)+
geom_line(aes(y=densest), color="green") +
geom_point(data = data.frame(mean = mean(data1$x)), aes(x=mean, y=0), color="green") +
geom_line(aes(y=regr), color="blue") +
geom_point(data = data.frame(mean = o$par[1]), aes(x=mean, y=0), color="blue")
g2 <- ggplot(data=data1, aes(x=x)) +
geom_line(aes(y=densest), color="green") +
geom_point(data = data.frame(mean = mean(data1$x)), aes(x=mean, y=0), color="green") +
geom_line(aes(y=regrNormalized), color="blue") +
geom_point(data = data.frame(mean = o$par[1]), aes(x=mean, y=0), color="blue")
plot(g1)
plot(g2)
}