Собственные значения и идея PCA

Собственный вектор — направление, которое матрица только растягивает, не поворачивая; это ключ к PCA и снижению размерности.

Собственный вектор матрицы A — ненулевой вектор v, который A лишь масштабирует: A·v = λ·v. Число λ — собственное значение (во сколько раз растягивается).

Особые направления преобразования

Обычно матрица и поворачивает, и растягивает вектор. Но у каждого преобразования есть выделенные направления, которые оно не поворачивает — только удлиняет или укорачивает. Это собственные векторы, а коэффициент растяжения — собственное значение. Если λ = 3, вектор вдоль этого направления станет в 3 раза длиннее, но смотреть будет туда же. Эти направления — «скелет» преобразования.

Находим главное собственное направление степенным методом

Есть простой итеративный приём — степенной метод: берём случайный вектор и много раз умножаем на матрицу, каждый раз нормируя. Вектор «притягивается» к направлению с наибольшим собственным значением. Реализуем руками для симметричной матрицы.

import math

def matvec(M, v):
    return [sum(M[i][j] * v[j] for j in range(len(v))) for i in range(len(M))]

def norm(v):
    return math.sqrt(sum(x * x for x in v))

# Симметричная матрица: собственные значения 3 и 1
A = [[2, 1],
     [1, 2]]

v = [1.0, 0.0]          # стартовый вектор
for _ in range(50):
    w = matvec(A, v)    # применяем преобразование
    v = [x / norm(w) for x in w]   # нормируем

# Собственное значение через отношение Рэлея: λ = v·(A v)
Av = matvec(A, v)
lam = sum(Av[i] * v[i] for i in range(len(v)))

print("Главный собственный вектор:", [round(x, 4) for x in v])
print("Собственное значение λ:", round(lam, 4))
# Проверка: A·v должно равняться λ·v
print("A·v =", [round(x, 4) for x in Av])
print("λ·v =", [round(lam * x, 4) for x in v])

Вывод:

Главный собственный вектор: [0.7071, 0.7071]
Собственное значение λ: 3.0
A·v = [2.1213, 2.1213]
λ·v = [2.1213, 2.1213]

Вектор сошёлся к направлению (0.71, 0.71) — это диагональ (1, 1), нормированная до длины 1. Матрица растягивает его ровно в 3 раза: A·v = 3·v. Проверка совпала.

Связь с PCA

PCA (метод главных компонент) — самый частый способ снизить размерность данных. Идея: построить по данным ковариационную матрицу (она описывает, как признаки разбросаны и связаны), найти её собственные векторы — это и есть главные компоненты, направления наибольшего разброса данных. Собственное значение показывает, сколько «дисперсии» (информации) лежит вдоль направления. Оставив пару направлений с самыми большими собственными значениями, мы сжимаем данные с минимальной потерей. Так 784-мерные картинки ужимают до десятков чисел.

ОбъектСмысл в PCA
Ковариационная матрицакак признаки разбросаны и связаны
Собственный векторнаправление главной компоненты (оси разброса)
Собственное значениесколько дисперсии лежит вдоль этой оси

На практике собственные значения многомерных матриц считают библиотекой (например numpy.linalg.eig), но идея — ровно та, что мы проверили руками степенным методом.

# В numpy собственные значения и векторы — одной строкой (тут не запустится)
import numpy as np
A = np.array([[2.0, 1.0], [1.0, 2.0]])
values, vectors = np.linalg.eig(A)
print(values)    # [3. 1.]

Итог

  • Собственный вектор — направление, которое матрица только растягивает: A·v = λ·v.
  • Собственное значение λ — коэффициент растяжения вдоль этого направления.
  • Степенной метод находит главное собственное направление повторным умножением и нормировкой.
  • PCA = собственные векторы ковариационной матрицы; они задают оси наибольшего разброса для сжатия данных.
Проверьте себя
1. Что определяет уравнение A·v = λ·v?
AЧто вектор v — нулевой
BЧто v — собственный вектор: матрица только растягивает его в λ раз, не поворачивая
CЧто матрица A обратима
DЧто λ всегда равно 1
2. Что показывает собственное значение главной компоненты в PCA?
AЧисло объектов в данных
BСколько дисперсии (разброса данных) приходится на это направление
CРазмерность исходных данных
DСкорость обучения модели
3. Что делает степенной метод?
AВозводит матрицу в степень для ускорения умножения
BПовторно умножает вектор на матрицу с нормировкой, сходясь к главному собственному направлению
CВычисляет определитель
DТранспонирует матрицу много раз
Поддержать проект