首页 > 解决方案 > 如何在MATLAB中计算两个频率向量之间的余弦相似度?

问题描述

我需要在 MATLAB 中找到两个频率向量之间的余弦相似度。

示例向量:

a = [2,3,4,4,6,1]
b = [1,3,2,4,6,3]

如何在 MATLAB 中测量这些向量之间的余弦相似度?

标签: matlabvectorcosine-similarity

解决方案


快速了解余弦相似度的数学定义。

根据定义,您只需要向量的点积除以这些向量的欧几里得范数的乘积。

% MATLAB 2018b
a = [2,3,4,4,6,1]; 
b = [1,3,2,4,6,3];

cosSim = sum(a.*b)/sqrt(sum(a.^2)*sum(b.^2));            % 0.9436

或者,您可以使用

cosSim = (a(:).'*b(:))/sqrt(sum(a.^2)*sum(b.^2));        % 0.9436

这给出了相同的结果。


阅读此正确答案后,为避免将您带到另一座城堡,我添加了另一种使用 MATLAB 内置线性代数函数的方法,dot()并且norm().

cosSim = dot(a,b)/(norm(a)*norm(b));                     % 0.9436

另请参阅tag-wiki以了解


方法性能:

  1. sum(a.*b)/sqrt(sum(a.^2)*sum(b.^2))
  2. (a(:).'*b(:))/sqrt(sum(a.^2)*sum(b.^2))
  3. dot(a,b)/(norm(a)*norm(b))

运行时性能测试显示方法 3(点和范数)对于非常大的向量更快

每个点代表10 个随机生成的向量的计算时间的几何平均值。


推荐阅读