2010-03-29 31 views
18

Je me demande s'il existe une fonction intégrée dans R qui peut trouver la similarité de cosinus (ou la distance cosinus) entre deux tableaux?Recherche de similarité de cosinus entre deux tableaux

Actuellement, j'ai implémenté ma propre fonction, mais je ne peux m'empêcher de penser que R devrait déjà venir avec un.

+26

R a-t-il vraiment besoin d'une nouvelle fonction juste pour 'x% *% y/sqrt (x% *% x * y% *% y)'? –

+1

Ce message montre comment créer une matrice de cooccurrence, puis calculer la similitude de cosinus - http://stackoverflow.com/a/24627329/168689 – Rob

+0

Consultez également https://stackoverflow.com/questions/8158867/most-efficient- r-cosinus-calcul –

Répondre

59

Ce genre de questions se posent tout le temps (pour moi - et comme en témoigne le r -tagged SO liste de questions - autres aussi):

Y a-t-il une fonction, soit dans le noyau R ou dans tout paquet R, qui fait x? et si oui,

où puis-je le trouver parmi les +2000 R Paquets dans CRAN?

réponse courte: donner le paquet sos un essai quand ce genre de questions se posent

L'une des réponses précédentes ont donné cosinus avec un lien vers la page d'aide. C'est probablement exactement ce que veut le PO. Lorsque vous regardez la page liée à vous voyez que cette fonction est dans le paquet lsa.

Mais comment trouveriez-vous cette fonction si vous ne saviez pas déjà quel paquet rechercher?

vous pouvez toujours essayer les fonctions d'aide standard R (">" ci-dessous signifie juste la ligne de commande R):

> ?<some_name> 

> ??<some_name> 

> *apropos*<some_name> 

si elles ne réussissent pas, installez & charge les sos package , puis

***findFn*** 

findFn est également à aliasé "???", tu gh je n'utilise pas souvent parce que je ne pense pas que vous pouvez passer des arguments autres que le nom de la fonction

pour la question ici, essayez ceci:

> library(sos) 

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

Les arguments supplémentaires passés dans (» maxPages = 2 "et" sortby = "MaxScore") limite juste le nombre de résultats retournés, et spécifie comment les résultats sont classés, respectivement - "trouver une fonction nommée 'cosinus' ou qui a le terme 'cosinus' dans la description de la fonction, seulement retourner deux pages de résultats, et les ordonner par décroissant score de pertinence "

Le findFn L'appel ci-dessus renvoie une trame de données avec neuf colonnes et les résultats sous forme de lignes, rendus en HTML.

Balayage de la dernière colonne, Description et lien, point (ligne) 21 vous trouvez:

Mesures Cosinus (matrices)

ce texte est aussi un lien; cliquant dessus vous amène à la page d'aide pour cette fonction dans le paquet qui contient cette fonction - en d'autres termes

utilisant findFn, vous pouvez très rapidement trouver la fonction que vous voulez même si vous n'avez pas idée Emballez est dans

+0

merci pour l'information. Cela va probablement résoudre beaucoup de mes problèmes dans le futur! – defoo

+5

+100 @doug pour ne pas être un douchebag et répondre avec une bonne réponse qui est un outil d'enseignement! Façon d'être! –

5

Vous pouvez également vérifier le package végétalien: http://cran.r-project.org/web/packages/vegan//index.html

la vegdist fonction dans ce package a une variété de fonctions de dissemblance (distance), tels que manhattan, euclidean, canberra, bray, kulczynski, jaccard, gower, altGower, morisita, horn, mountford, raup, binomial, chao ou cao. Veuillez vérifier le .pdf dans l'emballage pour une définition ou consulter les références https://stats.stackexchange.com/a/33001/12733.

11

En prenant le commentaire de Jonathan Chang j'ai écrit cette fonction pour imiter dist. Aucun paquet supplémentaire à charger.

cosineDist <- function(x){ 
    as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
} 
+0

pourquoi avez-vous fait 1- x * t (x)/(...)? est cette valeur de dissimilarité plutôt que de similitude? – alily

+1

@alily la formule de cosinus donne une similitude. C'est 1 si les vecteurs pointent dans la même direction. Les mesures de distance nécessitent que la valeur soit 0 lorsque les vecteurs sont identiques, donc 1 - similitude = distance. Beaucoup d'utilisations ont besoin de distance plutôt que de similarité ('hclust' par exemple). L'ajout du 'as.dist' formate la matrice comme une belle distance R (fondamentalement une matrice triangulaire). J'espère que cela pourra aider. – pbible

16

Il ressemble à quelques options sont déjà disponibles, mais je trébuché à travers une solution idiomatiques J'aime donc je pensais que je l'ajouter à la liste.

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

Oui, je ne sais pas le paquet de proxy avant, mais je ne pense pas que ce soit un paquet nécessaire ... –

0

Si vous avez une matrice de produit scalaire, vous pouvez utiliser cette fonction pour calculer la matrice de similarité cosinus:

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

entrée S est la matrice du produit scalaire. Simplement, S = dt %*% t(dt), où dt est votre jeu de données.

Cette fonction consiste essentiellement à diviser le produit scalaire par les normes des vecteurs.