计算数据帧的每个元素的KLD

问题描述 投票:0回答:1

我有一个实际的数据帧(df)列= 2000和行= 10000。为简单起见,我将使用1行和10列的虚拟df来描述我的问题。我想计算df的每个单元的KLD。每行的每个索引除以该行的总和,因此如果我将row1视为向量,那么它将总结为1。为了计算Kullback-Leibler散度(KLD),我们需要2个向量总和为1.在我的情况下,计算df[1,1]的KLD,vector1将是第一行,vector2将具有与vector1(10)相同的长度,其中索引1将包含值1,而所有其他值将是0

df <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)

KLD <- function(A, B) {
        sum(A * ifelse(B > 0, log(A/B), 0))
    }

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)

KLD(vector1, vector2)

类似地,为了计算df[1,2]的KLD,vector1将再次是row1,vector2将是长度为10的向量,其中索引2将是1而所有其他值将是0。

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)

KLD(vector1, vector2)

依此类推,我为df中的每个元素计算CHILD。

任何人都可以帮我这个,我怎么能把这个函数迭代到df的每个索引。非常感谢您的帮助。

编辑:

以下是计算我的df的每个指数的KLD的总步数

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 1, 0, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0)

vector1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
vector2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1)

在这里你可以看到,对于第1行,向量1每次都保持不变,它只是向量2的变化。

final output will be something like: 

output
 [1] -0.2297388 -0.1297385 -0.1051967 -0.2051999 -0.1051975 -0.1853967 -0.1151998 -0.1051967 -0.2251954 -0.1651990
r
1个回答
0
投票

如果你有一个数据帧df

row1 <- c(0.73, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03)
row2 <- c(0.64, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04)
df<-rbind(row1,row2)

还有一组向量,您希望为每行df使用输入进行KLD计算:

vector1<- c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
vector2 <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)
vectors<-rbind(vector1,vector2)

您可以使用dfvector1的每一行进行计算,例如apply()

KLD <- function(A, B) {
  sum(A * ifelse(B > 0, log(A/B), 0))
}

apply(df,1,FUN=KLD,B=vector1)

你可以使用嵌套的apply()为集合中的每个向量做到这一点:

metaKLD <- function(vect) {
  apply(df,1,FUN=KLD,B=vect)   # this makes the calculation for each row of df with a given vector
}

apply(vectors,1,FUN=metaKLD)    # this makes it happen for each vector of the set
© www.soinside.com 2019 - 2024. All rights reserved.