如何在 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 聚类和余弦相似度