我需要在Matlab上找到两个频率向量之间的余弦相似度。
之类的向量a = [2,3,4,4,6,1] b = [1,3,2,4,6,3]
如何在matlab上测量这些向量之间的余弦相似度?
答案 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内置线性代数函数dot
和norm
的方法。
cosSim = dot(a,b)/(norm(a)*norm(b)); % 0.9436
另请参见tag-wiki中的cosine-similarity。
方法的效果:
sum(a.*b)/sqrt(sum(a.^2)*sum(b.^2))
(a(:).'*b(:))/sqrt(sum(a.^2)*sum(b.^2))
dot(a,b)/(norm(a)*norm(b))
每个点代表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');