Quero saber se existe alguma maneira possível de calcular o coeficiente de Jaccard usando a multiplicação de matrizes.
Eu usei esse 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]
}
}
Isso é bastante aceitável para implementar em R. Eu fiz a semelhança de dados, mas fiquei preso com Tanimoto / Jaccard. Alguém pode ajudar?
r
matrix
binary-data
association-measure
similarities
user4959
fonte
fonte
vegan
pacote. Eu acho que eles tendem a ser bastante otimizados para velocidade também.Respostas:
Então nós temos:
Eu verifiquei numericamente se essas fórmulas dão resultado correto. Eles fazem.
fonte
not X
é X onde 1-> 0, 0-> 1. E qualquer divisão aqui é divisão elementar. Corrija minha notação se você achar que não é apropriado.A solução acima não é muito boa se X for escasso. Porque tomar! X criará uma matriz densa, consumindo uma quantidade enorme de memória e computação.
Uma solução melhor é usar a fórmula Jaccard [i, j] = #comum / (#i + #j - #comum) . Com matrizes esparsas, você pode fazer o seguinte (observe que o código também funciona para matrizes não esparsas):
fonte
Isso pode ou não ser útil para você, dependendo de quais são suas necessidades. Supondo que você esteja interessado em similaridade entre atribuições de cluster:
O coeficiente de semelhança Jaccard ou o índice Jaccard pode ser usado para calcular a semelhança de duas atribuições de cluster.
Dadas as etiquetas
L1
eL2
, Ben-Hur, Elisseeff e Guyon (2002) mostraram que o índice de Jaccard pode ser calculado usando produtos pontuais de uma matriz intermediária. O código abaixo aproveita isso para calcular rapidamente o índice Jaccard sem precisar armazenar as matrizes intermediárias na memória.O código é escrito em C ++, mas pode ser carregado no R usando o
sourceCpp
comandofonte