将 n 个高斯的总和拟合到 xy 数据,并计算 R 中 n 的最佳个数

Fit a sum of n gaussians to xy-data and evaluate the best number of n in R

提问人:Keizei 提问时间:9/4/2023 最后编辑:Keizei 更新时间:9/4/2023 访问量:39

问:

我想将 n 个高斯的总和拟合到我的数据中,其形式为:高斯总和

我将如何用函数拟合指定的高斯总和,而无需这里那样专门编写单独的参数。我知道过拟合会成为一个问题,因此我想拟合每个 n 数的确定系数,以图形方式确定 n 的最佳数。nls()

为了制作一个可重现的例子,我有这个代码,它类似于我的数据:


    library(ggplot2)

    # Define a Gaussian function
    gaussian <- function(x, mean, sd, amplitude) {
      amplitude * dnorm(x, mean = mean, sd = sd)
    }

    # Generate x values for plotting
    x <- seq(-10, 10, by = 0.1)

    # Define parameters for 6 Gaussian components
    params <- list(
      list(mean = -2, sd = 1, amplitude = 1),
      list(mean = -1, sd = 0.5, amplitude = 0.8),
      list(mean = 0, sd = 0.3, amplitude = 0.6),
      list(mean = 1, sd = 0.8, amplitude = 0.7),
      list(mean = 2, sd = 0.6, amplitude = 0.5),
      list(mean = 3, sd = 0.4, amplitude = 0.3)
    )

    # Initialize an empty vector to store the sum
    sum_curve <- rep(0, length(x))

    # Sum the Gaussian components
    for (param in params) {
      sum_curve <- sum_curve + gaussian(x, mean = param$mean, sd = param$sd, amplitude = param$amplitude)
    }

    # Create a data frame for plotting
    data <- data.frame(x = x, y = sum_curve)

    # Create the plot for the sum of Gaussian curves
    ggplot(data, aes(x, y)) +
      geom_line() +
      labs(title = "Sum of Gaussian Curves", x = "X", y = "Density") +
      theme_minimal()


总而言之,我恳请以下方面的帮助:

  • 设计由 N 个高斯总和组成的 NLS 函数
  • 对不同的 n(例如 1:15)执行此函数并绘制结果
  • 绘制对应决定系数与 n 的关系图
  • 绘制 n 个高斯和各个分量的总和。
R 曲线拟合 NLS 反卷积

评论

0赞 G. Grothendieck 9/9/2023
这种形式的模型将很难适应。我建议你忘掉这一点,只使用一个高斯。nls(y ~ cbind(amplitude = dnorm(x, mean = mean, sd = sd)), data, start = list(mean = 0, sd = 1), algorithm = "plinear")

答: 暂无答案