2016-05-12 6 views
0

J'ai une matrice nommée vecteurs [i] [j] .Je voudrais calculer la similarité cosinus entre chaque ligne. Par exemple, pour ce matrice Similitude cosinus de chaque ligne dans une matrice

1 0 1 0 1 0 0 
v= 0 0 1 1 1 0 1 
    1 1 0 0 1 0 1 

Je veux avoir le calcul de similarité entre row1 et la ligne 2, row1 et row3, row2 et row3.Further plus si similitude entre row1 row2 égales = 0,6 et d'autres 0,5 et 0,4 respectivement . Je voudrais ajouter cette valeur sur chaque élément (e =! 0) de ces éléments aux lignes et obtenir la matrice finale comme ceci.

2.1 0 2.1 0 2.1 0 0 
v= 0  0  2 2 2  0 2 
    1.9 1.9 0 0 1.9 0 1.9 

Voici la partie du code où j'ai défini et rempli ma matrice;

string text = Request.Form["TextBox1"]; ; // text 
      string[] textInArray = text.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); 
      int[,] vectors = new int[textInArray.Length, keywords.Length]; 

      for (int i = 0; i < textInArray.Length; i++) 
      { 
       string[] words = textInArray[i].Split(' '); 
       for (int j = 0; j < keywords.Length; j++) 
       { 
        foreach (var word in words) 
        { 
         if (word.Contains(keywords[j])) 
         { 
          vectors[i, j]++; 
         } 
        } 
       } 
      } 

et voici mon code pour calculer la similarité mais je pense qu'il est pas complète quelque part je erreurs et je ne sais pas comment puis-je ajouter cette valeur sur les éléments de deux courants lignes.

for(i=1 i<matrix.GetLength(0) i++){ 
    for(j=1 j<matrix.GetLength(0) j++){ 
      dot += vectors[i] * vectors[j]; 
      mag1 += Math.Pow(vectors[i], 2); 
      mag2 += Math.Pow(vectors[j], 2); 
     } 

     float M= dot/(Math.Sqrt(mag1) * Math.Sqrt(mag2)); 

} 
} 
+1

La balise asp.net supprimée comme question ne semble pas liée à asp.net de quelque façon que ce soit, ajouté C# – Andrei

Répondre

1

Décompressez votre solution! Extrait Similarity méthode

private static double Similarity(double[] left, double[] right) { 
    double ab = 0.0; 
    double aa = 0.0; 
    double bb = 0.0; 

    for (int i = 0; i < left.length; ++i) { 
    aa += left[i] * left[i]; 
    ab += left[i] * right[i]; 
    bb += right[i] * right[i]; 
    } 

    // do not forget degenerated cases: all-zeroes vectors 
    if (aa == 0) 
    return bb == 0 ? 1.0 : 0.0; 
    else if (bb == 0) 
    return 0.0; 
    else 
    return ab/Math.Sqrt(aa)/Math.Sqrt(bb); 
} 

Et puis mettre la simple logique

// vectors[][] is an array of array, so we can get lines easily by vectors[0] etc. 
double sim12 = Similarity(vectors[0], vectors[1]); 
double sim23 = Similarity(vectors[1], vectors[2]); 
double sim13 = Similarity(vectors[0], vectors[2]); 

// compare double with tolerance 
if ((Math.Abs(sim12 - 0.6) < 1e-10) && 
    (Math.Abs(sim13 - 0.5) < 1e-10) && 
    (Math.Abs(sim23 - 0.4) < 1e-10)) { 
    //TODO: update the matrix 
} 

Modifier: car, en fait vectors est double[,] (tableau 2D)

private static double Similarity(double[,] matrix, int left, int right) { 
    double ab = 0.0; 
    double aa = 0.0; 
    double bb = 0.0; 

    for (int i = 0; i < matrix.GetLength(1); ++i) { 
    aa += matrix[left, i] * matrix[left, i]; 
    ab += matrix[left, i] * matrix[right, i]; 
    bb += matrix[right, i] * matrix[right, i]; 
    } 

    if (aa == 0) 
    return bb == 0 ? 1.0 : 0.0; 
    else if (bb == 0) 
    return 0.0; 
    else 
    return ab/Math.Sqrt(aa)/Math.Sqrt(bb); 
} 

...

double sim12 = Similarity(vectors, 0, 1); 
double sim23 = Similarity(vectors, 1, 2); 
double sim13 = Similarity(vectors, 0, 2); 
+0

J'ai cette erreur "Wrong number of indices inside []; attendu 2 "\t pour le linedouble sim12 = Similitude (....) Pensez-vous que c'est parce que j'ai défini ma matrice au début comme ceci? int [,] vecteurs = new int [textInArray.Length, keywords.Length ]; – dpointttt

+0

@: dpointttt: * c'est * Si vous avez une matrice comme dans * la question * 'vecteurs [i] [j]' ie * tableau de tableau * mon code fera, mais si vous l'avez réellement mis ' int [,] vecteurs' ie * 2D array * mon code ne le fera pas Les tableaux de array (alias * jugged array *) sont beaucoup plus flexibles que ceux en 2D –

+0

@: dpointttt: cependant, le principe principal est le même: * extrait méthode * quelle que soit la représentation de la matrice –