如何计算两个向量的余弦相似性?
2022-09-01 07:06:28
如何找到向量之间的余弦相似性?
我需要找到相似性来衡量两行文本之间的相关性。
例如,我有两句话,比如:
用户界面系统
用户界面机器
...和它们在 tF-idf 之后各自的向量,然后使用 LSI 进行归一化,例如 和 。[1,0.5]
[0.5,1]
如何测量这些载体之间的纤毛度?
如何找到向量之间的余弦相似性?
我需要找到相似性来衡量两行文本之间的相关性。
例如,我有两句话,比如:
用户界面系统
用户界面机器
...和它们在 tF-idf 之后各自的向量,然后使用 LSI 进行归一化,例如 和 。[1,0.5]
[0.5,1]
如何测量这些载体之间的纤毛度?
如果你想避免依赖第三方库来完成这么简单的任务,这里有一个简单的Java实现:
public static double cosineSimilarity(double[] vectorA, double[] vectorB) {
double dotProduct = 0.0;
double normA = 0.0;
double normB = 0.0;
for (int i = 0; i < vectorA.length; i++) {
dotProduct += vectorA[i] * vectorB[i];
normA += Math.pow(vectorA[i], 2);
normB += Math.pow(vectorB[i], 2);
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
请注意,该函数假定两个向量具有相同的长度。为了安全起见,您可能需要明确检查它。
看看:http://en.wikipedia.org/wiki/Cosine_similarity。
如果您有向量 A 和 B。
相似性定义为:
cosine(theta) = A . B / ||A|| ||B||
For a vector A = (a1, a2), ||A|| is defined as sqrt(a1^2 + a2^2)
For vector A = (a1, a2) and B = (b1, b2), A . B is defined as a1 b1 + a2 b2;
So for vector A = (a1, a2) and B = (b1, b2), the cosine similarity is given as:
(a1 b1 + a2 b2) / sqrt(a1^2 + a2^2) sqrt(b1^2 + b2^2)
例:
A = (1, 0.5), B = (0.5, 1)
cosine(theta) = (0.5 + 0.5) / sqrt(5/4) sqrt(5/4) = 4/5