209 votes

Quelqu'un peut-il donner un exemple de similarité cosinus, dans de très simple, de manière graphique?

http://en.wikipedia.org/wiki/Cosine%5Fsimilarity

Pouvez-vous montrer les vecteurs ici (dans une liste ou quelque chose) Et puis faire le calcul, et nous allons voir comment il fonctionne?

Je suis un débutant.

484voto

Bill Bell Points 1357

Voici deux textes très courts pour comparer:

Texte 1: Julie m'aime plus que Linda m'aime

Texte 2: Jane m'aime plus que Julie aime-moi

Nous voulons savoir comment ces textes sont, purement en termes de nombre de mots (et en ignorant l'ordre des mots). Nous commençons par faire une liste de mots à partir de deux textes:

me Julie aime Linda que plus aime Jane

Maintenant, nous comptons le nombre de fois que chacun de ces mots apparaît dans chaque texte:

me 2 2

Julie 1 1

aime 0 1

aime 2 1

Jane 0 1

Linda 1 0

que 1 1

plus 1 1

Nous ne sommes pas intéressés par les mots eux-mêmes. Nous nous intéressons uniquement à ces deux verticale des vecteurs de compte. Par exemple, il y a deux cas de " moi " dans chaque texte. Nous allons décider de la manière de combler ces deux textes sont les uns aux autres par le calcul d'une fonction de ces deux vecteurs, à savoir le cosinus de l'angle entre eux.

Les deux vecteurs sont, encore une fois:

un: [2, 1, 0, 2, 0, 1, 1, 1]

b: [2, 1, 1, 1, 1, 0, 1, 1]

Le cosinus de l'angle entre eux est d'environ 0.822.

Ces vecteurs sont de 8 dimensions. Une vertu de l'utilisation de la similarité cosinus est clairement qu'il convertit une question qui est au-delà de la capacité humaine à visualiser que l'on peut. Dans ce cas, vous pouvez penser ce que l'angle d'environ 35 degrés qui est une certaine "distance" à partir de zéro ou de accord parfait.

130voto

mjv Points 38081

Je devine que vous êtes intéressés à obtenir un aperçu de "pourquoi" de la similarité cosinus œuvres (pourquoi il donne une bonne indication de la similitude), plutôt que "comment" il est calculé (opérations spécifiques utilisés pour le calcul). Si votre intérêt est avec ce dernier, voir la référence indiquée par Daniel dans ce post, ainsi que d' un SI Question.

Pour expliquer le comment et encore plus le pourquoi, il est utile, au premier abord, pour simplifier le problème et de travailler uniquement en deux dimensions. Une fois que vous obtenez ce en 2D, il est plus facile d'y penser en 3 dimensions, et bien sûr plus difficile à imaginer dans beaucoup plus de dimensions, mais d'ici là, nous pouvons utiliser l'algèbre linéaire pour faire le calcul numérique et également afin de nous aider à penser en termes de lignes/vecteurs / "avions" / "sphères", dans n dimensions, même si nous ne pouvons pas tirer de ces.

Donc... en deux dimensions: en ce qui concerne le texte de la similitude cela signifie que nous voudrions revenir sur les deux termes distincts, de dire les mots "Londres" et "Paris", et il faudrait compter combien de fois chacun de ces mots est de trouver dans chacun des deux documents nous voulons comparer. Cela nous donne, pour chaque document, un point dans le plan x-y, par exemple si Doc1 a Paris une fois, et à Londres quatre fois, un point à (1,4) présentera ce document (en ce qui concerne ce diminutif d'évaluation de documents). Ou, parler en termes de vecteurs, ce Doc1 document serait une flèche allant de l'origine au point (1,4). Avec cette image à l'esprit, nous allons réfléchir à ce que signifie être similaire pour les deux documents, et comment cela se rapporte à des vecteurs.

TRÈS similaire documents (de nouveau en ce qui concerne cet ensemble limité de dimensions) aurait le même nombre de références à Paris, ET le même nombre de références à Londres, ou peut-être, ils pourraient avoir le même ratio de ces références (disons un Document Doc2, avec 2 refs à Paris et 8 Refs à Londres, serait également très semblable, seulement peut-être un texte plus long ou d'une certaine manière plus répétitifs de la villes les noms, mais dans la même proportion: Peut-être les deux documents sont des guides à propos de Londres, seulement de faire passer des références à Paris (et comment cool que la ville est ;-) je plaisante!!!). Maintenant, moins de documents similaires, mai aussi, inclure des références à ces deux villes, mais dans des proportions différentes, Peut-être Doc2 voudrais seulement citer Paris une Fois et Londres 7 fois.

De retour à notre plan x-y, si nous tirons de ces documents fictifs, nous voyons que, lorsqu'ils sont TRÈS proches de leurs vecteurs de chevauchement (bien que certains vecteurs peut être plus), et qu'ils commencent à avoir de moins en commun, ces vecteurs commencent à diverger, pour avoir de plus grandes angle entre eux.

Bam! par la mesure de l'angle entre les vecteurs, on peut obtenir une bonne idée de leur similitude , et, pour rendre les choses encore plus facile, en prenant le Cosinus de cet angle, nous avons une belle, de 0 à 1 (ou -1 à 1, en fonction de quoi et comment on compte) valeur indicative de cette similitude. Plus l'angle, la plus grande (proche de 1) la valeur de cosinus, et aussi le plus grand de la similitude.

À l'extrême, si Doc1 seulement de la cites Paris et Doc2 seulement de la cites Londres, les documents n'ont absolument rien en commun. Doc1 aurait son vecteur sur l'axe des x, Doc2 sur l'axe des y, l'angle de 90 degrés, le Cosinus de 0. (BTW c'est ce que nous voulons dire quand nous disons que deux choses sont orthogonaux l'un à l'autre)

L'ajout de dimensions:
Avec cette sensation intuitive pour la ressemblance exprimé comme un petit angle (ou gros cosinus), nous pouvons maintenant imaginer des choses en 3 dimensions, dire amener dans le mot "Amsterdam" dans le mélange. Et de visualiser, assez bien, comment un document avec les deux références de chacune aurait un vecteur d'aller dans une direction particulière, et nous pouvons voir comment cette direction serait de le comparer à un document citant Paris et Londres, 3 fois chacun, mais pas Amsterdam etc.. Comme l'a dit on peut essayer d'imaginer la cette fantaisie de l'espace de 10 ou de 100 villes, dur à dessiner, mais facile à conceptualiser.

Je terminerai simplement en disant quelques mots à propos de la formule elle-même. Comme dit les autres références de fournir une bonne information sur les calculs.

D'abord, en 2 dimensions. La formule du Cosinus de l'angle entre les deux vecteurs est dérivé de la trigonométriques différence (entre l'angle a et l'angle b)

cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))

Cette formule très similaires au produit scalaire de formule:

Vect1 . Vect2 =  (x1 * x2) + (y1 * y2)

Où cos(a) correspond à la valeur de x et sin(a) la valeur de y, pour le premier vecteur. etc. Le seul problème, c'est que x, y, etc. ne sont pas exactement les cos et sin de valeurs, ces valeurs doivent être lues sur le cercle unité. C'est là que le dénominateur de la formule de coups de pied dans: en divisant par le produit de la longueur de ces vecteurs, les coordonnées x et y devenir la normalité.

25voto

tranmq Points 3715

Voici mon application en C#.

using System;

namespace CosineSimilarity
{
	class Program
	{
		static void Main()
		{
			int[] vecA = {1, 2, 3, 4, 5};
			int[] vecB = {6, 7, 7, 9, 10};

			var cosSimilarity = CalculateCosineSimilarity(vecA, vecB);

			Console.WriteLine(cosSimilarity);
			Console.Read();
		}

		private static double CalculateCosineSimilarity(int[] vecA, int[] vecB)
		{
			var dotProduct = DotProduct(vecA, vecB);
			var magnitudeOfA = Magnitude(vecA);
			var magnitudeOfB = Magnitude(vecB);

			return dotProduct/(magnitudeOfA*magnitudeOfB);
		}

		private static double DotProduct(int[] vecA, int[] vecB)
		{
			// I'm not validating inputs here for simplicity.            
			double dotProduct = 0;
			for (var i = 0; i < vecA.Length; i++)
			{
				dotProduct += (vecA[i] * vecB[i]);
			}

			return dotProduct;
		}

		// Magnitude of the vector is the square root of the dot product of the vector with itself.
		private static double Magnitude(int[] vector)
		{
			return Math.Sqrt(DotProduct(vector, vector));
		}
	}
}

23voto

userPS Points 71

Pour des raisons de simplicité je suis réduire le vecteur a et b:

Let :
    a : [1, 1, 0]
    b : [1, 0, 1]

Puis similarité cosinus (Theta):

 (Theta) = (1*1 + 1*0 + 0*1)/sqrt((1^2 + 1^2))* sqrt((1^2 + 1^2)) = 1/2 = 0.5

puis inverse de cos de 0,5 est de 60 degrés.

7voto

Andrew U Points 378

À l'aide de @Bill Bell exemple, deux façons de le faire en [R]

a = c(2,1,0,2,0,1,1,1)

b = c(2,1,1,1,1,0,1,1)

d = (a %*% b) / (sqrt(sum(a^2)) * sqrt(sum(b^2)))

ou en prenant avantage de crossprod() la méthode la performance...

e = crossprod(a, b) / (sqrt(crossprod(a, a)) * sqrt(crossprod(b, b)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X