2011-09-26 14 views
6

Estoy tratando de encontrar la similitud del coseno entre 2 vectores (x, y Puntos) y estoy cometiendo un error tonto que no puedo identificar. Perdóneme soy un novato y lo siento si estoy cometiendo un error muy simple (que probablemente sea).Código de similitud de coseno (vectores no de término)

Gracias por su ayuda

public static double GetCosineSimilarity(List<Point> V1, List<Point> V2) 
    { 
     double sim = 0.0d; 
     int N = 0; 
     N = ((V2.Count < V1.Count)?V2.Count : V1.Count); 
     double dotX = 0.0d; double dotY = 0.0d; 
     double magX = 0.0d; double magY = 0.0d; 
     for (int n = 0; n < N; n++) 
     { 
      dotX += V1[n].X * V2[n].X; 
      dotY += V1[n].Y * V2[n].Y; 
      magX += Math.Pow(V1[n].X, 2); 
      magY += Math.Pow(V1[n].Y, 2); 
     } 

     return (dotX + dotY)/(Math.Sqrt(magX) * Math.Sqrt(magY)); 
    } 

Editar: Aparte de la sintaxis, mi pregunta era también que ver con la construcción lógica dado que estoy tratando con vectores de diferentes longitudes. Además, ¿cómo es que lo anterior se puede generalizar a vectores de m dimensiones? Gracias

+0

Te estás confundiendo con índices y X, Y. El índice en cada lista debe representar componentes (es decir, 0-> x, 1-> y, 2-> z). De la otra manera, solo tendría 2 puntos V1 y V2, cada uno con una xey, que representa un vector bidimensional. No necesita tanto el índice n como .X y .Y – JohnPS

Respuesta

11

Si se encuentra en 2-dimensiones, entonces usted puede tener vectores representados como (V1.X, V1.Y) y (V2.X, V2.Y), a continuación, utilizar

public static double GetCosineSimilarity(Point V1, Point V2) { 
return (V1.X*V2.X + V1.Y*V2.Y) 
     /(Math.Sqrt(Math.Pow(V1.X,2)+Math.Pow(V1.Y,2)) 
      Math.Sqrt(Math.Pow(V2.X,2)+Math.Pow(V2.Y,2)) 
      ); 
} 

Si usted está en alto dimensiones, entonces puede representar cada vector como List<double>. Entonces, en 4 dimensiones, el primer vector tendría los componentes V1 = (V1[0], V1[1], V1[2], V1[3]).

public static double GetCosineSimilarity(List<double> V1, List<double> V2) 
{ 
    int N = 0; 
    N = ((V2.Count < V1.Count) ? V2.Count : V1.Count); 
    double dot = 0.0d; 
    double mag1 = 0.0d; 
    double mag2 = 0.0d; 
    for (int n = 0; n < N; n++) 
    { 
     dot += V1[n] * V2[n]; 
     mag1 += Math.Pow(V1[n], 2); 
     mag2 += Math.Pow(V2[n], 2); 
    } 

    return dot/(Math.Sqrt(mag1) * Math.Sqrt(mag2)); 
} 
+0

¡Muchas gracias! Has sido de gran ayuda. – Mikos

1

La última línea debe ser

return (dotX + dotY)/(Math.Sqrt(magX) * Math.Sqrt(magY)) 
Cuestiones relacionadas