web-dev-qa-db-fra.com

Trouver la similitude cosinus entre deux tableaux

Je me demande s'il y a une fonction intégrée dans R qui peut trouver la similitude cosinus (ou la distance 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 une.

25
defoo

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

y a-t-il une fonction, soit dans le noyau R ou dans n'importe quel package R, qui fait x? et si oui,

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

réponse courte: essayez le paquet sos lorsque ce genre de questions se posent

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

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

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

> ?<some_name>

> ??<some_name>

> *apropos*<some_name>

si ceux-ci échouent, installez et chargez le paquet sos , puis

***findFn***

findFn est également aliasé à "???", bien que je ne l'utilise pas souvent parce que je ne pense pas que vous puissiez 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 transmis ("maxPages = 2" et "sortby =" MaxScore ") limitent simplement le nombre de résultats renvoyés et spécifient comment les résultats sont classés, respectivement - c'est-à-dire" trouver une fonction nommée 'cosinus' ou qui a le terme "cosinus" dans la description de la fonction, ne renvoie que deux pages de résultats et les classe par ordre décroissant de pertinence "

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

En parcourant la dernière colonne, Description et lien , élément (ligne) 21, vous trouvez:

Mesures de cosinus (matrices)

ce texte est aussi un lien; en cliquant dessus, vous accédez à la page d'aide de cette fonction dans le package qui contient cette fonction - en d'autres termes

en utilisant findFn, vous pouvez assez rapidement trouver la fonction que vous voulez même si vous n'avez aucune idée du paquet dans lequel il se trouve

67
doug

Il semble que quelques options soient déjà disponibles, mais je suis juste tombé sur une solution idiomatique que j'aime, alors j'ai pensé 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")
22
David Marx

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))))) 
}
16
pbible
9
George Dontas

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

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

5
user1137731

Si vous avez une matrice de produit scalaire, vous pouvez utiliser cette fonction pour calculer la matrice de similitude 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)
}

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

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

0
XY.W