如何在Matlab中计算两个频率向量之间的余弦相似度?

时间:2019-07-24 16:59:12

标签: matlab vector cosine-similarity

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

之类的向量

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

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

2 个答案:

答案 0 :(得分:1)

快速浏览Cosine similarity的数学定义。

根据定义,您只需要向量的dot product除以这些向量的Euclidean norms的乘积即可。

% 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

给出相同的结果。


在阅读this correct answer之后,为避免将您发送到another castle,我添加了另一种使用MATLAB内置线性代数函数dotnorm的方法。

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

Runtime performance test showing Approach 3 (dot & norm) is faster for very large vectors

每个点代表10个随机生成的向量的计算时间的geometric mean

答案 1 :(得分:1)

如果拥有统计信息工具箱,则可以将pdist2函数与'cosine'输入标志一起使用,该标志给出1减去余弦相似度:

a = [2,3,4,4,6,1];
b = [1,3,2,4,6,3];
result = 1-pdist2(a, b, 'cosine');