- という積分がある。pが確率密度分布であるとき、この積分はKLdの計算の基礎となっているし、はエントロピーである。
- の期待値とも読めるこのであるが、離散的な場合のは次のように式変形できる(こちら)
- この右辺が重み付き幾何平均であることが知られており、結局は確率変数に関する重み付き幾何平均の対数であることがわかる
- 以下、重み付き幾何平均について、一般化平均・重み付き一般化平均とともに記載する
- 一般化平均はで表される
- ただし、のときには、この式ではだめで、であることが知られている。qについて極限をとった式である
- ちなみに、q=0が幾何平均、q=1が算術平均、q=-1が調和平均、q=2がquadratic mean
- 参考
- 参考その2
- Rで確認を取れば以下のようになる
my.gen.mean <- function(x,p){
if(p==0){
ret <- (prod(x))^(1/length(x))
}else{
ret <- ((1/length(x)) * sum(x^p))^(1/p)
}
return(ret)
}
ps <- seq(from=-1,to=3,length=100)
ps <- sort(c(ps,0,1))
x <- runif(n)
out1 <- rep(0,length(ps))
for(i in 1:length(out1)){
out1[i] <- my.gen.mean(x,ps[i])
}
plot(ps,out1)
- また、重み付き一般化平均というものもある。値に重みがあり、それは割合(足すと1)であるような場合である
- この場合もやはり、q=0のときは極限の式で書いておく必要がある。
- Rで関数を作れば以下の通り
w <- runif(n)
w <- w/sum(w)
my.gen.mean2 <- function(x,w,p){
if(p==0){
ret <- prod(x^w)
}else{
ret <- (sum(w*x^p))^(1/p)
}
return(ret)
}
out2 <- rep(0,length(ps))
for(i in 1:length(out2)){
out2[i] <- my.gen.mean2(x,w,ps[i])
}
plot(ps,out2)
- さて。
- 確率分布を考え、そのばらつきの具合を評価するとき、一般化平均に加えて、次の条件が加わる。
- また、重み付き一般化平均の場合には、である
- したがって、確率分布の場合の重み付き一般化平均は
- q=0のときは
- 重み付き幾何平均の対数がであることを関数で明瞭にすれば
my.plogp <- function(p){
log(my.gen.mean2(p,p,0))
}
-であり、エントロピーは[tex:H=-\sum p \log(p)]であるので
>|r|
my.entropy <- function(p){
-my.plogp(p)
}
- 似たような指標にDiversity Indexというのがある。全体がいくつのカテゴリにどのような割合で分配されているかの指標である
- 簡単に言うと、重み付き幾何平均の逆数である。したがってであるのだが
- 慣習から、というように、のずれがある
- また、Diversity indexのWikiサイトには複数の式が挙げられていて、u,u-1問題もあいまって、わかりにくい。以下のソースでは、Wikiの式表現に沿ってDiversity indexを計算するとともに、それを重み付き幾何平均と対応付けている
n <- 10
p <- runif(n)
p <- p/sum(p)
1/prod(p^p)
exp(-sum(p*log(p)))
my.qD <- function(p,q){
if(q==1){
ret1 <- 1/prod(p^p)
ret2 <- exp(-sum(p*log(p)))
}else{
ret1 <- 1/((sum(p*p^(q-1)))^(1/(q-1)))
ret2 <- (sum(p^q))^(1/(1-q))
}
return(c(ret1,ret2))
}
q <- 1.5
my.qD(p,q)
qs <- seq(from=0,to=2,length=200)
qs <- sort(c(qs,1))
qD.out <- rep(0,length(qs))
for(i in 1:length(qs)){
qD.out[i] <- my.qD(p,qs[i])[1]
}
plot(qs,qD.out,type="l")
my.gen.mean <- function(x,p){
if(p==0){
ret <- (prod(x))^(1/length(x))
}else{
ret <- ((1/length(x)) * sum(x^p))^(1/p)
}
return(ret)
}
ps <- seq(from=-1,to=3,length=100)
ps <- sort(c(ps,0,1))
x <- runif(n)
out1 <- rep(0,length(ps))
for(i in 1:length(out1)){
out1[i] <- my.gen.mean(x,ps[i])
}
plot(ps,out1)
w <- runif(n)
w <- w/sum(w)
my.gen.mean2 <- function(x,w,p){
if(p==0){
ret <- prod(x^w)
}else{
ret <- (sum(w*x^p))^(1/p)
}
return(ret)
}
out2 <- rep(0,length(ps))
for(i in 1:length(out2)){
out2[i] <- my.gen.mean2(x,w,ps[i])
}
plot(ps,out2)
my.qD2 <- function(p,q){
ret <- 1/my.gen.mean2(p,p/sum(p),q-1)
return(ret)
}
out3 <- rep(0,length(ps))
for(i in 1:length(out3)){
out3[i] <- my.qD2(x,ps[i])
}
plot(ps,out3)