我正在使用此函数计算大小为300,word2vec的2个向量a,b之间的距离,我得出'hot'和'cold'之间的距离等于1。
如何将这个值(1)添加到向量,我想只是new_vec = model ['hot'] + 1,但是当我执行calc dist(new_vec,model ['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!
答案 0 :(得分:2)
您应该查看norm是什么。如果是numpy,则默认为使用L-2范数(又称欧几里德范数)。将向量加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
要回答问题“如何向向量添加值”:您已正确完成此操作。如果您想向特定元素添加值,则可以执行vec2[ix] += value
,其中ix
索引要添加的元素。如果要在向量中的所有元素上均匀添加一个值,该值会将范数更改为1,则添加np.sqrt(1/300)
。
对于word2vec向量,更常用的距离度量也可能是相关的:cosine distance,用于测量两个向量之间的角度。