Линейная алгебра
В этом примере мы покажем, как решать простые задачи из области линейной алгебры – нахождение детерминанта, перемножение матриц и SVG факторизацию.
Для начала, пожалуйста, запустите подготовительную ячейку с кодом.
using LinearAlgebra;
using Rotations;
using Plots;
plotlyjs();
Перемножение матриц
Найдите координаты точки (1,2,0) при повороте вокруг оси Z на угол
X = [1, 2, 0]
scatter([X[1]], [X[2]], [X[3]], framestyle = :zerolines, legend=false, aspect_ratio = 1)
R_euler = RotXYZ(0,0,90*pi/180);
Y = R_euler * X
scatter!([Y[1]], [Y[2]], [Y[3]], framestyle = :zerolines, legend=false, aspect_ratio = 1)
print(Y)
[-2.0, 1.0000000000000002, 0.0]
Снижение размерности матрицы через факторизацию
Дана матрица признаков трёх объектов:
Столбцы содержат признаки объектов, но в них содержится избыточная информация. Выполните снижение размерности до двух переменных при помощи SVD и дополнительных операций. Конкретные шаги алгоритма:
-
Разложите матрицу на компоненты
U, s, VT
при помощи функцииsvd()
. -
Создайте нулевую матрицу
Sigma
того же размера, что и матрицаA
, и заполните ее главную диагональ элементами вектораS
. -
Отделите 2 столбца матрицы
Sigma
и 2 строки матрицыV
, чтобы найти проекцию матрицы в пространство сниженной размерности при помощи командT = U * Sigma
.
A = [ 1 2 3 4 5 6 7 8 9 10;
11 12 13 14 15 16 17 18 19 20;
21 22 23 24 25 26 27 28 29 30 ];
U, s, VT = svd(A);
# Создадим матрицу Sigma
Sigma = zeros(size(A,1), size(A,2));
Sigma[1:size(A,1), 1:size(A,1)] = diagm(s);
# Выберем только 2 признака для описания
n_elements = 2;
Sigma = Sigma[:, 1:n_elements];
VT = VT[1:n_elements, :];
# Находим проекцию матрицы в пространство уменьшенной размерности
T = U * Sigma
3×2 Matrix{Float64}:
-18.5216 6.47697
-49.8131 1.91182
-81.1046 -2.65333
# Приблизительное восстановление матрицы по сжатой информации
B = U * (Sigma * VT)
3×3 Matrix{Float64}:
2.80454 7.16027 12.4563
11.5326 25.8784 22.6968
20.2608 44.5964 32.9373
Ссылки: