吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 890|回复: 2
收起左侧

[学习记录] Java机器学习之实现矩阵运算

  [复制链接]
AItechnology 发表于 2021-11-17 23:21
机器学习设计矩阵运算,所以就写了一个实现一些简单矩阵预算的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[i][j]=(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[0][0]
a是矩阵元A[1,1]


由于java数组指标由0开始,故而第一行第一列矩阵元为A.matrixA[0][0],而比如矩阵元A[2,4](代表第二行第四列)则为A.matrixA[1][3]。
jar包在附件中,切jar包理论上也是压缩包,所以懒得再压缩了,下载后只需去点.zip即可导入项目使用。jar包中包含了源码,可以直接在eclipse等软件中查看。

MatrixUtils.jar.zip

6.85 KB, 下载次数: 1, 下载积分: 吾爱币 -1 CB

删除.zip可用

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

fengbu401 发表于 2021-11-18 08:10
谢谢分享
xiaocai66 发表于 2021-11-18 14:01
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表