如何计算数组间相似度?余弦相似度不符合预期时怎么用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
相关产品推荐
相关产品推荐

