Je veux savoir s'il existe un moyen possible de calculer le coefficient de Jaccard en utilisant la multiplication matricielle.
J'ai utilisé ce code
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]
}
}
C'est tout à fait correct à implémenter dans R. J'ai fait la similitude des dés, mais je suis resté coincé avec Tanimoto / Jaccard. Quelqu'un peut-il aider?
vegan
package. Je pense qu'ils ont également tendance à être assez bien optimisés pour la vitesse.Réponses:
Ensuite nous avons:
J'ai vérifié numériquement si ces formules donnent un résultat correct. Ils font.
la source
not X
est X où 1-> 0, 0-> 1. Et toute division ici est une division élément par élément. Veuillez corriger ma notation si vous voyez qu'elle n'est pas appropriée.La solution ci-dessus n'est pas très bonne si X est rare. Parce que prendre! X créera une matrice dense, prenant énormément de mémoire et de calcul.
Une meilleure solution consiste à utiliser la formule Jaccard [i, j] = #common / (#i + #j - #common) . Avec des matrices clairsemées, vous pouvez le faire comme suit (notez que le code fonctionne également pour les matrices non clairsemées):
la source
Cela peut vous être utile ou non, selon vos besoins. En supposant que la similitude entre les affectations de cluster vous intéresse:
Le coefficient de similitude Jaccard ou l' indice Jaccard peut être utilisé pour calculer la similitude de deux affectations de clustering.
Compte tenu des étiquetages
L1
etL2
, Ben-Hur, Elisseeff et Guyon (2002) ont montré que l'indice de Jaccard peut être calculé en utilisant les produits scalaires d'une matrice intermédiaire. Le code ci-dessous exploite cela pour calculer rapidement l'index Jaccard sans avoir à stocker les matrices intermédiaires en mémoire.Le code est écrit en C ++, mais peut être chargé dans R à l'aide de la
sourceCpp
commande.la source