2017-12-21 4 views
0

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 
+0

https://www.r-bloggers.com/using-apply-sapply-lapply-in -r/ – Vincent

+0

@Vincent Danke. Aber wie mache ich solch einen "gaver2" jedes Mal? – Newbie

+0

Ist Ihr Wunschergebnis für eine Zeile i = 1 bis 10 'sum (Ai * Log (Ai))' (Entschuldigung für die schlecht formatierte Summenformel) – Mako212

Antwort

0

Wenn Sie einen Datenrahmen 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) 

Und eine Reihe von Vektoren, die Sie für jede Zeile von df wollen werden einen Eingang für Ihre KLD Berechnung verwenden:

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) 

Sie können die Berechnung für jede Reihe von df und, sagen wir, vector1 mit apply():

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

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

Und Sie können für jeden Vektor des Satzes das tun mit einer verschachtelten 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 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, sich das anzuschauen. Ich denke, vielleicht war ich nicht klar genug, um das Problem zu erklären. In Ihrer Lösung fehlen zwei Dinge. Zuerst wird diese KLD-Formel auf jede Zelle in dem df angewendet, so dass die Ausgabe I die gleichen Dimensionen wie die Eingabe df haben wird. Zweitens ist der Teil, den ich nicht verstehe, wie ich solche Vektoren erzeugen werde, dass sie den Wert 1 haben, der dem Wert des Eingangsvektors entspricht. Bitte sehen Sie sich die Frage erneut an, ich habe sie bearbeitet. – Newbie

Verwandte Themen