Pourquoi similarité cosinus entre deux vecteurs être négatif?
J'ai 2 vecteurs à 11 dimensions.
a <- c(-0.012813841, -0.024518383, -0.002765056, 0.079496744, 0.063928973,
0.476156960, 0.122111977, 0.322930189, 0.400701256, 0.454048860,
0.525526219)
b <- c(0.64175768, 0.54625694, 0.40728261, 0.24819750, 0.09406221,
0.16681692, -0.04211932, -0.07130129, -0.08182200, -0.08266852,
-0.07215885)
cosine_sim <- cosine(a,b)
qui retourne:
-0.05397935
J'ai utilisé cosine()
de lsa
paquet.
pour certaines valeurs, je suis négatif cosine_sim comme le donné un. Je ne suis pas sûr de savoir comment la similitude peut être négatif. Elle doit être comprise entre 0 et 1.
Quelqu'un peut-il expliquer ce qui se passe ici.
regardez le lien wikipédia pour le cosinus de similarité (en.wikipedia.org/wiki/Cosine_similarity). il cleary les valeurs se situent entre -1 et 1, -1 indiquant complète dissemblance et 1 indiquant similitude.
L'indice est dans le nom. Le trigometric fonction cosinus peut prendre des valeurs allant de -1 à 1, de sorte que vous pourrait s'attendre à celle-là.
Même question sur CrossValidated: Est-il ok pour obtenir négatif Similarité Cosinus à l'aide de LSA?
L'indice est dans le nom. Le trigometric fonction cosinus peut prendre des valeurs allant de -1 à 1, de sorte que vous pourrait s'attendre à celle-là.
Même question sur CrossValidated: Est-il ok pour obtenir négatif Similarité Cosinus à l'aide de LSA?
OriginalL'auteur Robin | 2011-07-06
Vous devez vous connecter pour publier un commentaire.
La bonne chose à propos de R, c'est que vous pouvez souvent creuser dans les fonctions et de voir par vous-même ce qui se passe. Si vous tapez
cosine
(sans les parenthèses, les arguments, etc.) alors R imprime le corps de la fonction. Piquer à travers elle (ce qui prend un peu de pratique), vous pouvez voir qu'il ya un tas de machines pour le calcul de la deux à deux les similitudes entre les colonnes de la matrice (c'est à dire, le peu enveloppé dans l'if (is.matrix(x) && is.null(y))
condition, mais la clé de la ligne de la fonction estAllons et de l'appliquer à votre exemple:
Donc, vous êtes à l'aide de vecteurs qui sont déjà normalisées, de sorte que vous avez juste
crossprod
à regarder. Dans votre cas, c'est l'équivalent de(pour de vrai les opérations matricielles,
crossprod
est beaucoup plus efficace que de construire de l'opération équivalente à la main).@Jack Maney la réponse dit, le produit scalaire de deux vecteurs (qui est la longueur(a)*longueur(b)*cos(a,b)) peut être négatif ...
Pour ce que ça vaut, je soupçonne que l'
cosine
fonction danslsa
peut-être plus facilement/efficacement mise en œuvre de la matrice des argumentsas.dist(crossprod(x))
...modifier: dans les commentaires sur un désormais supprimé réponse ci-dessous, j'ai suggéré que le carré du cosinus-mesure de la distance pourrait être approprié si l'on veut une mesure de similarité sur [0,1] -- ce serait analogue à l'aide du coefficient de détermination (r^2) plutôt que le coefficient de corrélation (r) - mais il pourrait aussi être la peine de revenir et de penser plus sérieusement sur le but et la signification des mesures de similarité pour être utilisé ...
OriginalL'auteur Ben Bolker
La
cosine
fonction renvoieDans ce cas, les deux termes dans le dénominateur sont 1, mais
crossprod(a, b)
est -0.05.OriginalL'auteur Richie Cotton
La fonction cosinus peut prendre des valeurs négatives.
OriginalL'auteur
Tandis que le cosinus de deux vecteurs peut prendre n'importe quelle valeur comprise entre -1 et +1, cosinus similitude (en dicument récupération) utilisé pour prendre des valeurs dans [0,1] de l'intervalle. La raison en est simple: dans le WordxDocument de la matrice il n'y a pas de valeurs négatives, de sorte que le maximum de l'angle de deux vecteurs est de 90 degrés, pour qui le cosinus est de 0.
OriginalL'auteur Surjan