arrays - distancia - calculo de similitud de coseno
Encuentra similitud coseno entre dos matrices (6)
Me pregunto si hay una función incorporada en R que pueda encontrar la similitud de coseno (o distancia de coseno) entre dos matrices
Actualmente, implementé mi propia función, pero no puedo evitar pensar que R ya debería venir con una.
Este tipo de preguntas surgen todo el tiempo (para mí, y como lo demuestra la lista de preguntas SO etiquetadas con r : otras también):
¿hay una función, ya sea en el núcleo R o en cualquier paquete R, que hace x? y de ser así,
¿Dónde puedo encontrarlo entre los paquetes +2000 R en CRAN?
respuesta corta: pruebe el paquete sos cuando surjan este tipo de preguntas
Una de las respuestas anteriores dio coseno junto con un enlace a su página de ayuda. Probablemente esto es exactamente lo que quiere el OP. Cuando mira la página enlazada a, ve que esta función está en el paquete lsa .
Pero, ¿cómo encontraría esta función si no supiera en qué Paquete buscarla?
siempre puedes probar las funciones de ayuda estándar de R (">" a continuación solo significa la línea de comando R):
> ?<some_name>
> ??<some_name>
> *apropos*<some_name>
si estos fallan, entonces instale y cargue el paquete sos , entonces
***findFn***
findFn también tiene un alias de "???", aunque no lo uso a menudo porque no creo que puedas pasar argumentos que no sean el nombre de la función
Para la pregunta aquí, prueba esto:
> library(sos)
> findFn("cosine", maxPages=2, sortby="MaxScore")
Los argumentos adicionales pasados en ("maxPages = 2" y "sortby =" MaxScore ") solo limitan el número de resultados devueltos, y especifican cómo se clasifican los resultados, respectivamente, es decir," encuentre una función llamada ''coseno'' o que tiene el término ''coseno'' en la descripción de la función, solo devuelve dos páginas de resultados y ordénelos por puntuación de relevancia descendente "
La llamada findFn anterior devuelve un marco de datos con nueve columnas y los resultados como filas, representados como HTML.
Escaneando la última columna, Descripción y Enlace , elemento (fila) 21, se encuentra:
Medidas Cosinas (Matrices)
este texto es también un enlace; al hacer clic en él, se accede a la página de ayuda para esa función en el Paquete que contiene esa función, en otras palabras
utilizando findFn , puede encontrar rápidamente la función que desea aunque no tenga idea de en qué paquete se encuentra
Marque estas funciones lsa::cosine() , clv::dot_product() y arules::dissimilarity()
Parece que ya hay algunas opciones disponibles, pero acabo de encontrar una solución idiomática que me gusta, así que pensé en agregarla a la lista.
install.packages(''proxy'') # Let''s be honest, you''ve never heard of this before.
library(''proxy'') # Library of similarity/dissimilarity measures for ''dist()''
dist(m, method="cosine")
Si tiene una matriz de productos de puntos, puede usar esta función para calcular la matriz de similitud de coseno:
get_cos = function(S){
doc_norm = apply(as.matrix(dt),1,function(x) norm(as.matrix(x),"f"))
divide_one_norm = S/doc_norm
cosine = t(divide_one_norm)/doc_norm
return (cosine)
}
La entrada S es la matriz del producto de puntos. Simplemente, S = dt %*% t(dt)
, donde dt
es su conjunto de datos.
Esta función es básicamente dividir el producto de puntos por las normas de los vectores.
También puede consultar el paquete vegano: http://cran.r-project.org/web/packages/vegan//index.html
La función vegdist en este paquete tiene una variedad de funciones de diferencia (distancia), como manhattan
, euclidean
, canberra
, bray
, kulczynski
, jaccard
, gower
, altGower
, morisita
, horn
, mountford
, raup
, binomial
, chao
o cao
. Consulte el archivo .pdf en el paquete para obtener una definición o consulte las referencias https://stats.stackexchange.com/a/33001/12733 .
Tomando el comentario de Jonathan Chang, escribí esta función para imitar dist. No hay paquetes adicionales para cargar.
cosineDist <- function(x){
as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2)))))
}