4 min read

Вектор (Vector)

Вектор (Vector)

Вектор - это кортеж из одного или нескольких значений-скаляров. Векторы строятся из компонентов, которые являются обычными числами. Вы можете думать о векторе как о списке чисел, а о векторной алгебре как об операциях, выполняемых над числами в списке.

Векторы являются основополагающим элементом линейной алгебры и используются в Науке о данных при описании Целевой переменной (Target Variable) для создания нейросети.

$$v = (v_1, v_2, v_3)$$

Обычно в Машинном обучении (ML) целевую переменную  представляют как вектор 'y'.

Векторы легче понять с использованием геометрической аналогии: вектор представляет точку или координату в n-мерном пространстве, где n – количество измерений, например 2. Его также можно рассматривать как линию от начала векторного пространства с направлением и величиной. А вот скаляр не имеет направления.

Теперь, когда мы знаем, что такое вектор в линейной алгебре, давайте посмотрим, как инициализировать его на Python.

Инициализация вектора

Вектор принято инициализировать как массив NumPy. Например, мы определяем вектор длиной в три элемента и состоящего из целых чисел 1, 2 и 3. Для начала импортируем все необходимые библиотеки:

import numpy as np
from numpy import array
v = array([1, 2, 3])
print(v)

Отобразится вектор так:

[1 2 3]

Векторная арифметика

В этом разделе вы познакомитесь с векторно-скалярной арифметикой, в которой все операции выполняются поэлементно между двумя векторами одинаковой длины, в результате чего получается новый вектор такой же длины.

Сложение векторов

Два вектора равной длины можно сложить вместе.

c = a + b

Новый вектор имеет ту же длину, что и два других. Каждый элемент нового вектора – сумма элементов с тем же индексом; например:

a + b = (a1 + b1, a2 + b2, a3 + b3)

Или, по-другому:

c[0] = a[0] + b[0]
c[1] = a[1] + b[1]
c[2] = a[2] + b[2]

Мы можем складывать векторы прямо в Python, суммируя массивы. В примере ниже определяются два вектора с тремя элементами в каждом, которые затем складываются.

a = array([1, 2, 3])
print(a)
b = array([1, 2, 3])
print(b)
c = a + b
print(c)

При вычислении сначала отображаются два "родительских" вектора, а затем новый вектор-сумма.

[1 2 3]
[1 2 3]
[2 4 6]

Вычитание вектора

Один вектор можно вычесть из другого, такой же длины.

c = a - b

Как и при сложении, новый вектор имеет ту же длину, что и родительские векторы, и каждый элемент нового вектора – разница между элементами векторов с одинаковыми индексами.

a - b = (a1 - b1, a2 - b2, a3 - b3)

Разницу можно представить и так:

c[0] = a[0] - b[0]
c[1] = a[1] - b[1]
c[2] = a[2] - b[2]

Массивами NumPy можно напрямую оперировать следующим образом:

a = array([1, 2, 3])
print(a)
b = array([0.5, 0.5, 0.5])
print(b)
c = a - b
print(c)

В примере мы определяем два вектора с тремя элементами в каждом, а затем вычитает первый из второго. При выполнении кода сначала отображаются два исходных вектора, затем печатается новый, который является разницей.

[1 2 3]
[ 0.5 0.5 0.5]
[ 0.5 1.5 2.5]

Векторное умножение

Два вектора одинаковой длины можно перемножить.

c = a * b

Как и в случае с сложением и вычитанием, эта операция выполняется поэлементно, чтобы получить новый вектор той же длины:

a * b = (a1 * b1, a2 * b2, a3 * b3)

Умножение можно представить и так:

ab = (a1b1, a2b2, a3b3)

или так:

c [0] = a [0] * b [0]
c [1] = a [1] * b [1]
c [2] = a [2] * b [2]

NumPy позволяет ускорить эту вычислительную операцию:

a = array([1, 2, 3])
print(a)
b = array([1, 2, 3])
print(b)
c = a * b
print(c)

В примере определяются два вектора с тремя элементами в каждом, а затем векторы перемножаются. На выводе сначала – два исходных вектора, затем – результирующий.

[1 2 3]
[1 2 3]
[1 4 9]

Векторное деление

Один вектор можно поделить на другой при условии равенства их длин.

c = a / b

Как и другие арифметические операции, эта выполняется поэлементно, чтобы получить новый вектор такой же длины.

a / b = (a1 / b1, a2 / b2, a3 / b3)

Корректно и такое представление:

c[0] = a[0] / b[0]
c[1] = a[1] / b[1]
c[2] = a[2] / b[2]

Мы можем выполнить эту операцию с помощью NumPy.

a = array([1, 2, 3])
print(a)
b = array([1, 2, 3])
print(b)
c = a / b
print(c)

В примере определяются два вектора с тремя элементами в каждом, а затем первый делится на второй.

При выполнении кода сначала отображаются два родительских вектора, а затем вектор-частное.

[1 2 3]
[1 2 3]
[1. 1. 1.]

Векторное перемножение (Dot Product)

Векторное перемножение – это сумма перемноженных элементов векторов одинаковой длины. Название Dot Product происходит от символа, используемого для его обозначения.

c = a . b

Скалярное произведение рассчитывается следующим образом:

a . b = (a1 * b1 + a2 * b2 + a3 * b3)

Мы можем вычислить скалярное произведение, используя функцию dot() библиотеки NumPy.

a = array([1, 2, 3])
print(a)
b = array([1, 2, 3])
print(b)
c = a.dot(b)
print(c)

На выходе мы увидим два исходных вектора, затем скалярное скалярное произведение.

[1 2 3]
[1 2 3]
14

Векторно-скалярное умножение

Вектор может быть умножен на скаляр. В результате мы получим масштабированный вектор, где каждый новый элемент кратен исходному.

Для упрощения обозначений мы будем использовать строчную букву «s» для скалярного значения.

c = s * v

Умножение выполняется поэлементно, чтобы получить новый масштабированный вектор той же длины.

s * v = (s * v1, s * v2, s * v3)

или

c[0] = a[0] * s
c[1] = a[1] * s
c[2] = a[2] * s

NumPy прекрасно справляется и с этой операцией:

a = array([1, 2, 3])
print(a)
s = 0.5
print(s)
c = s * a
print(c)

В примере сначала инициализируется вектор, а затем он умножается на скаляр. Выводом будут исходный вектор, скаляр и результат их перемножения.

[1 2 3]
0.5
[ 0.5 1. 1.5]

Точно так же выполняются векторно-скалярные сложение, вычитание и деление.

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @pawel_czerwinski