R中的相对熵函数

时间:2015-10-26 07:09:11

标签: r function vector

我想构建一个计算两个离散概率分布之间相对熵的函数。

以下尝试有效:

    H <- function(p1, p2, p3 = 1 - p1 - p2, q1, q2, q3 = 1 - q1 - q2) {
      p <- c(p1, p2, p3)
      q <- c(q1, q2, q3)
      return(sum(log(p^p) - log(q^p)))
}

但我想简化它,以便参数只是向量:

D<-function(x,y){
  return(sum(log(x^x)-log(y^x)))
}

哪个不起作用。这里有什么问题?你能不用输入法定义函数吗?

示例:

a<-c(0.2,0.5,0.3)
b<-c(0.4,0.4,0.2)

然后

    H(0.2,0.5,0.3,0.4,0.4,0.2) 
 0.094

这是正确的,但是:

D(a,b)
Inf

这是不正确的

1 个答案:

答案 0 :(得分:1)

这有效:

p1 <- 1
p2 <- 2
q1 <- 4
q2 <- 5

H <- function(p1, p2, q1, q2){
  p3 <- 1 - p1 - p2
  q3 <- 1 - q1 - q2
  p <- c(p1, p2, p3)
  q <- c(q1, q2, q3)
  return(sum(log(p^p) - log(q^p)))
}
H(p1, p2, q1, q2)
# [1] -0.4462871

x <- c(p1, p2, 1 - p1 - p2)
y <- c(q1, q2, 1 - q1 - q2)

D <- function(x, y){
  return(sum(log(x^x)-log(y^x)))
}
D(x, y)
# [1] -0.4462871