Перейти к содержимому

Меняем точку зрения

Данные с которыми мы обычно работаем не зависят от того, как мы на них посмотрим

Если есть какое-то скопление точек, от того, что мы поменяем точку зрения, это скопление не должно распадаться

Пришло время разобраться с заменой координат

Замена координат это просто другой взгляд на уже имеющиеся вектора

Стрелки в пространстве как были, так и остались, но мы начинаем их измерять с другой точки зрения (более длинной/короткой линейкой, под другим углом и тд)

В первом уроке было видео, где координаты поворачивались

Как рассчитать новые координаты базисных векторов?

Для этого нужно спроецировать повёрнутые вектора e1{e'}_1 и e2{e'}_2 на изначальные e1e_1 и  e2e_2

А чтобы найти координаты уже имеющегося стороннего вектора в новой системе нужно нужно спроецировать этот вектор на новые базисные вектора e1{e'}_1 и e2{e'}_2

Тут важно понять, что проекция происходит “вдоль” остальных векторов и она не обязательно перпендикулярная (именно такая проекция и определяет координаты вектора)

На следующей картинке видно, как в системе “кривых” координат происходит такая проекция

Посмотрим, что будет, если умножить вектор e1e_1 на 2

Не трудно понять, что тогда первая координата нашего вектора v уменьшится в 2 раза (раз линейка увеличилась в 2 раза)

Аналогичным образом работают и остальные преобразования

Поэтому, чтобы получить новые координаты имеющегося вектора нужно сделать как бы всё “наоборот”, относительно того, как мы меняли базис

Рассмотрим простой пример: повернём базис на угол α\alpha

Длина проекции находится по формуле (это просто тригонометрия):

pre1e1=e1cosαpre2e1=e1sinαpre1e2=e2sinαpre2e2=e2cosα\begin{aligned} pr_{e_1}{{e'}_1} = |e_1|*cos{\alpha} \\ pr_{e_2}{{e'}_1} = |e_1|*sin{\alpha} \\ pr_{e_1}{{e'}_2} = -|e_2|*sin{\alpha} \\ pr_{e_2}{{e'}_2} = |e_2|*cos{\alpha} \end{aligned}

(здесь e1|e_1| - обычная длина вектора по пифагору

Мы уже пришли к выводу, что для пересчёта координат вектора нужно сделать обратную операцию

В данном случае это поворот на угол α-\alpha:

x=xcosαysinα=xcosα+ysinαy=xsinα+ycosα=xsinα+ycosα\begin{aligned} {x'} = x * cos{-\alpha} - y*sin{-\alpha} = x * cos{\alpha} + y*sin{\alpha} \\ {y'} = x * sin{-\alpha} + y*cos{-\alpha} = -x * sin{\alpha} + y*cos{\alpha} \end{aligned}

Здесь и начинают появляться матрицы

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

Матрицы становятся очень удобным инструментом работы с такими преобразованиями

Тут важно не запутаться с тем, что мы пересчитываем: координаты новых базисных векторов базиса или координаты уже имеющегося вектора в новом базисе

Координаты новых базисных векторов в старом базисе:

e1=c11e1++c1nen,      en=cn1e1++cnnen,\begin{matrix} e_{1'} = c_{1'}^1 e_1 + \dots + c_{1'}^n e_n, \\ \dots \space \dots \space \dots \space\dots \space\dots \space\dots \space \\ e_{n'} = c_{n'}^1 e_1 + \dots + c_{n'}^n e_n, \end{matrix}

Мы так их алгебраически и задаём

Но писать такие системы сложения долго, выглядят они громоздко, да и в код это вставлять неудобно

Поэтому, это же можно сильно удобнее переписать и в матричном виде (предполагается, что читатель знает, как умножаются матрицы):

(e1en)=(e1en)(c11cn1c1ncnn)=(e1en)C(e_{1'} \dots e_{n'}) = (e_1 \dots e_n) \begin{pmatrix} c_{1'}^1 & \dots & c_{n'}^1 \\ \vdots & \ddots & \vdots \\ c_{1'}^n & \dots & c_{n'}^n \end{pmatrix} = (e_1 \dots e_n)C

Здесь C - матрица заменыкоординат

По столбцам этой матрицы записаны координаты новых базисных векторов

Например, тот поворот, который мы недавно получили в матричном виде запишется так:

(e1e2)=(e1e2)(cosαsinαsinαcosα)=(e1e2)C=(e1e2)R(α)(e_{1'} \quad e_{2'}) = (e_1 \quad e_2) \begin{pmatrix} \cos\alpha& -\sin\alpha\\ \sin\alpha& \cos\alpha\end{pmatrix} = (e_1 \quad e_2)C = (e_1 \quad e_2)R(\alpha)

Помните, что для подсчёта координат вектора нужно сделать обратную операцию?

Так вот, в матрицах это буквально так и происходит, нужно, всего лишь, обратить матрицу! (нам сейчас не сильно важно, как это делается, да и в коде это обычно одна строчка)

(x1xn)=C1(x1xn)\begin{pmatrix} x^{1'} \\ \vdots \\ x^{n'} \end{pmatrix} = C^{-1} \begin{pmatrix} x^{1} \\ \vdots \\ x^{n} \end{pmatrix}

Наш поворот в данном случае будет записан вот так:

(xy)=(cosαsinαsinαcosα)(xy)=R1(α)(xy)\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos\alpha& \sin\alpha\\ -\sin\alpha& \cos\alpha\end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = R^{-1}(\alpha)\begin{pmatrix} x \\ y \end{pmatrix}

*Я записываю базисы в строку, а координаты векторов в столбец, это будет часто удобно в алгебраических операциях

Поворот лишь частный пример преобразования, на следующем видео показаны различные преобразования и соответствующие им изменение координат вектора

Что же с Data science?

Представьте, что вы работаете с датасетом о недвижимости и у вас есть два признака:

  • Площадь дома (в м²)
  • Стоимость дома (в у.е.)

Очевидно, что эти признаки сильно зависимы (коррелированы): чем больше площадь, тем выше цена. Если нанести точки на плоскость, они вытянутся вдоль диагонали — это похоже на «сплюснутое облако».

Теперь спросим себя: можно ли найти такой новый базис, в котором эти два признака станут независимыми (некоррелированными)? Оказывается, да — это называют главными компонентами (PCA).

  • Мы поворачиваем оси так, чтобы первая новая ось (первая главная компонента) указывала вдоль “главного” направления (как бы вдоль самой длинной части облака).
  • Вторая новая ось перпендикулярна первой и «ловит» оставшийся разброс (в нашем примере — отклонения от общей линии цена–площадь).

В этом новом базисе координаты точек:

  • Первая координата — это проекция на главную ось (грубо говоря, «общий размер» объекта).
  • Вторая координата — это отклонение от пропорциональности (например, аномально дорогой или дешёвый дом для своей площади).

И, что важно, эти две новые координаты уже не коррелируют между собой — мы «выпрямили» исходную зависимость.

*Ещё, этот алгоритм часто работает с алгоритмом из предыдущего урока (где мы “сжимали” пространство для сжатия данных)

Можно сначала найти самые важные направления (например, 30 из 100) и остальные 70 просто схлопнуть

Да, часть данных потеряется, но основа останется

Часто оставшиеся данные могут даже мешать создавая лишний шум

Представьте, что вы анализируете данные о росте людей. Изначально рост был записан в метрах (базисный вектор e1e_1 равен 1 метру). Вы решили изменить систему координат и перевели данные в сантиметры. То есть ваш новый базисный вектор e1e'_1 стал в 100 раз короче старого (e1=0.01e1e'_1 = 0.01e_1).

Что произойдет с числовым значением координаты (числом метров/сантиметров) конкретного человека в новой системе координат?

Мы переходим к новому базису. Новые базисные векторы выражаются через старые следующим образом:

e1=2e1+3e2e2=1e1+4e2\begin{aligned} e'_1 = 2e_1 + 3e_2 \\ e'_2 = -1e_1 + 4e_2 \end{aligned}

Запишите получившуюся матрицу перехода C

(Нужно написать 4 числа, сначала левое верхнее, потом правое верхнее, потом левое нижнее, потом правое нижнее через, пробел)

Пример:

Матрица C=(1234)C = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} запишется как: 1 2 3 4

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

Если алгоритм явно показывает какую-то информацию, но его выводы меняются при повороте, то есть два варианта:

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

  2. У данных есть жёсткая привязка к конкретным осям. В таком случае это всё равно нужно помечать при работе

Например, если наша задача найти кластеры в данных (скопления точек), чаще всего сами скопления они не зависят от точки обзора

Классический алгоритм k-means, в стандартной реализации, устойчив к поворотам пространства, но не устойчив к его масштабированию, поэтому, за этим нужно строго следить

В будущих уроках этот алгоритм будет подробнее разобран