Ich möchte wissen, ob es eine Möglichkeit gibt, den Jaccard-Koeffizienten mithilfe der Matrixmultiplikation zu berechnen.
Ich habe diesen Code verwendet
jaccard_sim <- function(x) {
# initialize similarity matrix
m <- matrix(NA, nrow=ncol(x),ncol=ncol(x),dimnames=list(colnames(x),colnames(x)))
jaccard <- as.data.frame(m)
for(i in 1:ncol(x)) {
for(j in i:ncol(x)) {
jaccard[i,j]= length(which(x[,i] & x[,j])) / length(which(x[,i] | x[,j]))
jaccard[j,i]=jaccard[i,j]
}
}
Dies ist in R. in Ordnung zu implementieren. Ich habe die Würfelähnlichkeit eins gemacht, bin aber bei Tanimoto / Jaccard hängen geblieben. Kann jemand helfen?
r
matrix
binary-data
association-measure
similarities
user4959
quelle
quelle
vegan
Paket implementiert sind . Ich denke, sie sind auch ziemlich schnell optimiert.Antworten:
Wir wissen , dass Jaccard (berechnet zwischen zwei beliebigen Spalten von binären Daten ) ist eineX. , während Rogers-Tanimotoa+d isteina + b + c , wobeia + da + d+ 2 ( b + c )
, die Anzahl der Zeilen in X.a + b + c + d= n X.
Dann haben wir:
ist die quadratische symmetrische Matrix von a zwischen allen Spalten.X.'X = A. ein
sind die quadratische symmetrische Matrix von d zwischen allen Spalten ( "not X" konvertiert 1-> 0 und 0-> 1 in X).( n o t X )'( N o t X ) = D d
Also, ist die quadratische symmetrische Matrix von Jaccard zwischen allen Spalten.EINn - D.
ist die quadratische symmetrische Matrix von Rogers-Tanimoto zwischen allen Spalten.A +D.A + D + 2 ( n - ( A + D ) )= A + D.2 n - A - D.
Ich habe numerisch geprüft, ob diese Formeln das richtige Ergebnis liefern. Tun sie.
Upd. Sie können auch die Matrizen und C erhalten :B. C.
, wobei "[1]" eine Matrix von Einsen mit der Größe X bezeichnet . B ist die quadratische asymmetrische Matrix von b zwischen allen Spalten; sein Elementijist die Anzahl der Zeilen in X mit 0 in Spalteiund 1 in Spaltej.B = [ 1 ]'X - A. X. B. b X.
Folglich ist .C = B.'
Matrix kann auch auf diese Weise berechnet werden, natürlich: n - A - B - C .D. n - A - B - C.
Wenn Sie die Matrizen , können Sie eine Matrix eines beliebigen paarweisen (Dis-) Ähnlichkeitskoeffizienten berechnen, der für Binärdaten erfunden wurde.A , B , C , D.
quelle
not X
ist X, wobei 1-> 0, 0-> 1. Und jede Teilung hier ist elementweise Teilung. Bitte korrigieren Sie meine Notation, wenn Sie sehen, dass sie nicht angemessen ist.Die obige Lösung ist nicht sehr gut, wenn X dünn ist. Weil das Nehmen von! X eine dichte Matrix ergibt, die viel Speicher und Rechenaufwand beansprucht.
Eine bessere Lösung ist die Verwendung der Formel Jaccard [i, j] = #common / (#i + #j - #common) . Mit spärlichen Matrizen können Sie dies wie folgt tun (beachten Sie, dass der Code auch für nicht spärliche Matrizen funktioniert):
quelle
Dies kann für Sie nützlich sein oder auch nicht, je nachdem, welche Anforderungen Sie haben. Angenommen, Sie interessieren sich für die Ähnlichkeit zwischen Clustering-Zuweisungen:
Der Jaccard-Ähnlichkeitskoeffizient oder Jaccard-Index kann verwendet werden, um die Ähnlichkeit von zwei Clusterzuordnungen zu berechnen.
Angesichts der Markierungen
L1
undL2
haben Ben-Hur, Elisseeff und Guyon (2002) gezeigt, dass der Jaccard-Index unter Verwendung von Punktprodukten einer Zwischenmatrix berechnet werden kann. Der folgende Code nutzt dies, um den Jaccard-Index schnell zu berechnen, ohne die Zwischenmatrizen im Speicher speichern zu müssen.Der Code ist in C ++ geschrieben, kann aber mit dem
sourceCpp
Befehl in R geladen werden .quelle