Quiero saber si hay alguna forma posible de calcular el coeficiente de Jaccard usando la multiplicación de matrices.
Usé este código
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]
}
}
Esto está bastante bien para implementar en R. He hecho la similitud de dados, pero me quedé atascado con Tanimoto / Jaccard. ¿Alguien puede ayudar?
r
matrix
binary-data
association-measure
similarities
usuario4959
fuente
fuente
vegan
paquete. Creo que también tienden a estar bastante bien optimizados para la velocidad.Respuestas:
Sabemos que Jaccard (calculada entre dos columnas de datos binarios ) es unX , mientras que Rogers-Tanimoto esa+dunaa + b + c , dondea + da + d+ 2 ( b + c )
, el número de filas en Xa + b + c + d= n X
Entonces nosotros tenemos:
Verifiqué numéricamente si estas fórmulas dan el resultado correcto. Ellas hacen.
fuente
not X
es X donde 1-> 0, 0-> 1. Y cualquier división aquí es división por elementos. Corrija mi notación si ve que no es apropiada.La solución anterior no es muy buena si X es escasa. Porque tomar! X creará una matriz densa, que requerirá una gran cantidad de memoria y cálculo.
Una mejor solución es usar la fórmula Jaccard [i, j] = #common / (#i + #j - #common) . Con matrices dispersas puede hacerlo de la siguiente manera (tenga en cuenta que el código también funciona para matrices no dispersas):
fuente
Esto puede o no ser útil para usted, dependiendo de cuáles sean sus necesidades. Suponiendo que esté interesado en la similitud entre las tareas de agrupación:
El coeficiente de similitud de Jaccard o índice de Jaccard se pueden usar para calcular la similitud de dos asignaciones de agrupamiento.
Dados los etiquetados
L1
yL2
, Ben-Hur, Elisseeff y Guyon (2002) han demostrado que el índice Jaccard se puede calcular utilizando productos de punto de una matriz intermedia. El siguiente código aprovecha esto para rápidamente calcular el índice Jaccard sin tener que almacenar las matrices intermedias en la memoria.El código está escrito en C ++, pero se puede cargar en R usando el
sourceCpp
comando.fuente