Длина 'x' и 'y' различаются в пользовательской функции энтропии - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь выучить R и у меня проблемы с тем, как это работает. Я пытался создать энтропийную функцию переменных p и 1-p с нуля, и у меня возникают проблемы, когда я пытаюсь добавить несколько if с, чтобы избежать NaN при делении на 0.

Когда я пробую пользовательскую энтропию с графиком, она просто работает, но при печати результатов показывает NaN. Но когда я пытаюсь добавить if s, то он говорит:

Ошибка в 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, так что это должно бытьодинаковые длины с if с.

Консоль без 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,140,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,61 0,58 0,53 0,61 0,82 0,53 0,640,65 0,66 0,67 0,68 0,69 0,71 0,72 0,73 0,74 0,75 0,73 0,95 * 0,90 0,01 0,7 0 0 0 0 0 0 0,7 0,8 0,8 0,81 0,92 0,93 0,94 0,94 0,96 0,97 0,98 0,99 1

результат = NaN 0,080794 0,01 0,70 022 028 0,70 029 028 0,7 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 6 0 0 0 0 ... 0 0 0 ... 0 0 ... 0,91 0,910 0,95 0,95 0,98 0,99 0 *1025* *1026* 0 = 0,70 028 028 0: 0 0,1 0 0 0 0 = 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,.. 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.8414646 0.8554508 0.8687212 0.8812909 0.8931735 0.9043815 0.9149264 0.9248187 0.9340681 0.9426832 0.9506721 0.958042 0.9647995 0.9709506 0.9765005 0.9814539 0.985815 0.9895875 0.9927745 0.9953784 0.9974016 0.9988455 +0,9997114 1 +0,9997114 0.9988455 0.9974016 0.9953784 0.9927745 0.98958750.985815 0.9814539 0.9765005 0.9709506 0.9647995 0.958042 0.9506721 0.9426832 0.9340681 0.9248187 0.9149264 0.9043815 0.8931735 0.8812909 0.8687212 0.8554508 0.8414646 0.8267464 0.8112781 0.7950403 0.7780113 0.7601675 0.7414827 0.7219281 0.7014715 0.680077 0.6577048 0.6343096 0.6098403 0.5842388 0.5574382 0.5293609 0.499916 0.4689956 0.4364698 0.4021792 0.3659237 0.3274449 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,540,55 0,56 0,57 0,58 0,59 0,6 0,6 0,6 0,63 0,6 0,95 0,90 0,90 0,90 0,90 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,95 0,96 0,97 0,90 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,96 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,90 0,96 0,90xy.coords (x, y, xlabel, ylabel, log): длины 'x' и 'y' отличаются

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Вы создали не вектор, а скаляр, поскольку не использовали векторизованную функциональность в условии 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')
0 голосов
/ 29 октября 2019

РЕДАКТИРОВАТЬ:

Даже несмотря на то, что мне предложили сделать это векторизации, я хотел сделать это несколько похожим на другие языки, которые я знаю на данный момент, так как я начинаю. Я смог это исправить, хотя в итоге я использовал 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...