对于某些 class 解而非其他解,熵输出为 NaN
Entropy output is NaN for some class solutions and not others
我是 运行 R 中的潜在 class 分析并使用熵函数。我想了解为什么在输出中,它会为较低的 nclasses 生成结果,然后为较高的 Nclasses 生成 NaN。
我是软件初学者!
此处供参考,是输出和代码:
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_2class$P) # Class proportions
> error_post <- mean(apply(France_2class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8121263
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_3class$P) # Class proportions
> error_post <- mean(apply(France_3class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8139903
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_4class$P) # Class proportions
> error_post <- mean(apply(France_4class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_5class$P) # Class proportions
> error_post <- mean(apply(France_5class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_6class$P) # Class proportions
> error_post <- mean(apply(France_6class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
有人可以帮忙吗?谢谢
我猜问题出在entropy
的定义上。更准确地说,如果0
包含在p
中,那么您将获得NaN
,例如
> entropy(p1)
[1] 1.279854
> entropy(p2)
[1] NaN
> entropy(p3)
[1] 0.5004024
要修复它,您可以将 na.omit
添加到函数 entropy
中,如下所示
entropy<-function(p) sum(na.omit(-p*log(p)))
然后你可以看到
> entropy(p1)
[1] 1.279854
> entropy(p2)
[1] 0.5004024
> entropy(p3)
[1] 0.5004024
数据
p1 <- c(0.1,0.2,0.3,0.4)
p2 <- c(0,0.2,0.8)
p3 <- c(0.2,0.8)
我是 运行 R 中的潜在 class 分析并使用熵函数。我想了解为什么在输出中,它会为较低的 nclasses 生成结果,然后为较高的 Nclasses 生成 NaN。
我是软件初学者!
此处供参考,是输出和代码:
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_2class$P) # Class proportions
> error_post <- mean(apply(France_2class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8121263
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_3class$P) # Class proportions
> error_post <- mean(apply(France_3class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] 0.8139903
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_4class$P) # Class proportions
> error_post <- mean(apply(France_4class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_5class$P) # Class proportions
> error_post <- mean(apply(France_5class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
>
> entropy<-function (p) sum(-p*log(p))
> error_prior <- entropy(France_6class$P) # Class proportions
> error_post <- mean(apply(France_6class$posterior, 1, entropy))
> R2_entropy <- (error_prior - error_post) / error_prior
> R2_entropy
[1] NaN
有人可以帮忙吗?谢谢
我猜问题出在entropy
的定义上。更准确地说,如果0
包含在p
中,那么您将获得NaN
,例如
> entropy(p1)
[1] 1.279854
> entropy(p2)
[1] NaN
> entropy(p3)
[1] 0.5004024
要修复它,您可以将 na.omit
添加到函数 entropy
中,如下所示
entropy<-function(p) sum(na.omit(-p*log(p)))
然后你可以看到
> entropy(p1)
[1] 1.279854
> entropy(p2)
[1] 0.5004024
> entropy(p3)
[1] 0.5004024
数据
p1 <- c(0.1,0.2,0.3,0.4)
p2 <- c(0,0.2,0.8)
p3 <- c(0.2,0.8)