C# 矩阵中每行的余弦相似性

C# 矩阵中每行的余弦相似性,c#,matrix,cosine-similarity,C#,Matrix,Cosine Similarity,我有一个名为vectors[I][j]的矩阵。我想计算每一行之间的余弦相似性。比如这个矩阵 1 0 1 0 1 0 0 v= 0 0 1 1 1 0 1 1 1 0 0 1 0 1 我想在第1行和第2行、第1行和第3行、第2行和第3行之间进行相似性计算。如果第1行和第2行之间的相似性分别等于0.6,其他分别等于0.5和0.4,则更进一步。我想在这些行中的每个元素(e=!0)上加上这个值,并得到这样的最终矩阵 2.1 0 2.1 0 2.1 0

我有一个名为vectors[I][j]的矩阵。我想计算每一行之间的余弦相似性。比如这个矩阵

    1 0 1 0 1 0 0
v=  0 0 1 1 1 0 1
    1 1 0 0 1 0 1
我想在第1行和第2行、第1行和第3行、第2行和第3行之间进行相似性计算。如果第1行和第2行之间的相似性分别等于0.6,其他分别等于0.5和0.4,则更进一步。我想在这些行中的每个元素(e=!0)上加上这个值,并得到这样的最终矩阵

    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
这是我定义和填写矩阵的代码部分

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]++;
                        }
                    }
                }
            }
string text=Request.Form[“TextBox1”];//文本
string[]textInArray=text.Split(新字符[]{.'.},StringSplitOptions.RemoveEmptyEntries);
int[,]vectors=newint[textInArray.Length,keywords.Length];
for(int i=0;i
这是我计算相似性的代码,但我认为它不完整,我有错误,我不知道如何在当前两行的元素上添加这个值

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

}
}

for(i=1)i分解你的解决方案!提取
相似性
方法

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


分解您的解决方案!提取
相似性
方法

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


删除的asp.net标记作为问题似乎与asp.net没有任何关系,添加的C#删除的asp.net标记作为问题似乎与asp.net没有任何关系,添加的C#对于linedouble sim12=相似性(..),我得到这个错误“内的索引数错误;预期为2”你认为这是因为我一开始就这样定义了我的矩阵吗?int[,]vectors=new int[textInArray.Length,keywords.Length];@:dpointtt:是的。如果你在问题
vectors[I][j]
中有矩阵,即数组,我的代码就可以了;但是如果你真的把它放到
int[,]向量
即2D数组,我的代码无法使用。数组的数组(也称为杂凑数组)要比2D的灵活得多@:dpointttt:但是,主要原则是一样的:提取矩阵的任何表示形式。感谢你的快速回答,我如何在a中更改我的矩阵,而这将与你发布的方法一起使用我尝试了这个方法,但不起作用;int[][]向量=新的int[textinaray.Length,keywords.Length];或double[][]向量=新的double[textinaray.Length][keywords.Length];我已经添加了我定义矩阵的代码部分到第一个POST中,我得到了这个错误,linedouble sim12=相似性(..)的错误“索引数错误”;预期为2”你认为这是因为我一开始就这样定义了我的矩阵吗?int[,]vectors=new int[textInArray.Length,keywords.Length];@:dpointtt:是的。如果你在问题
vectors[I][j]
中有矩阵,即数组,我的代码就可以了;但是如果你真的把它放到
int[,]向量
即2D数组,我的代码无法使用。数组的数组(也称为杂凑数组)要比2D的灵活得多@:dpointttt:但是,主要原则是一样的:提取矩阵的任何表示形式。感谢你的快速回答,我如何在a中更改我的矩阵,而这将与你发布的方法一起使用我尝试了这个方法,但不起作用;int[][]向量=新的int[textInArray.Length,keywords.Length];或double[][]向量=新的double[textInArray.Length][keywords.Length];我已经在第一篇文章中添加了定义矩阵的代码部分
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);