我想构建一个计算两个离散概率分布之间相对熵的函数。
以下尝试有效:
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
这是不正确的
答案 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