【问题标题】:How to calculate cosine similarity between two frequency vectors in MATLAB?如何在MATLAB中计算两个频率向量之间的余弦相似度?
【发布时间】:2019-12-02 21:41:47
【问题描述】:

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

示例向量:

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

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

【问题讨论】:

标签: matlab vector cosine-similarity


【解决方案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 内置线性代数函数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))

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

【讨论】:

  • @quart-ul-ainabid 我正在测试以验证,但我猜测使用 dotnorm 的方法对于大型向量(许多元素)但任何合理的向量长度会更快不会显示运行时间的差异。
【解决方案2】:

如果您有统计工具箱,您可以使用带有'cosine' 输入标志的pdist2 函数,它给出1 减去余弦相似度:

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

【讨论】:

  • 非常聪明 - 我不会想到 pdist2 函数 (+1)。通读文档后,它是一个非常通用的工具。
猜你喜欢
  • 2017-09-07
  • 2010-10-05
  • 2019-12-27
  • 2016-03-06
  • 2021-07-19
  • 2018-12-02
  • 1970-01-01
  • 2022-06-14
  • 2015-07-21
相关资源
最近更新 更多