You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算数组间相似度?余弦相似度不符合预期时怎么用Python实现需求

问题本质

你使用的余弦相似度(sklearn.metrics.pairwise.cosine_similarity、scipy.spatial.distance.cosine)是衡量向量空间方向夹角的指标,和「对应位置元素是否完全相等」的判断逻辑完全无关,因此结果和你的预期不符。
你需要的是逐位置匹配相似度,计算逻辑为:相同位置元素相等的数量 / 数组总长度,对应汉明相似度(即1减去汉明距离占总长度的比例)。

实现方案

纯Python原生实现(无额外依赖)

def position_match_similarity(arr1, arr2):
    if len(arr1) != len(arr2):
        raise ValueError("两个输入数组长度必须一致")
    match_cnt = sum(a == b for a, b in zip(arr1, arr2))
    return match_cnt / len(arr1)

# 测试用例验证
tt1 = [1, 16, 4, 21]
# 无相同位置元素
tt2 = [5, 17, 3, 22]
print(position_match_similarity(tt1, tt2)) # 输出 0.0
# 1个位置匹配
tt2 = [1, 17, 3, 22]
print(position_match_similarity(tt1, tt2)) # 输出 0.25
# 2个位置匹配
tt2 = [1, 16, 3, 22]
print(position_match_similarity(tt1, tt2)) # 输出 0.5
# 3个位置匹配
tt2 = [1, 16, 4, 22]
print(position_match_similarity(tt1, tt2)) # 输出 0.75

基于scipy的实现(需安装scipy库)

直接调用scipy.spatial.distance.hamming计算不匹配比例,取反即可得到目标相似度:

from scipy.spatial.distance import hamming

tt1 = [1, 16, 4, 21]
tt2 = [1, 16, 4, 22]
similarity = 1 - hamming(tt1, tt2)
print(similarity) # 输出 0.75

内容的提问来源于stack exchange,提问作者Kyv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:42:01