Как добавить величину или значение к вектору в Python?

Я использую эту функцию для вычисления расстояния между двумя векторами a, b размером 300, word2vec, я получаю расстояние между «горячим» и «холодным» равным 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!

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
0
0
1 033
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам следует просмотреть, что такое норма. В случае 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: косинусное расстояние, которая измеряет угол между двумя векторами.

спасибо за подробное объяснение, если я могу спросить дальше, так как вы упомянули cosine_sim, то если cos_sim('cold','hot')=0,7, как мне добавить эту величину к вектору? как в new_vec=model['hot']+(0.7)

Jay Qadan 26.04.2019 02:12

В этой области не принято «добавлять эту величину к вектору», поэтому, вероятно, было бы полезно увидеть больше Зачем, которое вы хотите сделать. (Если вы хотите, чтобы вектор «указывал в том же направлении, но более сильно», было бы более типично умножить вектор на какой-либо коэффициент. сходство, на которое по определению нет влияет величина векторов, это снова будет нетипичной операцией.)

gojomo 26.04.2019 05:03

Другие вопросы по теме