将高斯拟合到数据:密度估计与回归

数据挖掘 机器学习
2022-02-19 18:39:45

最近我和一个朋友讨论了以下话题。设置是我们有一组一维数据。(在示例中是学生的分数,我们将进行评分。)目标是进行密度估计,但不要使用像核密度估计这样的“花哨”的东西,而只是使用高斯作为估计。(当然,这是假设数据是高斯分布的,但这不是这里的重点。)我们讨论了两种方法:

  1. 使用无监督学习方法进行密度估计,例如使用 EM 算法。在这种情况下,声称简单地计算数据的平均值和标准推导已经给了一个参数以正确地对高斯参数化。
  2. 将每个值的出现次数相加,然后使用由优化算法提供支持的以高斯为函数的监督学习回归。

通过讨论,我们发现两者显然有不同的结果——尽管可能相似。对于案例 2,我们优化了高斯的参数,使得从高斯到出现点的距离之和最小化(如果你愿意,沿着 y 轴)。对于案例 1,如果您愿意,我们会沿 x 轴优化参数。

问题

  1. 初步问题: EM 算法与仅计算数据的均值和标准差具有相同的结果是否正确?

假设初步问题的答案是“是的,结果是一样的”:

  1. 这两种方法的直觉解释是什么?
  2. 它们中没有一个本身是错误的,但其中一个在错误使用的意义上可能是错误的。含义:我想做某事,但我使用了错误的方法,因为对所发生的事情的解释有误。所以从这个意义上说:其中一个在某种程度上是错误的吗?

示例代码

我设法用 R 代码表达自己。从图中可以看出,任何数据集的结果肯定都不一样。只有当数据是高斯且较大时,结果才会相似。但这对我来说意义不大(对于都收敛到大,否则它们几乎没有共同点)。2xexp(x)infinityx>infinity

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)

}

情节

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

2个回答

之所以出现差异,是因为样本均值和 sd 估计器假设数据是来自分布全范围的随机样本,在本例中为 -Inf 到 +Inf。在上面的第二种情况下,没有低于零的数据。样本均值估计器看不到你那里只有半个高斯,它总是一个正数。

另一方面,最小二乘拟合过程的曲线拟合方法(可能通过 EM 或其他十几种算法中的任何一种)可以将数据视为具有高斯密度形状的曲线的一部分。如果数据只是向上弯曲,它将适合高斯的左侧。如果它向下弯曲,它将适合右侧。如果它是平坦的,它将以非常大的方差将其拟合到峰值或尾部,甚至可能退化并被零除。

因此,您正在对分布或曲线拟合进行参数估计,这是完全不同的事情。

假设您的数据确实是高斯的,拟合高斯的最佳方法是简单地计算数据的均值和方差(样本均值和样本方差)并使用这些参数高斯拟合。即适合的时刻。不需要任何复杂的 EM 估计或监督学习。

使用估计矩进行拟合的唯一可能缺点是,如果您的样本很小,您可能对异常点过于敏感,因此您必须小心。