余弦相似度与Jaccard相似度(直方图相似度)结果差异解读
余弦与Jaccard相似度结果差异的解析
问题背景
使用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. 余弦相似度:关注向量的方向一致性
余弦相似度的本质是衡量两个向量在空间中的方向相似程度,公式为:
$$\text{cosine similarity} = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| \cdot |\vec{b}|}$$
它只关心各维度数值的比例关系,完全忽略绝对值大小和零值维度的影响。
从数据来看,两个向量的前17个bin(数值占比最高的核心区域)数值比例高度一致,这部分贡献了向量点积和模长的绝大多数权重,后面大量零值或极小值的bin对整体结果影响微乎其微,因此余弦相似度接近1,体现出向量方向的高度相似。
2. Jaccard相似度:关注数值的重叠程度
Matlab中pdist2的Jaccard指标针对数值向量时,计算逻辑是:
$$\text{Jaccard similarity} = \frac{\sum_{i=1}^n \min(a_i, b_i)}{\sum_{i=1}^n \max(a_i, b_i)}$$
它的核心是衡量两个向量在每个维度上的数值重叠程度,而非方向比例。
数据中,除了前17个bin外,剩余的33个bin里:
bin_counts_a有4个bin存在极小值(1),其余为0bin_counts_b有5个bin存在极小值(1或2),其余为0
这些维度的$\min(a_i,b_i)$都是0,$\max(a_i,b_i)$是对应的极小值,会大幅拉低分子的总和,同时增加分母的总和,最终导致Jaccard相似度远低于1。
若采用二进制集合的Jaccard逻辑(将非零视为1,零视为0),差异同样明显:两个向量的非零bin重叠比例很低,大量非零bin是各自独有的,这也会导致Jaccard相似度极低。
内容的提问来源于stack exchange,提问作者Ommo
相关产品推荐
相关产品推荐

