2010-03-29 19 views
18

Me pregunto si hay una función incorporada en R que pueda encontrar la similitud del coseno (o distancia del coseno) entre dos matrices?Buscar similitud del coseno entre dos matrices

Actualmente, implementé mi propia función, pero no puedo evitar pensar que R ya debería venir con una.

+26

¿Realmente necesita R una nueva función solo para 'x% *% y/sqrt (x% *% x * y% *% y)'? –

+1

Esta publicación muestra cómo crear una matriz de coincidencia y luego calcular la similitud del coseno - http://stackoverflow.com/a/24627329/168689 – Rob

+0

También consulte https://stackoverflow.com/questions/8158867/most-efficient- c-coseno-cálculo –

Respuesta

59

Este tipo de preguntas vienen todo el tiempo (para mí - y como lo demuestra el r-etiquetados SO lista de preguntas - otros también):

hay una función, ya sea en el núcleo R o en cualquier paquete R, que hace x? y si es así,

¿dónde puedo encontrarlo entre los +2000 R Paquetes en CRAN?

respuesta corta: entregue el paquete sos una prueba cuando este tipo de preguntas vienen a

Una de las respuestas anteriores dieron coseno junto con un enlace a su página de ayuda. Esto es probablemente lo que quiere el OP. Cuando mira la página enlazada, ve que esta función se encuentra en el paquete lsa.

Pero ¿cómo podría encontrar esta función si aún no sabía en qué paquete buscarla?

siempre se puede probar las funciones R de ayuda estándar (">" a continuación sólo significa que la línea de comandos R):

> ?<some_name> 

> ??<some_name> 

> *apropos*<some_name> 

Si esto no funciona, a continuación, instalar & carga de los sos paquete y, a continuación

***findFn*** 

findFn también es alias de "???", tú gh no suelo usar eso porque yo no creo que se pueda pasar más argumentos que el nombre de la función

para la pregunta aquí, intente esto:

> library(sos) 

> findFn("cosine", maxPages=2, sortby="MaxScore") 

Los argumentos adicionales aprobadas en (" maxPages = 2 "y" sortby = "MaxScore") solo limita el número de resultados devueltos, y especifica cómo se clasifican los resultados, respectivamente - es decir, "encuentra 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 las ordena desglosando la puntuación de relevancia "

findFn llamada anterior devuelve un marco de datos con nueve columnas y los resultados como filas, representados como HTML.

El escaneo de la última columna, Descripción y Link, elemento (fila) 21 En la Categoría:

Medidas coseno (matrices)

este texto es también un enlace; al hacer clic en que le lleva a la página de ayuda para esa función en el paquete que contiene dicha función - en otras palabras

usando findFn, se puede encontrar con bastante rapidez la función que desea a pesar de que usted no tiene ninguna idea de cuál es el paquete que está en

+0

gracias por la información. ¡Probablemente resolverá muchos de mis problemas en el futuro! – defoo

+5

+100 @doug por no ser un idiota y responder con una gran respuesta que es una herramienta de enseñanza! ¡La manera de ser! –

5

también puede comprobar el paquete vegetariana: http://cran.r-project.org/web/packages/vegan//index.html

el vegdist función en este paquete tiene una variedad de funciones de disimilitud (distancia), como manhattan, euclidean, canberra, bray, kulczynski, jaccard, gower, altGower, morisita, horn, mountford, raup, binomial, chao o cao. Consulte el .pdf en el paquete para obtener una definición o consulte las referencias https://stats.stackexchange.com/a/33001/12733.

11

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))))) 
} 
+0

¿por qué hiciste 1- x * t (x)/(...)? ¿Es ese valor de desemejanza en lugar de similitud? – alily

+1

@alily la fórmula coseno da una similitud. Es 1 si los vectores apuntan en la misma dirección. Las medidas de distancia necesitan que el valor sea 0 cuando los vectores son iguales, entonces 1 - similitud = distancia. Muchos usos necesitan distancia en lugar de similitud ('hclust' por ejemplo). Agregando el formato 'as.dist' la matriz como una buena distancia R (básicamente una matriz triangular). Espero que ayude. – pbible

16

Parece que algunas opciones ya están disponibles, pero sólo se topó con una solución idiomática me gusta, así que pensé que me gustaría añadir 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") 
+0

Sí, no conozco el paquete proxy antes, pero no creo que sea un paquete necesario ... –

0

Si tiene una matriz de producto escalar, puede utilizar esta función para calcular la matriz de similitud del 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) 
} 

entrada S es la matriz del producto escalar. Simplemente, S = dt %*% t(dt), donde dt es su conjunto de datos.

Esta función consiste básicamente en dividir el producto de puntos por las normas de los vectores.

Cuestiones relacionadas