矩阵变换(分解)

矩阵变换是在处理数据时最常用的运算。然而,很多复杂的变换不能分析性地以绝对精度执行。

矩阵变换(或者称为分解)是将一个矩阵分解为若干组成部分的方法,这样更容易进行比较复杂的矩阵运算。矩阵分解方法也称为矩阵因式分解法,它是线性代数算法(诸如求解线性方程系统以及计算矩阵或行列式的倒数等)的依据。

尤其是奇异值分解 (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 = {{012345678}};
a = a - 4;
a.Reshape(33);
Print("matrix a \n"a);

现在我们进行一个 SVD 分解:

matrix UV;
vector singular_values;
a.SVD(UVsingular_values);
Print("U \n"U);
Print("V \n"V);
Print("singular_values = "singular_values);

我们检查展开式:必须保持以下相等性:U * "singular diagonal" * V = A

matrix matrix_s;
matrix_s.Diag(singular_values);
Print("matrix_s \n"matrix_s);
matrix matrix_vt = V.Transpose();
Print("matrix_vt \n"matrix_vt);
matrix matrix_usvt = (U.MatMul(matrix_s)).MatMul(matrix_vt);
Print("matrix_usvt \n"matrix_usvt);

我们比较生成的矩阵和原始矩阵之间是否有误差。

ulong errors = (int)a.Compare(matrix_usvt1e-9);
Print("errors="errors);

日志应会类似这样:

matrix a
[[-4,-3,-2]
 [-1,0,1]
 [2,3,4]]
U
[[-0.7071067811865474,0.5773502691896254,0.408248290463863]
 [-6.827109697437648e-17,0.5773502691896253,-0.8164965809277256]
 [0.7071067811865472,0.5773502691896255,0.4082482904638627]]
V
[[0.5773502691896258,-0.7071067811865474,-0.408248290463863]
 [0.5773502691896258,1.779939029415334e-16,0.8164965809277258]
 [0.5773502691896256,0.7071067811865474,-0.408248290463863]]
singular_values = [7.348469228349533,2.449489742783175,3.277709923350408e-17]
  
matrix_s
[[7.348469228349533,0,0]
 [0,2.449489742783175,0]
 [0,0,3.277709923350408e-17]]
matrix_vt
[[0.5773502691896258,0.5773502691896258,0.5773502691896256]
 [-0.7071067811865474,1.779939029415334e-16,0.7071067811865474]
 [-0.408248290463863,0.8164965809277258,-0.408248290463863]]
matrix_usvt
[[-3.999999999999997,-2.999999999999999,-2]
 [-0.9999999999999981,-5.977974170712231e-17,0.9999999999999974]
 [2,2.999999999999999,3.999999999999996]]
errors=0

应用 Convolve 方法的另一个实际案例包括在 机器学习方法一节的示例中。