Ich habe einen tatsächlichen Datenrahmen (df) von Spalten = 2000 und Zeilen = 10000. Der Einfachheit halber beschreibe ich mein Problem mit einem Dummy-df von 1 Zeile und 10 Spalten. Ich möchte die KLD für jede Zelle des df berechnen. Jeder Index jeder Reihe wird durch die Summe dieser Reihe geteilt, so dass, wenn ich row1
als ein Vektor betrachte, es zu 1
zusammenfassen wird. Zur Berechnung Kullback-Leibler-Divergenz (KLD) benötigen wir 2 Vektoren Aufsummieren zu 1. In meinem Fall die KLD für df[1,1]
die vector1
wird die erste Zeile zu berechnen und die vector2
die gleiche Länge wie vector1
haben (10), wobei der Index 1 enthält den Wert 1
, während alle anderen Werte 0
sind.Berechnung KLD für jedes Element eines Datenrahmens
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)
ähnlicher Weise zur Berechnung des KLD df[1,2]
, vector1 wird wieder die row1 und vector2 wird ein Vektor der Länge 10 sein, wobei der Index 2 1 sein wird, während alle anderen Werte werden 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)
Und so weiter, ich berechne KLD für jedes Element in der DF.
Kann mir jemand dabei helfen, wie kann ich diese Funktion zu jedem Index von df iterieren. Ihre Hilfe wird sehr geschätzt.
EDIT:
die gesamte Anzahl Schritte werden Folgende zur Berechnung des KLD eines jeden Index meiner df
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)
Hier können Sie, dass für row1 der vector1 sehen das gleiche jedes Mal bleibt, Es ist nur der Vektor 2, der sich ändert.
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
https://www.r-bloggers.com/using-apply-sapply-lapply-in -r/ – Vincent
@Vincent Danke. Aber wie mache ich solch einen "gaver2" jedes Mal? – Newbie
Ist Ihr Wunschergebnis für eine Zeile i = 1 bis 10 'sum (Ai * Log (Ai))' (Entschuldigung für die schlecht formatierte Summenformel) – Mako212