混合建模-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)
}