如何给 Python 中的向量添加幅度或值?

How to add magnitude or value to a vector in Python?

我正在使用此函数计算大小为 300 的 word2vec 的 2 个向量 a、b 之间的距离,我得到 'hot' 和 'cold' 之间的距离等于 1。

如何将这个值 (1) 添加到向量中,因为我只是想 new_vec=model['hot']+1,但是当我计算 dist(new_vec,模型['hot'])=17?

import numpy
def dist(a,b):
  return numpy.linalg.norm(a-b)


a=model['hot']
c=a+1
dist(a,c)

17

我预计 dist(a,c) 会返回 1!

您应该查看 norm 是什么。对于 numpy,默认使用 L-2 范数(a.k.a 欧几里得范数)。当你给一个向量加1时,调用就是给向量中的所有元素加1。

>> vec1 = np.random.normal(0,1,size=300)
>> print(vec1[:5])
... [ 1.18469795  0.04074346 -1.77579852  0.23806222  0.81620881]

>> vec2 = vec1 + 1
>> print(vec2[:5])
... [ 2.18469795  1.04074346 -0.77579852  1.23806222  1.81620881]

现在,您对 norm 的调用是说 sqrt( (a1-b1)**2 + (a2-b2)**2 + ... + (aN-bN)**2 ),其中 N 是向量的长度,a 是第一个向量,b是第二个向量(ai是a中的第i个元素)。由于 (a1-b1)**2 == (a2-b2)**2 == ... == (aN-bN)**2 == 1 我们希望此总和产生 N,在您的情况下为 300。因此 sqrt(300) = 17.3 是预期的答案。

>> print(np.linalg.norm(vec1-vec2))
... 17.320508075688775

回答问题,"How to add a value to a vector":你做对了。如果您想向特定元素添加一个值,那么您可以执行 vec2[ix] += value,其中 ix 索引您希望添加的元素。如果要在向量中的所有元素中统一添加一个值,这将使范数改变 1,则添加 np.sqrt(1/300).

也可能相关的是 word2vec 向量更常用的距离度量:cosine distance 测量两个向量之间的角度。