Операции над векторами: сложение и умножение на скаляр

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

Линейные операции над векторами — сложение (покоординатно) и умножение на скаляр (каждая координата умножается на одно число). Из них собирается всё остальное.

Сложение: покоординатно

Чтобы сложить два вектора, складывают соответствующие координаты. [1, 2, 3] + [4, 5, 6] = [5, 7, 9]. Геометрически это «правило параллелограмма»: приставляем начало второй стрелки к концу первой, и сумма — стрелка из начала первой в конец второй. Вычитание a − b — это «вектор из b в a»: куда и насколько надо сдвинуться, чтобы из точки b попасть в точку a. Именно поэтому разность лежит в основе понятия расстояния.

# Сложение и вычитание векторов — вручную, через zip
def vadd(a, b):
    return [x + y for x, y in zip(a, b)]

def vsub(a, b):
    return [x - y for x, y in zip(a, b)]

u = [1, 2, 3]
v = [4, 5, 6]
print("u + v =", vadd(u, v))
print("u - v =", vsub(u, v))
print("v - u =", vsub(v, u))   # обратное направление

Вывод:

u + v = [5, 7, 9]
u - v = [-3, -3, -3]
v - u = [3, 3, 3]

Умножение на скаляр: растяжение

Скаляр — это просто число (в отличие от вектора). Умножить вектор на скаляр s — значит умножить каждую координату на s. Геометрически стрелка растягивается в s раз. Если s > 1 — длиннее, если 0 < s < 1 — короче, если s < 0 — разворачивается в противоположную сторону.

def vscale(s, a):
    return [s * x for x in a]

u = [2, -1, 3]
print("2  * u =", vscale(2, u))
print("0.5* u =", vscale(0.5, u))
print("-1 * u =", vscale(-1, u))   # разворот

Вывод:

2  * u = [4, -2, 6]
0.5* u = [1.0, -0.5, 1.5]
-1 * u = [-2, 1, -3]

Линейная комбинация — главное слово

Сложив эти две операции, получаем линейную комбинацию: s·a + t·b. Это «смесь» векторов с весами. Почти всё в ML — линейные комбинации: предсказание линейной модели w1·x1 + w2·x2 + ... + b — это линейная комбинация признаков с весами. Понимать векторные операции = понимать, что делает модель внутри.

def vadd(a, b): return [x + y for x, y in zip(a, b)]
def vscale(s, a): return [s * x for x in a]

# Линейная комбинация: 3*a + 2*b
a = [1, 0, 2]
b = [0, 1, 1]
combo = vadd(vscale(3, a), vscale(2, b))
print("3a + 2b =", combo)

# Среднее (центроид) нескольких точек — тоже линейная комбинация
pts = [[2, 4], [4, 6], [6, 2]]
n = len(pts)
center = [sum(p[i] for p in pts) / n for i in range(2)]
print("Центр облака точек:", center)

Вывод:

3a + 2b = [3, 2, 8]
Центр облака точек: [4.0, 4.0]

Правила, которые всегда выполняются

СвойствоЧто значит
a + b = b + aпорядок сложения не важен
(a + b) + c = a + (b + c)скобки можно переставлять
s·(a + b) = s·a + s·bскаляр «раскрывается» по сумме
a + 0 = aнулевой вектор ничего не меняет

Итог

  • Сложение векторов — покоординатно; вычитание даёт «вектор разницы» (основа расстояния).
  • Умножение на скаляр растягивает/разворачивает вектор.
  • Линейная комбинация s·a + t·b — рабочая лошадка ML: предсказание модели и есть линейная комбинация признаков.
Проверьте себя
1. Чему равно [1, 2] + [3, 4]?
A[4, 6]
B[3, 8]
C[1, 2, 3, 4]
D10
2. Что делает умножение вектора на скаляр −1?
AОбнуляет вектор
BРазворачивает вектор в противоположную сторону, сохраняя длину
CУдваивает длину
DМеняет местами координаты
3. Почему линейная комбинация важна для ML?
AЭто единственная операция, которую понимает Python
BПредсказание линейной модели w1·x1 + w2·x2 + b — это линейная комбинация признаков
CОна ускоряет обучение в 10 раз
DБез неё нельзя сложить два числа
Поддержать проект