Федеральное государственное образовательное бюджетное учреждение
Высшего образования
«ФИНАН
«ФИНАНСОВЫЙ УНИВЕРСИТЕТ ПРИ ПРАВИТЕЛЬСТВЕ
РОССИЙСКОЙ ФЕДЕРАЦИИ»
Департамент анализа данных, принятия решений и финансовых технологий
С.А.Зададаев
Спектральное и сингулярное разложение матриц (RStudio)
Учебно-методические рекомендации для проведения
семинара №31 по компьютерному практикуму
Для бакалавров направления 38.03.01 «Экономика»
Электронное издание
Москва 2018
Спектральное и сингулярное разложение матриц (RStudio)
Этот раздел мы посвятим высшим аспектам линейной алгебры, связанным с ортогональными преобразованиями матриц и их представлению в виде сингулярных разложений. Обе трансформации играют чрезвычайно важную роль в анализе данных и, в частности, в регрессионном анализе.
Несмотря на кажущуюся теоретическую сложность в понимании самой сути соответствующих понятий, с вычислительной точки зрения в языке R все устроено очень и очень просто. Попробуем разобраться в основных идеях и способах их реализации.
|
|
Матрица линейного оператора
Рассмотрим произвольный линейный оператор , преобразующий векторы какого-либо линейного пространства Напомним, что если линейный оператор задан матрицей в некотором базисе , то зная координаты вектора в этом базисе:
,
легко получить координаты преобразованного вектора . Для этого достаточно умножить матрицу оператора справа на столбец координат вектора :
или в развернутом виде
Задание 1. Известно, что оператор поворота относительно начала координат двумерного вектора на угол против часовой стрелки в каноническом базисе задается матрицей поворота:
.
Найти каким окажется вектор после такого поворота.
Решение. Умножим матрицу поворота на столбец координат поворачиваемого вектора :
,
что и даст нам координаты повернутого вектора.
В коде R получаем:
X <- c(7, -20) # Вводим столбец координат вектора X
A <- cbind(c(cos(pi/3), sin(pi/3)), c(-sin(pi/3), cos(pi/3))) # Вводим матрицу поворота
Y <- A %*% X # Вычисляем координаты повернутого вектора Y=AX
Y # Выводим на экран столбец координат Y
с результатом в консоли:
> X <- c(7, -20) # Вводим столбец координат вектора X
> A <- cbind(c(cos(pi/3), sin(pi/3)), c(-sin(pi/3), cos(pi/3))) # Вводим матрицу поворота
> Y <- A %*% X # Вычисляем координаты повернутого вектора
> Y # Выводим на экран столбец координат Y
[,1]
[1,] 20.820508
[2,] -3.937822
Ниже на рисунке 1 представлен найденный поворот: синим – первоначальный вектор с координатами X, красным – повернутый вектор с координатами Y.
|
|
Код процедуры построения рисунка здесь следующий:
plot(0, 0, type = "p", col = "blue", xlim = c(-25, 25), ylim = c(-25, 25)) # Строим начало координат и масштабируем рисунок
abline(h = 0, v = 0, lty = "84") # Рисуем оси координат пунктиром
arrows(0, 0, 7, -20, col = "blue", lwd = 2) # Строим первый вектор X (стрелку)
arrows(0, 0, Y[1], Y[2], col = "red", lwd = 2) # Строим повернутый вектор Y (стрелку)
Рис. 1
Возможно, на своем экране вы видите непропорциональный рисунок. Это зависит от того, насколько раскрыто по отношению к другим окнам в RStudio левое нижнее многофункциональное окно с графиком.
Замечание. Знайте, что всякий раз, когда изображение на экране компьютера поворачивается, каждая двумерная точка экрана претерпевает подобное преобразование.
Задание 2. Повернуть на угол против часовой стрелки относительно начала координат график функции
.
Решение. Отличие данного задания от предыдущего заключается лишь в том, что повернуть надо не одну точку (одну пару координат), а множество точек, составляющих график функции.
Воспользуемся введенной матрицей поворота на угол и устроим повороты всех точек графика функции на отрезке, например, .
x <- seq(-5, 5, length.out = 100) # Разбиваем отрезок [-5, 5] на 100 точек
y <- x + sin(3*x) # Вычисляем значения функции в точках разбиения
plot(x, y, type = " l ", col = "blue", lwd = 2) # Строим график функции f(x)
abline(h = 0, v = 0, lty = "84") # Рисуем оси координат пунктиром
X <- rbind(x, y) # Образуем множество пар точек, которые надо повернуть
Y <- A %*% X # Поворачиваем сразу все точки матрицей поворотов
lines(Y[1, ], Y[2, ], type = " l ", col = "red", lwd = 2) # Достраиваем повернутый график
с убедительным результатом на рисунке 2:
Рис. 2.