如何计算两种不同尺寸矢量的余弦相似度

时间:2016-03-23 20:30:18

标签: c# data-mining cosine-similarity

我需要计算包含数字行的巨大文件的余弦相似度,例如:

6 3 574

11 1 6 575 576 321

4 577 6 64

69 11 6 55

11 218 6 578 579 580 581 229 582 583 155 100 584 148 446 585

我已经将它存储在一个字符串矩阵中,这使得分割和每个数字都是不同的单元格。

string[] lines = FileBuff.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
            FileMatrix = new string[lines.Length][];
            for (int i = 0; i < lines.Length; i++)
            {
                FileMatrix[i] = lines[i].Split(new string[] { "\t", " " }, StringSplitOptions.None);
            }

我的问题是如何计算行中的行的余弦相似度 不同尺寸?
对于分子,它必须是相同的大小(A [i] * B [i] + A [i + 1] * B [i + 1] + .....)

我找到了这个例子,就像我的字母一样,它也是同样的问题:

Document 1: The quick brown fox jumped over the lazy dog.

Global order:     The quick brown fox jumped over the lazy dog
Vector for Doc 1:  1    1     1    1     1     1    1   1   1

Document 2: The runner was quick.

Global order:     The quick brown fox jumped over the lazy dog runner was
Vector for Doc 1:  1    1     1    1     1     1    1   1   1
Vector for Doc 2:  1    1     0    0     0     0    0   0   0    1     1

在这种情况下,理论上我需要在末尾填充带有零的Document 1向量。我需要一些代码的帮助

2 个答案:

答案 0 :(得分:0)

矢量必须具有相同的长度。如果不是,则必须用零填充具有较小维度的那个。基本上逻辑如下:

考虑2个向量:(0,1)和(0,0,1)。

第一个是2D,第二个是3D。您可以将2D矢量视为3D矢量,但位于(x,y)平面中。所以(0,1)相当于(0,1,0)。

另请参阅the Python section中对此问题的回答。

答案 1 :(得分:0)

取决于。

如果你的数据应该是一个连续的向量空间,那么向量必须是相同的长度。

如果您的数据是稀疏向量,那么根据定义,缺失值为0(通常)。

您的数据看起来好像只有1s的索引

然后余弦归结为计算交叉点大小(除以几何平均长度);我会在这些数据上与Jaccard一起使用。

您需要知道输入格式 - 除非您提供数据编码的基本信息以及的含义,否则有多个答案。