如何在 python 中找到正确的向量/数组相似度?

Posted

技术标签:

【中文标题】如何在 python 中找到正确的向量/数组相似度?【英文标题】:How to find correct vector/array similarity in python? 【发布时间】:2021-11-18 13:06:28 【问题描述】:

我正在尝试找到一种合适的方法来比较 2 个数组/向量,而不是基于直接的布尔比较,而是基于比例或梯度 [0,1]。最接近的工作是余弦相似性,但即使这似乎也不是我想要的。

例子:

from scipy import spatial

a = np.array([1,2,3,4,10])
b = np.array([1,2,3,4,5])

print(1 - spatial.distance.cosine(a,b))

这给了0.9460998335825321 并为我工作。

但是对于这样的情况:

from scipy import spatial

a = np.array([1,1,1,1,1])
b = np.array([1,2,3,4,5])

print(1 - spatial.distance.cosine(a,b))

它不应该给0.9045340337332909 ...我期待一个像0.2这样的低得多的数字。这里有什么好工具?

谢谢

【问题讨论】:

找到正确的一个:它称为“braycurtis”距离:spatial.distance.braycurtis 【参考方案1】:

您可以使用它们之间的角度来确定一个与另一个之间的距离,如果角度更接近 0,那么一个是另一个的多重(它们几乎相同,具有相同的方向),如果角度接近 180 度,它们是相反的向量。

你可以这样做来计算角度:

import numpy as np
import math

v1 = np.array([1,2,3,4,5])
v2 = np.array([1,2,3,4,10])

def magnitude(v):
    return np.sqrt(v.dot(v))

def angle(v1,v2):
    #returns the angle between two vectors
    a = np.arccos(v1.dot(v2)/(magnitude(v1)*magnitude(v2)))
    return math.degrees(a) #standarize the angle from 0 to 1 with a = 1-(a/180)

【讨论】:

但这不正是余弦相似度所做的完全相同的事情吗?

以上是关于如何在 python 中找到正确的向量/数组相似度?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个向量的余弦相似度?

在一组向量中找到最佳余弦相似度

对 TF-IDF 特征向量中的特定特征进行加权,用于 k-means 聚类和余弦相似度

如何使用Tensorflow获得数组的所有元素与同一数组中的所有其他元素的余弦相似度

如何计算直方图(特征向量)之间的相似度百分比

如何找到一个非常大的数组的余弦相似度