余弦相似代码(非术语向量)

时间:2011-09-26 20:11:57

标签: c# math cosine

我试图找到两个向量(x,y点)之间的余弦相似性,我正在做一些我无法确定的愚蠢错误。 Pardone我是一个新手,如果我犯了一个非常简单的错误(很可能是我),我很抱歉。

感谢您的帮助

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

编辑:除了语法之外,我的问题也与逻辑结构有关,因为我处理的是不同长度的矢量。此外,上述如何推广到m维的向量。谢谢

2 个答案:

答案 0 :(得分:12)

如果您是二维的,那么您可以将矢量表示为(V1.X, V1.Y)(V2.X, V2.Y),然后使用

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

如果您的尺寸较高,则可以将每个矢量表示为List<double>。因此,在4维中,第一个向量将具有组件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));
}

答案 1 :(得分:1)

最后一行应该是

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