【问题标题】:Entropy output is NaN for some class solutions and not others对于某些类解决方案,熵输出是 NaN,而不是其他类解决方案
【发布时间】:2025-12-22 06:15:11
【问题描述】:

我正在 R 中运行潜在类分析并使用熵函数。我想了解为什么在输出中,它会为较低的 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

有人可以帮忙吗?谢谢

【问题讨论】:

  • 你检查了字段的类别,你想找到熵吗?如果我没记错的话,熵仅适用于数字/因子类型的对象。

标签: r entropy


【解决方案1】:

我猜这个问题来自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)

【讨论】:

  • 非常感谢 Thomas,解决了这个问题!