Java数学程序库方案探究

举报
Jet Ding 发表于 2020/09/29 11:51:13 2020/09/29
【摘要】 【引言】在Java编程中,我们经常需要使用数学工具,虽然JDK 中的java.lang.Math有很多基本的数学函数,但是当进行一些复杂运算的时候根本不够用。 因此我们需要找一些程序库来弥补JDK math库的一些功能缺失,目前我们使用的数学库是Apache Commons Math。Apache Commons Math,是一个用于创建可重用的Java组件的开源软件包。它有很多用于线性代数...

【引言】

Java编程中,我们经常需要使用数学工具,虽然JDK 中的java.lang.Math有很多基本的数学函数,但是当进行一些复杂运算的时候根本不够用。 因此我们需要找一些程序库来弥补JDK math库的一些功能缺失,目前我们使用的数学库是Apache Commons Math

Apache Commons Math,是一个用于创建可重用的Java组件的开源软件包。它有很多用于线性代数和非线性优化运算的程序包。 

但是这个库的最新版本是2016发布的,属于老旧的程序库,本文就对于可能的替代方案做个研究。

 

Apache Commons Math

使用方法和功能列表可参看如下的链接:

http://commons.apache.org/proper/commons-math/apidocs/index.html

功能包列表

在整个commons-math库中使用的常用类

org.apache.commons.math3  

常用的数值分析程序的母包,包括寻根、函数插值和积分

org.apache.commons.math3.analysis

处理微分的主要接口和基本构件类

      org.apache.commons.math3.analysis.differation

常见的数学函数,如高斯函数和sinc函数等

      org.apache.commons.math3.analysis.function

单变量实数函数的数值积分(正交)算法

      org.apache.commons.math3.analysis.integration

高斯家族的正交方案

      org.apache.commons.math3.analysis.integration.gauss

单变量实数函数插值算法

      org.apache.commons.math3.analysis.interpolation

单变量实数多项式实现,看成可微分的单变量实数函数

org.apache.commons.math3.analysis.polynomials

     

找根算法,用于单变量实数函数

org.apache.commons.math3.analysis.solvers

复杂的数型和复杂的超越函数的实现

org.apache.commons.math3.complex    

Java的十进制浮点库

      org.apache.commons.math3.dfp

常见的离散分布和连续分布的实现

      org.apache.commons.math3.distribution

参数与分布的拟合

      org.apache.commons.math3.distribution.fitting

针对算法错误的专门化异常

      org.apache.commons.math3.exception

支持异常本地化的类

org.apache.commons.math3.exception.util

常见的离散时间线性滤波器的实现

      org.apache.commons.math3.filter    

用于执行曲线拟合的类

      org.apache.commons.math3.fitting

最小化观测值和模型值之间的残差的算法

org.apache.commons.math3.fitting.leastquares

分数类型和分数格式化

      org.apache.commons.math3.fraction

遗传算法的组件和实现

org.apache.commons.math3.genetics

几何学的顶层包

org.apache.commons.math3.geometry

与最小包围球问题相关的接口和类

org.apache.commons.math3.geometry.enclosing

基本的一维几何组件

org.apache.commons.math3.geometry.euclidean.oned

基本的三维几何组件

org.apache.commons.math3.geometry.euclidean.threed

基本的二维几何组件

org.apache.commons.math3.geometry.euclidean.twod   

在二维欧几里得空间中为一组点生成凸壳的算法

org.apache.commons.math3.geometry.euclidean.twod.hull

与凸壳问题相关的接口和类

org.apache.commons.math3.geometry.hull

实现二进制空间分区树的类

org.apache.commons.math3.geometry.partitioning    

多维排序功能,用于分区

org.apache.commons.math3.geometry.partitioning.utilities

1球体上的基本几何组件

org.apache.commons.math3.geometry.spherical.oned

2球体上的基本几何组件

org.apache.commons.math3.geometry.spherical.twod     

线性代数支持

org.apache.commons.math3.lineine 

用于机器学习算法的基础包

org.apache.commons.math3.ml  

聚类算法

org.apache.commons.math3.ml.clusterering

聚类评估方法

      org.apache.commons.math3.ml.clustering.evaluation

常用的距离测量方法

org.apache.commons.math3.ml.distance

神经网络

org.apache.commons.math3.ml.neuralnet        

一维神经网络

org.apache.commons.math3.ml.neuralnet.oned

自组织特征图

      org.apache.commons.math3.ml.neuralnet.sofm    

杂项实用程序

org.apache.commons.math3.ml.neuralnet.sofm.util

二维神经网络

org.apache.commons.math3.ml.neuralnet.twod   

用于可视化二维神经网络的实用程序

org.apache.commons.math3.ml.neuralnet.twod.util  

解决普通微分方程问题的类

org.apache.commons.math3.ode

一些类来处理普通微分方程积分期间发生的离散事件

org.apache.commons.math3.ode.events

解决非静态普通微分方程问题的类

org.apache.commons.math3.de.nonstiff

一些类来处理普通微分方程积分过程中的采样步骤

org.apache.commons.math3.de.somplementation

优化器

org.apache.commons.math3.optim  

一般来说,优化器是将一个标量函数最小化或最大化的算法,称为目标函数。

线性约束问题的优化算法

org.apache.commons.math3.optim.lineal   

用于优化标量函数的算法

org.apache.commons.math3.optim.nonlinear.scalar   

需要导数的优化算法

org.apache.commons.math3.optim.nonlinear.scalar.gradient

不需要导数的优化算法

org.apache.commons.math3.optim.nonlinear.scalar.noderiv 

优化向量函数的算法

org.apache.commons.math3.optim.nonlinear.vector  

需要导数的优化算法

org.apache.commons.math3.optim.nonlinear.vector.jacobian    

一维优化算法

org.apache.commons.math3.optim.univariate 

不需要导数的优化算法

org.apache.commons.math3.optiming.direct   

曲线拟合

org.apache.commons.math3.optiming.fitting   

需要导数的优化算法

org.apache.commons.math3.optiming.general 

线性约束问题的优化算法

org.apache.commons.math3.optiming.lineine  

单变量实数函数最小查找算法

org.apache.commons.math3.optimation.univariate   

与质数相关的方法,如原始性检验、因数分解

org.apache.commons.math3.primes 

随机数和随机数据生成器

org.apache.commons.math3.random     

特殊函数的实现,如BetaGamma

org.apache.commons.math3.special 

数据存储、操作和总结例程

org.apache.commons.math3.stat

关联/协方差计算

org.apache.commons.math3.stat.corlation 

通用的单变量汇总统计对象

org.apache.commons.math3.stat.descripptive 

基于时刻的汇总统计

org.apache.commons.math3.stat.descripptive.moment   

基于排名的汇总统计

org.apache.commons.math3.stat.descripptive.rank    

其他汇总统计

org.apache.commons.math3.stat.descripptive.commary  

 

假设检验的类

org.apache.commons.math3.stat.inference

二项式比例置信区间构造的类

org.apache.commons.math3.stat.interval   

等级转换的类

org.apache.commons.math3.stat.ranking    

涉及多变量数据的统计例程

org.apache.commons.math3.stat.regression    

变换方法的实现,包括快速傅立叶变换

org.apache.commons.math3.transformation    

工具库

org.apache.commons.math3.util 

在整个数学库中使用的工具库包含了便捷的例程和常用的数据结构。

License

Apache License

【最新版本】

3.6.1, 发布于 2016321

【官方网站】

http://commons.apache.org/proper/commons-math/

【使用案例】

矩阵和向量运算。

RealMatrix a = new Array2DRowRealMatrix(

  new double[][] { { 23, -2 }, { -176 }, { 4, -3, -5 } },

  false);

RealVector b = new ArrayRealVector(n

  ew double[] { 1, -21 }, 

  false);

 

DecompositionSolver solver = new LUDecomposition(a).getSolver();

 

RealVector solution = solver.solve(b);

 

ND4J

ND4J是一个开源库,它支持n维(ND)数组,类似于NumPy。它可以在分布式GPUCPU上跨平台运行,并利用Spark进行并行计算。它支持深度学习库Deeplearning4j。运行速度快,RAM要求低。

 

主要特点

²  多用途多维数组对象

²  多平台功能,包括GPU

²  线性代数和信号处理功能

 

由于易用性上存在的问题,JavaScalaClojure编程人员无法充分利用NumPyMatlab等数据分析方面比较强大的工具。Breeze等其他库则不支持多维数组或张量,而这却是深度学习和其他任务的关键功能。

ND4J的出现弥补了这一不足。ND4J在开源、分布式、支持GPU的库内,为JVM环境带来了简便易用的、一直被Python编程人员所用的科学计算工具。

在结构上,ND4JSLF4J相似。ND4J让工程师能够轻松将算法和界面移植到JavaScala体系内的其他库内。

 

ND4J正得到国家级实验室的使用,以完成气候建模等复杂任务。这类任务要求能够胜任计算密集的模拟运算。

 

【功能列表】

ND4J的使用方法和功能列表可参看如下的链接:

https://nd4j.org/userguide

http://nd4j.org/doc/

 

【最新版本】

1.0.0 发布于2018516

【官方网站】

https://nd4j.org/

【使用案例】

矩阵运算。

INDArray nd = Nd4j.create(new float[]{1,2}, 12);        

INDArray nd2 = Nd4j.create(new float[]{3,4}, 21);       

 

INDArray ndv = nd.mmul(nd2);

 

Colt

Colt是一组用Java编写的高性能科学和技术计算的开源库,由CERN开发。Colt是以高能物理学为重点开发的,但也适用于许多其他问题。Colt最后一次更新是在2004年(当时是Java 1.4),它的代码库已经被整合到了并行Colt代码库中,而并行Colt代码库也得到了更多的开发。

【功能列表】

²  模板化列表和Map

²  模板化的多维矩阵

²  线性代数

²  组图

²  数学

²  统计数据

²  随机数和随机抽样

²  并行&并发编程中常见的高效实用类。

License

CERN and LGPL

【最新版本】

1.2.0200499

【官方网站】

http://acs.lbl.gov/software/colt/

 

【使用案例】

奇异值分解(SVD)的例子。

 

SingularValueDecomposition s = new SingularValueDecomposition(matA);

DoubleMatrix2D U = s.getU();

DoubleMatrix2D S = s.getS();

DoubleMatrix2D V = s.getV();

 

矩阵乘法的例子。

Algebra alg = new Algebra();

DoubleMatrix2D result = alg.mult(matA,matB);

 

EJML

Efficient Java矩阵库(EJML)是一个线性代数库,用于处理实数/复杂/密集/稀疏矩阵。它的设计目标是:1)对小矩阵和大矩阵都要尽可能地提高计算效率和内存效率,2)新手和专家都可以使用。这些目标是通过运行时动态选择最佳算法、干净的API和多种接口来实现的。EJML是免费的,100%Java编写,并在Apache v2.0许可下发布。

【功能列表】

EJML为密集矩阵提供了以下功能。 

²  基本运算符(加法,乘法,.....)。

²  矩阵操作(提取,插入,合并,.....)。

²  线性求解(线性、最小二乘法、增量、..... 

²  分解(LU, QR, Cholesky, SVD, Eigenvalue, .... 

²  矩阵特征(秩、对称性、定义性..... 

²  随机矩阵(协方差,正交,对称,对称,..... 

²  不同的内部格式(行-大数,块)

²  单元测试

License

Apache_License

【最新版本】

0.382019318

【官方网站】

http://ejml.org/

 

【使用案例】

奇异值分解(SVD)的例子。

SimpleSVD s = matA.svd();

SimpleMatrix U=s.getU();

SimpleMatrix W=s.getW();

SimpleMatrix V=s.getV();

 

矩阵乘法的例子。

SimpleMatrix result = matA.mult(matB);

 

JAMA

JAMA,一个Java编程语言的数值线性代数工具包,是1998年在美国国家标准与技术研究所创建的一个执行数值线性代数任务的软件库,功能类似于LAPACK 

2005年以来没有进行过主动开发,但它仍然是Java中比较流行的线性代数包之一。

 

【功能列表】

²  特征系统的解决

²  LU分解

²  LU分解

²  奇异值分解

²  二维码分解

²  霍尔茨基分解

这个库有C++Java版本。

License

公共领域的软件

 

【最新版本】

1.0.32012119

【官方网站】

http://math.nist.gov/javanumerics/jama/

 

【使用案例】

奇异值分解(SVD)的例子。

SingularValueDecomposition s = matA.svd();

 

Matrix U = s.getU();

Matrix S = s.getS();

Matrix V = s.getV();

 

矩阵乘法的例子。

Matrix result = A.times(B);

 

Jblas

Jblas: Linear Algebra for Java,它是一个简单易用的BLASLAPACK的封装器。 

jblas是由Mikio Braun开发的,基于BLASLAPACK基础上的Java编程语言的线性代数库。与大多数其他的Java线性代数库不同,jblas是通过Java Native Interface (JNI)设计的,可以与原生代码一起使用,并带有预编译的二进制文件。当在其中一个目标架构上使用时,它将自动选择正确的二进制文件并加载。jblasBLASLAPACK所提供的API之上,提供了一个更容易使用的高级API,消除了很多繁琐的工作。

 

【功能列表】

²  Eigen—特征值分解

²  求解--解线性方程

²  单数--单值分解

²  分解--LU, Cholesky, ....

²  几何学--居中,归一化,...

License

BSD Revised

 

【最新版本】

1.2.42015512

【官方网站】

http://jblas.org/

 

【使用案例】

特征值分解的例子

DoubleMatrix[] evd = Eigen.symmetricEigenvectors(matA);

DoubleMatrix V = evd[0];

DoubleMatrix D = evd[1];

 

矩阵乘法的例子

DoubleMatrix result = matA.mmul(matB);

 

Parallel Colt

Parallel Colt是一组多线程版本的Colt。它是一组用Java编写的高性能科技计算的开源库的集合。它包含了Colt的所有原始功能,并增加了几个新功能,重点是多线程算法。

 

【功能列表】

Parallel Colt拥有原Colt库的所有功能,并增加了以下内容。

 

²  多线程

²  专业的矩阵数据结构

²  JPlasma

n  PLASMA(可扩展的多核架构的并行线性代数)的Java移植

²  CSparseJ

n  CSparseJCSparse(一个简明稀疏矩阵包)的Java移植。

²  联网协议(Netlib-java)

n  Netlib是一个线性代数系统(即处理向量或矩阵)的关键任务软件组件集合。

²  求解器和预处理器

n  主要改编自Matrix Toolkit Java

²  非线性优化

n  MINPACK中的一维最小化例程的Java版本

²  矩阵式读写器

²  所有使用浮点算术的类都是以单精度和双精度实现的。

²  并行快速排序算法

 

License

Various:

详情参见:

https://sites.google.com/site/piotrwendykier/software/parallelcolt

 

【最新版本】

0.9.42010321

【官方网站】

https://sites.google.com/site/piotrwendykier/software/parallelcolt

【使用案例】

奇异值分解(SVD)的例子。

DenseDoubleAlgebra alg = new DenseDoubleAlgebra();

DenseDoubleSingularValueDecomposition s = alg.svd(matA);

 

DoubleMatrix2D U = s.getU();

DoubleMatrix2D S = s.getS();

DoubleMatrix2D V = s.getV();

 

矩阵乘法的例子。

DenseDoubleAlgebra alg = new DenseDoubleAlgebra();

DoubleMatrix2D result = alg.mult(matA,matB);

 

Matrix Toolkit Java

Matrix Toolkit JavaMTJ)是一个开放源码的Java软件库,用于执行数值线性代数。该库包含了一套完整的标准线性代数操作,适用于基于BLASLAPACK代码的密集矩阵。部分稀疏操作集通过Templates项目提供。该库可以被配置为纯Java库运行,也可以通过Java本地接口使用BLAS机器优化的代码。

【功能列表】

²  密集、结构化稀疏矩阵的数据结构,支持如下格式:

n  密集型,主列。

n  带状矩阵,只存储几个对角线。

n  分组矩阵,只存储一半的矩阵(对于三角形或对称矩阵)。

n  三角形矩阵和对称三角形矩阵。

²  对称存储和三角存储的透明支持。

²  非结构化稀疏矩阵的数据结构:

n  压缩的行或列存储(CRS/CCS)。

n  灵活的CRS/CCS,使用可增长的稀疏向量。

n  压缩对角线存储(CDS)。

²  BLASLAPACK的基础上建立了密集型和结构化的稀疏矩阵,并包含了以下内在操作:

n  矩阵/向量乘法。

n  矩阵/矩阵乘法。

n  矩阵或向量的秩更新。

n  直接矩阵求解器。

²  非结构化稀疏矩阵支持与结构化矩阵相同的运算,只是它们没有直接的求解器。但是,它们的矩阵/向量乘法在迭代求解器中得到了优化。

²  密集和结构化稀疏矩阵的矩阵分解:

n  LUCholesky

n  非对称致密矩阵的元值分解。

n  非对称致密矩阵的奇异值分解。

n  对称矩阵(三边形、带状、密集和密集矩阵)的元值分解。

n  密集矩阵的正交矩阵分解(QRRQLQQL)。

²  Templates项目中的非结构化稀疏矩阵的迭代求解器:

n  BiConjugate梯度。

n  BiConjugate梯度稳定化。

n  共轭梯度。

n  共轭梯度平方。

n  Chebyshev迭代。

n  广义最小残差(GMRES)。

n  迭代细化(Richardson方法)。

n  准最小残差。

²  代数预设法的选择:

n  对角线预置法。

n  对称相继过度放宽。

n  不完全乔尔斯基。

n  不完全LU

n  不完全LU与使用阈值填充的不完全LU

n  通过平滑聚合的代数多网格。

License

MTJ是根据LGPL的条款发布的。

 

【最新版本】

1.04201575

【官方网站】

https://github.com/fommil/matrix-toolkits-java

【使用案例】

奇异值分解(SVD)的例子。

SVD svd = new SVD(matA.numRows(),matA.numColumns());

SVD s = svd.factor(matA);

DenseMatrix U = s.getU();

DenseMatrix S = s.getS();

DenseMatrix Vt = s.getVt();

 

矩阵乘法的例子。

DenseMatrix result = new DenseMatrix(matA.numRows(),matB.numColumns());

matA.mult(matB,result);

 

jAlgo

oj! AlgorithmsojAlgo,是一个开源的Java库,用于数学、线性代数和优化。它于2003年首次发布,是100%的纯Java源代码,不受外部依赖。它的功能集使它特别适合在金融领域使用。

 

【功能列表】

²  线性代数在Java中的应用

n  "高性能 "多线程特征完全线性代数包。

²  优化(数学编程),包括LPQPMIP求解器。

²  金融相关的代码(当然也可以用在其他领域)。

n  广泛的时间序列工具集 - CalendarDateSeries, CoordinationSet & PrimitiveTimeSeries

n  随机数和随机过程--甚至是多维的随机过程--以及驱动这些过程进行蒙特卡洛模拟等工作的能力。

n  现代投资组合理论相关类的集合--FinancePortfolio及其子类MarkowitzBlack-Litterman模型实现。

n  能够从Yahoo FinanceGoogle Finance中下载数据。

²  v38版本开始要求Java 8的安装环境。

²  44.0版本开始,金融相关的具体代码已经被移到了单独的项目/模块中,命名为ojAlgo-finance 

License

ojAlgo是根据MIT License的条款发布的。

 

【最新版本】

0.4820191124

【官方网站】

http://ojalgo.org/

 

【使用案例】

奇异值分解(SVD)的例子。

SingularValue<Doublesvd = SingularValueDecomposition.make(matA);

svd.compute(matA);

 

MatrixStore<DoubleU = svd.getQ1();

MatrixStore<DoubleS = svd.getD();

MatrixStore<DoubleV = svd.getQ2();

 

矩阵乘法的例子。

PrimitiveDenseStore result = FACTORY.makeZero(matA.getRowDim(), matB.getColDim());

result.fillByMultiplying(matA, matB);

 

exp4j

exp4j是一个用于评估数学表达式的小型Java库。它实现了DijkstraShunting-yard算法,将表达式从infix记数法翻译成反向波兰语记数法,并使用简单的Stack算法计算结果。

【功能列表】

²  变量可以用在表达式中

²  exp4j自带一组常用的内置功能

²  用户可以创建和使用自己的自定义操作符

²  用户可以创建和使用自己的自定义功能

 

License

exp4j是根据Apache License 2.0的条款发布的。

【最新版本】

0.4.82017130

 

【使用案例】

计算如下表达式的例子3 * (sin(y) – 2) / (x - 2)

 

Expression e = new ExpressionBuilder("3 * sin(y) - 2 / (x - 2)")

        .variables("x""y")

        .build()

        .setVariable("x"2.3)

        .setVariable("y"3.14);

double result = e.evaluate();

 

【官方网站】

https://www.objecthunter.net/exp4j/

【小结】

目前产品线用得比较多的程序库是Apache Commons Math,最新版本发布时间早于Apache Commons Math的有ND4J, EJML,jAlgo,exp4j这四个程序库。如果单从时间维度来看的话,我们可以从上述几个库中进行选取。 

但是,从上面介绍的一些比较流行的数学库来看,很多是基于以前的老项目,不难看出,数学知识本身是不容易过时的,过时的是用来书写表达这些知识的语言工具和平台工具。

因此:

1. 一个不错的选项是Fork当前用着比较顺手的程序库进行自研。

2. 根据自身产品线业务需求,从上面的程序库列表中寻找合适的替代项。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。