matlab 余弦相似性和Jaccard相似性(直方图的相似性)的解释

omvjsjqw  于 2023-06-30  发布在  Matlab
关注(0)|答案(1)|浏览(168)

简介

我想通过使用Matlab“pdist2”函数来评估两个“bin counts”数组(与两个直方图相关)之间的相似性:

% Input
bin_counts_a = [689   430   311   135    66    67    99    23    37    19     8     4     3     4     1     3     1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     1];
bin_counts_b = [569   402   200   166   262    90    50    16    33    12     6    35    49     4    12     8     8     2     1     0     0     0     0     1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     2     0     0     0     0     0     0     1];

% Visualize the two "bin counts" vectors as bars:
bar(1:length(bin_counts_a),[bin_counts_a;bin_counts_b])

% Calculation of similarities
cosine_similarity  = 1 - pdist2(bin_counts_a,bin_counts_b,'cosine')
jaccard_similarity = 1 - pdist2(bin_counts_a,bin_counts_b,'jaccard')

% Output
cosine_similarity =

          0.95473215802008

jaccard_similarity =

        0.0769230769230769

问题

如果余弦相似度接近1,这意味着两个向量相似,那么jaccard相似度不也应该接近1吗?

w6lpcovy

w6lpcovy1#

根据documentation'jaccard'度量只考虑“不同的非零坐标的百分比”,而不是它们的差异。
例如,假设bin_counts_a与您的示例相同,并且

bin_counts_b = bin_counts_a + 1;

然后,

>> cosine_similarity  = 1 - pdist2(bin_counts_a,bin_counts_b,'cosine')
cosine_similarity =
   0.999971577948095

几乎是1,因为bin计数非常相似。然而,在这方面,

>> jaccard_similarity = 1 - pdist2(bin_counts_a,bin_counts_b,'jaccard')
jaccard_similarity =
     0

给出0,因为bin_counts_b中的每个条目与bin_counts_a中的条目(略有)不同。
为了评估直方图之间的相似性,'cosine'可能是比'jaccard'更有意义的选项。您可能还想考虑Kullback-Leibler divergence,尽管它在两个分布中不对称,并且不是由pdist2计算的。

相关问题