我正在尝试用Java解决非负多元线性回归问题。
我发现了一个求解器类 org.apache.spark.mllib.optimization.NNLS
用 Scala 编写。
但是,我不知道如何使用它。
让我困惑的是下面这个方法的接口(interface)看起来很奇怪。
我认为 A
是一个 MxN 矩阵,b
是一个 M vector ,参数 ata
和 atb
应该分别是 NxN 矩阵和 N vector 。
然而,ata
的实际类型是 double[]
。
public static double[] solve(double[] ata, double[] atb, NNLS.Workspace ws)
我搜索了示例代码,但找不到。 谁能给我一个示例代码? 该库是用 Scala 编写的,但如果可能的话我想要 Java 代码。
最佳答案
免责声明我从未使用过NNLS
,也不了解非负多元线性回归。
您查看 Spark 2.1.1 的 NNLS
,它可以实现您想要的功能,但自从 the latest Spark 2.2.1 marked as private[spark] 以来这并不是可行的方法。 .
private[spark] object NNLS {
更重要的是,从 Spark 2.0 开始,org.apache.spark.mllib
包(包括org.apache.spark.mllib.optimization
,NNLS
属于)在 maintenance mode :
The MLlib RDD-based API is now in maintenance mode.
As of Spark 2.0, the RDD-based APIs in the spark.mllib package have entered maintenance mode. The primary Machine Learning API for Spark is now the DataFrame-based API in the spark.ml package.
换句话说,您应该远离该包,尤其是 NNLS
。
那么还有什么替代方案呢?
你可以看看NNLS
的测试,即NNLSSuite在那里你可以找到一些答案。
However, the actual type of ata is double[].
这是一个矩阵,因此元素再次变为 double 。事实上,ata
直接传递到 BLAS 的 dgemv
( here 和 here ),如 LAPACK 中所述。文档:
DGEMV performs one of the matrix-vector operations
y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,
where alpha and beta are scalars, x and y are vectors and A is an m by n matrix.
这应该给你足够的答案。
<小时/>另一个问题是 Spark MLlib 中用于类似 NNLS 计算的推荐方法是什么?
看起来像Spark MLLib的ALS算法uses NNLS
在幕后(这对于机器学习从业者来说可能并不奇怪)。
当 ALS 配置为使用 nonnegative 训练模型时,将使用这部分代码。参数已打开,即 true
(默认情况下禁用)。
nonnegative Param for whether to apply nonnegativity constraints.
Default: false
whether to use nonnegative constraint for least squares
我建议您查看 Spark MLlib 的这一部分,以更深入地了解 NNLS
解决非负线性回归问题的用途。
关于java - 如何使用NNLS进行非负多元线性回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48041254/