Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混合建模-exp()和log()中具有无限值的Trouble_R_Infinity_Mixture Model - Fatal编程技术网

混合建模-exp()和log()中具有无限值的Trouble

混合建模-exp()和log()中具有无限值的Trouble,r,infinity,mixture-model,R,Infinity,Mixture Model,我正在为具有球形协方差结构的高斯混合模型编写一个函数——即$\Sigma\u k=\Sigma\u k^2 I$。此特定功能类似于带有标识符VII的mclust包 不管怎样,我遇到的问题是,权重矩阵的值是无穷大的定义:设W为n x m矩阵,其中n=1,…,n(OB数)和m=1,…,m(混合数)。W(即W_ij)的每个元素基本上可以定义为以下元素的特定形式: w_im = \frac{a / b * exp(c)}{\sum_i=1^m [a_i / b_i * exp(c_i)]} 通过数值

我正在为具有球形协方差结构的高斯混合模型编写一个函数——即
$\Sigma\u k=\Sigma\u k^2 I$
。此特定功能类似于带有标识符VII的
mclust

不管怎样,我遇到的问题是,权重矩阵的值是无穷大的定义:设W为n x m矩阵,其中n=1,…,n(OB数)和m=1,…,m(混合数)。W(即W_ij)的每个元素基本上可以定义为以下元素的特定形式:

w_im = \frac{a / b * exp(c)}{\sum_i=1^m [a_i / b_i * exp(c_i)]}
通过数值计算,我得到了无穷多的值。所以我尝试使用log标识
log(x+y)=log(x)+log(1+y/x)
。但问题是它不像
log(x+y)
那么简单,而是
log(\sum\u i=1^m[a\u i/b\u i*exp(c\u i)])

下面是一些代码定义:

  • n_im=a/b*exp(c)
  • d_u.m=\sum_i=1^m[a_i/b_i*exp(c_i)]
    ;及
  • c_mat[i,j]
    作为第[i,j]项的指数值

    n_mat[, i] <- log(a[i]) - log(b[i]) - c[,i] # numerator of w_im
    internal_vec1[i] <- (a[i] * b[1])/ (a[1] * b[i]) # an internal for the step below
    c_mat2 <- cbind(rep(1, n), c_mat[,1] - c_mat[,-1]) # since e^a / e^b = e^(a-b)
    for (i in 1:n) {
          d_vec[i] <- n_mat[i,1] + log(sum(internal_vec1 * exp(c_mat2[i,))) 
    } ## still getting infinite values
    
    n_mat[,i]这是解决方案!!(我在这上面花的时间太长了)

    **第一个函数
    log\u plus()
    解决了需要log(\sum\u{i=1)^n x\u i)的简单问题

    **第二个函数
    log\u plus2()
    解决了上面描述的更复杂的问题,其中需要log(\sum\u{i=1}^n[a\u i/b\u i*exp(c\u i)])


    log\u plus发布R代码(而不是伪Latex)和完整的错误消息。不要忘记日志(0)将抛出一个错误。我对其余的代码没有问题,只有这一段。我认为完整的代码只会使事情复杂化…也就是说,如果没有人有其他想法,我可以发布它。没有错误消息。相反,我正在收敛到等效的群集,而不是多个不同的群集。调试101规则是:制作一个小测试用例,让你知道正确答案是什么,然后逐项测试,看看哪里出了问题。至少就我对SO参与规则的理解而言,这在硬代码级别上还不够表达,可能还需要在数学或统计论坛上发布。
    
    log_plus <- function(xvec) {
      m <- length(xvec)
      x <- log(xvec[1])
      for (j in 2:m) {
        sum_j <- sum(xvec[1:j-1])
        x <- x + log(1 + xvec[j]/sum_j)
      }
      return(x)
    }
    
    log_plus2 <- function(a, b, c) {
      # assumes intended input of form sum(a/b * e^c)
      if ((length(a) != length(b)) || (length(a) != length(c))) {
        stop("Input equal length vectors")
      }
      if (!(all(c > 0) || all(c < 0))) {
        stop("All values of c must be either > 0 or  < 0.")
      }
      m <- length(a)
      # initilialize log sum
      x <- log(a[1]) - log(b[1]) + c[1]
      # aggregate / loop log sum
      for (j in 2:m) { 
        # build denominator
        b2 <- b[1:j-1]
        for (i in 1:j-1) {
          d1 <- 0
          c2 <- c[1:i]
          if (all(c2 > 0)) {
            c_min <- min(c2[1:j-1])
            c2 <- c2 - c_min 
          } else if (all(c2 < 0)) {
            c_min <- max(c2[1:j-1])
            c2 <- c2 - c_min
          }
          d1 <- d1 + a[i] * prod(b2[-i]) * exp(c2[i])
        }
        den <- b[j] * (d1)
        num <- a[j] * prod(b[1:j-1]) * exp(c[j] - c_min)
        x <- x + log(1 + num / den)
      }
      return(x)
    }