Java机器学习之实现矩阵运算
机器学习设计矩阵运算,所以就写了一个实现一些简单矩阵预算的java代码。首先大家要接触机器学习首先需要了解一些线性代数的知识,比如什么是矩阵,矩阵的基本操作,比如转置,求逆等。在实现过程中感觉比较难一点的是矩阵求逆,其它操作都比较简单,就不贴出代码了,下面主要贴出矩阵求逆的代码:
public static Matrix inverseMatrix(Matrix matrixI) {
if(matrixI.colNum==matrixI.rowNum) {
double tmp= Matrix.det(matrixI);
if(Math.abs(tmp)<=0.00000001) {
System.out.println("matrix has no inverse matrix");
System.out.println("待求矩阵不存在逆矩阵,无法求逆");
return null;
}else {
Matrix A = new Matrix(matrixI.rowNum,matrixI.colNum);
for(int i=0;i<matrixI.rowNum;i++) {
for(int j=0;j<matrixI.colNum;j++) {
A.matrixA=(Math.pow(-1,i+j))*Matrix.det(Matrix.adjointMatrix(matrixI,j,i))/tmp;
}
}
return A;
}
}else {
System.out.println("Fatal error, matrix is not a square matrix");
System.out.println("致命错误,待求矩阵不是方矩阵,不存在逆矩阵");
return null;
}
}
这个求逆的基本原理就是利用线性代数中利用伴随矩阵求逆的方法,具体参考<高等代数>第三册,罗彦锋书中第100页开始的一小节,这里就不做介绍了。
可以看到,上述代码中还需要求矩阵的行列式和伴随矩阵。行列式求解较为麻烦,木得办法,只能采用运算代价较大的递归法实现,代码就不贴了,大家可以在我分享的jar包中去看源码,而想直接使用的,下载jar包就可以了。伴随矩阵是什么,也请一起参考我说的参考书中内容。这本书只是我手头有的,大家可以自己去找别的书,只要介绍线性代数的书应该都会有矩阵求逆的内容。
下面贴出如何构造和使用该工具类:
Matrix function List (矩阵函数列表)
代码目的 : 提供一般数学上的矩阵运算操作函数
ex0:Matrix A = new Matrix(3,3)
A.showMatrix();
代码功能 : 构造3x3的矩阵元全零矩阵并在控制台显示其形式
support flexible method construct the matrix支持多种构造方式构造矩阵
ex1:Matrix A = new Matrix(3,3)
代码功能 : 构造3x3的矩阵元全零矩阵
ex2:double[][] a = {{1,1,1},{1,1,1},{1,1,1}};
Matrix A = new Matrix(a);
代码功能 : 构造3x3的矩阵元全一零矩阵
ex3:double[] vectora = {1,1,1};
Matrix vectorA = new Matrix(vectora);
代码功能 : 构造{1,1,1}的行向量,方便矩阵运算
ex4:Matrix A = new Matrix(5,5);
Matrix B = new Matrix(A);
代码功能 : 复制一模一样的矩阵,由于是引用数据类型,不可以直接赋值,故需要此方法实现复制
ex5:Matrix E = Matrix.eyeMatirx(5);
代码功能 : 构造5x5的单位矩阵
ex6:Matrix D = Matrix.zerosMatirx(5,4);
代码功能 : 构造5x4的全零矩阵,效果与ex1相同
ex7:Matrix D = Matrix.onesMatirx(4,5);
代码功能 : 构造5x4的全一矩阵
ex8:Matrix A = Matrix.matrixMultiply(matrixA,matrixB);
代码功能 : 实现矩阵乘法
ex8:Matrix A = Matrix.inverseMatrix(matrixA);
代码功能 : A是矩阵matrixA的逆矩阵
ex9:Matrix A = Matrix.matrixNumber(matrixA,5);
代码功能 : A是矩阵matrixA数乘5
ex10:Matrix A = Matrix.matrixAdd(matrixA,matrixB);
代码功能 : A 是矩阵matrixA 和MatrixB相加的矩阵
ex11:Matrix A = Matrix.matrixMinus(matrixA,matrixB);
代码功能 : A=matrixA-MatrixB
ex12:Matrix A = Matrix.matrixMinus(matrixA,matrixB);
A.transpose();
代码功能 : 实现A的转置,现在A转置了。
ex13:Matrix A = Matrix.adjointMatrix(matrixA,0,0);
代码功能 : 实现matrixA11的伴随矩阵。
以上所有运算的矩阵结果可以通过showMatrix()函数在控制台查看
ex14:double a = Matrix.det(matrixA);A
代码功能 : a是矩阵matrixA的行列式结果
ex15:double a = Matrix.matrixSum(matrixA);
代码功能 : a是矩阵matrixA的所有元的代数求和
ex16:double a = Matrix.matrixSum(matrixA);
代码功能 : a是矩阵matrixA的所有元的代数求和
由于本人目前处于机器学习学习过程的初级阶段,所以后续需要什么功能还请大家评论留言,可以改进加入,完善。大佬勿喷。
最后说说如何访问单个矩阵元。由于是利用二维double类型的数组作为基本数据结构,所以参数只接受Matrix类,double类的数和数组。访问矩阵元通过如下代码:
Matrix A = new Matrix(5,5);
double a= A.matrixA
a是矩阵元A
由于java数组指标由0开始,故而第一行第一列矩阵元为A.matrixA,而比如矩阵元A(代表第二行第四列)则为A.matrixA。
jar包在附件中,切jar包理论上也是压缩包,所以懒得再压缩了,下载后只需去点.zip即可导入项目使用。jar包中包含了源码,可以直接在eclipse等软件中查看。 谢谢分享 谢谢lz分享
页:
[1]