当前位置: 首页 > 知识库问答 >
问题:

“x”和“y”长度在自定义熵函数中不同

步博涉
2023-03-14

我正在努力学习R,但我对它的工作方式有问题。我试图从头开始创建变量p1-p的熵函数,但当我试图添加一些ifs以避免用0除法时出现nan时,我遇到了问题。

当我尝试使用plot的自定义熵时,它只是工作,但当我打印结果时,它会显示nan。但是当我尝试添加if时,它会说:

entropy <- function(p){

    cat("p = " , p)

    if (p==0 || p==1) {

       result = 0

    }else{

        result = - p*log2(p)-(1-p)*log2((1-p))

    }

    cat("\nresult=",result)

    return(result) 


}

p <- seq(0,1,0.01)

plot(p, entropy(p), type='l', main='Funcion entropia con dos valores posibles')

控制台不带ifs:

p=0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.15 0.16 0.17 0.18 0.19 0.20.21 0.22 0.28 0.29 0.30.31 0.32 0.33 0.36 0.36 0.38 0.39 0.43 0.42 0.42 0.46 0.52 0.52 0.52 0.52 0.52 0.590.98 0.99 1

结果=NaN 0.08079314 0.1414405 0.1943919 0.2422922 0.286397 0.3274449 0.3659237 0.4021792 0.4364698 0.4364389 0.46842388 0.46843088 0.6577048 0.680077 0.7219281 0.741482727 0.7601675 0.7212786464646 0.882124646 0.882124646 0.886124508 0.886124508 0.886124508 0.886124509 0.886124509 0.8912909 0.8931735 0.904 3815 0.9149264 0.9248187 0.9340681 0.9426832 0.9506721 0.958042 0.96479506 0.9709506 0.986505 0.9827745 0.9974016 0.99827455 0.9974016 0.99827745 0.99927745 0.99927545 0.9895815 0.9895815 0.987505 0.99709506 0.9647995 0.958042 0.9506506 0.97095042 0.9506502 9426832 0.9340681 0.9248187 0.9248187 0.9149264 0.9043815 0.8931735 0.8812909 0.86872508 0.882674408 0.88127446 0.82127403 0.7219281 0.7219281 0.7219281 0.7219288 0.6573096 0.65742380.55842380.55842380.55842380.55842380.499990.4364690.4364690.4021790.3659237 0.3274449 0.286399 0.63574386 0.65742380.6574386 0.6574386 0.6574386 0.2422922 0.1943919 0.14144050.08079314NaN

使用if的控制台:

p=0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.15 0.16 0.17 0.18 0.19 0.20.21 0.22 0.28 0.29 0.30.31 0.32 0.33 0.36 0.36 0.38 0.39 0.43 0.42 0.42 0.46 0.52 0.52 0.52 0.52 0.52 0.590.98 0.99 1 xy.coords(x,y,xlabel,ylabel,log)中的result=0error:“x”和“y”长度不同

共有1个答案

雷曜灿
2023-03-14

您没有创建向量,而是创建了标量,因为您在if else子句中没有使用向量化功能。函数的结果只有一个数字。这应该有效:

entropy <- function(p){

  # initialize a vector of the desired length with zeros
  result <- numeric(length(p))

  # subset the vector for which you want to apply your formula on
  x <- p[!(p %in% c(0,1))]

  # overwrite only those positions for which you want to calculate values based
  # on your formula
  result[!(p %in% c(0,1))] <- - x*log2(x)-(1-x)*log2((1-x))


  #cat("\nresult=",result)

  return(result) 


}

p <- seq(0,1,0.01)

plot(p, entropy(p), type='l', main='Funcion entropia con dos valores posibles')
 类似资料:
  • 本文向大家介绍Python3.x中自定义比较函数,包括了Python3.x中自定义比较函数的使用技巧和注意事项,需要的朋友参考一下 在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢? 以min函数的定义为例,有两种重载形式: 单参数(一个迭代器): 多参数(多个待比较内容): 本文主要讨论key=func参数的使用 。举例说明吧

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • null 在看了一些帖子之后,我明白了自定义函数在使用之前需要注册,因此创建了以下类: 更新了hibernate.cfg.xml,使用了: 我似乎不明白registerFunction应该如何操作,因为im收到以下错误:ERROR sqlexceptionhelper:142-'fn_workdays'不是可识别的函数名。 log4j2.xml 任何帮助解决上述问题将非常感谢。

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 问题内容: 大家好! 我有这样的电话: 是否可以将其包装在自定义函数中 但 保留回调? 就像是: 将是这样的: 问题答案: 编辑: 最近对此表示赞同,我不得不说我不再这样做。返回a,因此您可以直接使用promise以更一致和更可靠的方式执行我在这里所做的几乎所有工作。 然后用法如下: 当然,我一直都这样做。您可以在实际的成功Callack中执行回调,也可以将回调分配为成功回调: 用法如下所示:

  • 问题内容: 我有一个像这样的角度资源 现在我想在视图中有全名,我可以添加一个方法以便在执行此操作时 而不是在html中执行以下操作 我这样做 有没有办法将此属性添加到? 问题答案: 您可以使用transformResponse将其添加为属性,但是我建议您仅向每个返回组合的名字和姓氏的对象添加一个方法: 然后使用: 使用原型添加的所有功能都将添加到Service返回的每个对象上。如果需要复杂的获取或