Chcę wiedzieć, czy istnieje jakikolwiek sposób obliczenia współczynnika Jaccard przy użyciu mnożenia macierzy.
Użyłem tego kodu
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]
}
}
Jest to w porządku do zaimplementowania w R. Zrobiłem kostkę podobną, ale utknąłem z Tanimoto / Jaccard. Czy ktoś może pomóc?
r
matrix
binary-data
association-measure
similarities
użytkownik4959
źródło
źródło
vegan
pakiecie. Myślę, że są one również dość dobrze zoptymalizowane pod kątem prędkości.Odpowiedzi:
Wiemy, że Jaccard (obliczony między dowolnymi dwiema kolumnami danych binarnych ) to , podczas gdy Rogers-Tanimoto to , gdzieX zaa + b + c a + da + d+ 2 ( b + c )
Potem będzie:
Tak więc to kwadratowa symetryczna macierz Jaccard między wszystkimi kolumnami.An−D
Sprawdziłem numerycznie, czy te formuły dają poprawny wynik. Oni robią.
Aktualizacja Możesz także uzyskać macierze i :B C
W związku z tym .C=B′
Macierz można również obliczyć w ten sposób, oczywiście: .D n−A−B−C
Znając macierze , jesteś w stanie obliczyć macierz dowolnego (nie) współczynnika podobieństwa wymyślonego dla danych binarnych.A,B,C,D
źródło
not X
oznacza X, gdzie 1-> 0, 0-> 1. I każdy podział tutaj jest podziałem elementarnym. Proszę poprawić moją notację, jeśli uważasz, że jest nieodpowiednia.Powyższe rozwiązanie nie jest zbyt dobre, jeśli X jest rzadki. Ponieważ wzięcie! X stworzy gęstą matrycę, wymagającą dużej ilości pamięci i obliczeń.
Lepszym rozwiązaniem jest użycie formuły Jaccard [i, j] = #common / (#i + #j - #common) . W przypadku rzadkich macierzy można to zrobić w następujący sposób (zwróć uwagę, że kod działa również w przypadku macierzy nielicznych):
źródło
Może to być przydatne dla Ciebie, w zależności od Twoich potrzeb. Zakładając, że interesuje Cię podobieństwo między zadaniami klastrowania:
Współczynnik podobieństwa Jaccard lub Indeks Jaccard można wykorzystać do obliczenia podobieństwa dwóch przypisań klastrowych.
Biorąc pod uwagę labelings
L1
iL2
, Ben-Hur, Elisseeff i Guyon (2002) wykazały, że indeks jaccarda można obliczyć kropka produkty o pośrednim matrycy. Poniższy kod wykorzystuje to do szybkiego obliczenia Indeksu Jaccard bez konieczności przechowywania macierzy pośrednich w pamięci.Kod jest napisany w C ++, ale można go załadować do R za pomocą
sourceCpp
polecenia.źródło