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

时间:2019-10-27 15:43:38

标签: r plot

我正在尝试学习R,但它的工作方式存在问题。我试图从头开始制作变量p1-p的熵函数,当我尝试添加一些if以避免除以NaN时遇到问题0。

当我尝试使用图表的自定义熵时,它就可以工作,但是当我打印结果时它会显示NaN。但是当我尝试添加if时,它说:

  

xy.coords(x,y,xlabel,ylabel,log)中的错误:      “ x”和“ y”的长度不同

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')

我不理解它,因为我使用的是一个数组的绘图为x,而该数组的函数的参数为​​y,所以无论是否包含{ {1}}个。

没有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.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.6 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.99 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1

     

result = NaN 0.08079314 0.1414405 0.1943919 0.2422922 0.286397 0.3274449 0.3659237 0.4021792 0.4364698 0.4689956 0.499916 0.5293609 0.5574382 0.5842388 0.6098403 0.6343096 0.6577048 0.680077 0.7014715 0.7219281 0.7414827 0.7601675 0.7780113 0.7950403 0.8112781 0.8267464 0.98950.96900.96900.96900.96900.96900.96900.98140.96900.9547 0.9927745 0.9953784 0.9974016 0.9988455 0.9997114 1 0.9997114 0.9988455 0.9974016 0.9953784 0.9927745 0.9895875 0.985815 0.9814539 0.9765005 0.9709506 0.9647995 0.958042 0.9506721 0.9426832 0.9340681 0.9248187 0.9149264 0.904381​​5 0.8931735 0.8812909 0.8687212 0.8554508 0.8414646 0.8267464 0.87720.60.96740.60943600 094073674 0.286397 0.2422922 0.1943919 0.1414405 0.08079314 NaN

使用if s控制台:

  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.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.6 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.99 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1   result = 0 xy.coords(x,y,xlabel,ylabel,log)中的错误:     “ x”和“ y”的长度不同

3 个答案:

答案 0 :(得分:1)

您没有创建矢量而是标量,因为您没有在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')

答案 1 :(得分:0)

编辑:

即使我被建议对它进行矢量化处理,但自从我开始以来,我还是想使其与目前我所知道的其他语言有点相似。我能够修复它,尽管最终我使用了for并打印了2个数组而不是函数本身。

entropy <- function(p){

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

       result = 0

    }else{

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

    }

    return(result) 


}

x <- seq(0,1,0.01)
y <- numeric(length(p))
i = 1

for (p in x) {
    y[i] = entropy(p)
    cat(x[i],"=",y[i],"\n")
    i=i+1
}

plot(x, y, type='l', main='Funcion entropia con dos valores posibles')

答案 2 :(得分:0)

在尝试使用 entropy 函数绘制之前,我只是将您的 p 函数应用于 sapply 向量。

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)

# Apply the function over all the values of 'p'
entropy_p <- sapply(p,FUN = entropy)

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