Вы должны проверить, что такое норма .В случае 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 - i-й элемент в a) .Поскольку (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:1023 * косинусное расстояние , которое измеряет угол между двумя векторами.