Операции над векторами: сложение и умножение на скаляр
Две базовые операции — сложение векторов и умножение на число — это весь фундамент линейной алгебры.
Линейные операции над векторами — сложение (покоординатно) и умножение на скаляр (каждая координата умножается на одно число). Из них собирается всё остальное.
Сложение: покоординатно
Чтобы сложить два вектора, складывают соответствующие координаты. [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: предсказание модели и есть линейная комбинация признаков.