2011-09-26 10 views
6

Sto cercando di trovare la somiglianza del coseno tra 2 vettori (x, punti y) e sto facendo un errore stupido che non riesco a definire. Pardone sono un principiante e mi dispiace se sto facendo un errore molto semplice (che molto probabilmente sono).Codice di somiglianza coseno (vettori non termici)

Grazie per il vostro aiuto

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

Edit: A parte la sintassi, la mia domanda era anche a che fare con la costrutto logico data ho a che fare con vettori di diversa lunghezza. Inoltre, come è generalizzabile per i vettori di m dimensioni. Grazie

+0

Hai confondersi con indici e X, Y. L'indice di ogni lista dovrebbe rappresentare i componenti (cioè 0-> x, 1-> y, 2-> z). Nell'altro modo avresti solo 2 punti V1 e V2, ognuno con una xey che rappresenta un vettore bidimensionale. Non hai bisogno sia dell'indice n che di .X e .Y – JohnPS

risposta

11

Se siete in 2-dimensioni, allora si può avere vettori rappresentati come (V1.X, V1.Y) e (V2.X, V2.Y), quindi utilizzare

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

Se siete in alto dimensioni quindi puoi rappresentare ogni vettore come List<double>. Quindi, in 4 dimensioni il primo vettore avrebbe componenti 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

Grazie mille! Sei stato di grande aiuto – Mikos

1

L'ultima riga dovrebbe essere

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