矩阵变换(分解)
矩阵变换是在处理数据时最常用的运算。然而,很多复杂的变换不能分析性地以绝对精度执行。
矩阵变换(或者称为分解)是将一个矩阵分解为若干组成部分的方法,这样更容易进行比较复杂的矩阵运算。矩阵分解方法也称为矩阵因式分解法,它是线性代数算法(诸如求解线性方程系统以及计算矩阵或行列式的倒数等)的依据。
尤其是奇异值分解 (SVD) 广泛用于机器学习中,它允许你将原始矩阵表示为三个其它矩阵的积。SVD 分解用于解决各种问题,从最小二乘拟合到压缩以及图像识别等。
可用方法列表。
- Cholesky:计算乔里斯基分解
- Eig:计算方矩阵的本征值及右本征向量
- Eig Vals:计算通用矩阵的本征值
- 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 方法的另一个实际案例包括在 机器学习方法一节的示例中。