- Типы матриц и векторов
- Создание и инициализация матриц и векторов
- Копирование матриц, векторов и массивов
- Копирование таймсерий в матрицу или вектор
- Копирование истории тиков в матрицу или вектор
- Вычисление выражений с матрицами и векторами
- Манипуляции над матрицами и векторами
- Произведения матриц и векторов
- Преобразования (разложение) матриц
- Получение статистики
- Характеристики матриц и векторов
- Решение уравнений
- Методы машинного обучения
Преобразования (разложение) матриц
Преобразования матриц являются наиболее востребованными операциями при работе с данными. При этом многие сложные преобразования не могут быть выполнены в аналитической форме и с абсолютной точностью.
Матричные преобразования (или по-другому, декомпозиции) — это методы, которые разлагают матрицу на составные части, что облегчает вычисление более сложных матричных операций. Методы матричной декомпозиции, также называемые методами матричной факторизации, являются основой в алгоритмах линейной алгебры, таких как решение систем линейных уравнений, вычисление обратной матрицы или определителя.
В частности, в машинном обучении широко используется сингулярное разложение (Singular Values Decomposition, SVD), которое позволяет представить исходную матрицу как произведение трех других матриц. SVD-разложение используется при решении самых разных задач — от приближения методом наименьших квадратов до сжатия и распознавания изображений.
Список доступных методов:
- Cholesky — вычисление декомпозиции Холецкого;
- Eig — вычисление собственных значений и правых собственных векторов квадратной матрицы;
- EigVals — вычисление собственных значений общей матрицы;
- LU — LU-факторизация матрицы как произведения нижнетреугольной матрицы и верхнетреугольной матрицы;
- LUP — LUP-факторизация с частичным поворотом, которая является LU-факторизацией только с перестановками строк: PA=LU;
- QR — QR-факторизация матрицы;
- SVD — разложение по сингулярным значениям.
Ниже представлены прототипы методов.
bool matrix<T>::Cholesky(matrix<T> &L)
bool matrix<T>::Eig(matrix<T> &eigen_vectors, vector<T> &eigen_values)
bool matrix<T>::EigVals(vector<T> &eigen_values)
bool matrix<T>::LU(matrix<T> &L, matrix<T> &U)
bool matrix<T>::LUP(matrix<T> &L, matrix<T> &U, matrix<T> &P)
bool matrix<T>::QR(matrix<T> &Q, matrix<T> &R)
bool matrix<T>::SVD(matrix<T> &U, matrix<T> &V, vector<T> &singular_values)
Покажем пример сингулярного разложения методом SVD (см. файл MatrixSVD.mq5). Сначала инициализируем исходную матрицу.
matrix a = {{0, 1, 2, 3, 4, 5, 6, 7, 8}};
|
Сделаем SVD-разложение:
matrix U, V;
|
Проверим разложение: должно выполняться равенство U * "singular diagonal" * V = A.
matrix matrix_s;
|
Сравним полученную и исходную матрицу на ошибки.
ulong errors = (int)a.Compare(matrix_usvt, 1e-9);
|
В журнале должно получиться следующее:
matrix a
|
Еще один практический случай использования метода Convolve включен в пример в разделе Методы машинного обучения.