Java 如何使用NNLS进行非负多元线性回归?

Java 如何使用NNLS进行非负多元线性回归?,java,apache-spark,linear-regression,apache-spark-mllib,Java,Apache Spark,Linear Regression,Apache Spark Mllib,我试图用Java解决非负多元线性回归问题。 我发现了一个用Scala编写的解算器类。 然而,我不知道如何使用这个 让我困惑的是,以下方法的接口似乎很奇怪。 我认为A是MxN矩阵,b是M向量,参数ata和atb应该分别是NxN矩阵和N向量。 但是,ata的实际类型是double[] publicstaticdouble[]solve(double[]ata,double[]atb,NNLS.Workspace ws) 我搜索了一个示例代码,但找不到。 谁能给我一个示例代码? 该库是用Scala编

我试图用Java解决非负多元线性回归问题。 我发现了一个用Scala编写的解算器类。 然而,我不知道如何使用这个

让我困惑的是,以下方法的接口似乎很奇怪。 我认为
A
是MxN矩阵,
b
是M向量,参数
ata
atb
应该分别是NxN矩阵和N向量。 但是,
ata
的实际类型是
double[]

publicstaticdouble[]solve(double[]ata,double[]atb,NNLS.Workspace ws)
我搜索了一个示例代码,但找不到。 谁能给我一个示例代码?
该库是用Scala编写的,但如果可能的话,我需要Java代码。

免责声明我从未使用过
NNLS
,也不知道非负多元线性回归

您可以看看Spark 2.1.1的
NNLS
,它实现了您想要的功能,但从那以后就不再是一条路了

更重要的是,从Spark 2.0开始,
org.apache.Spark.mllib
包(包括
org.apache.Spark.mllib.optimization
属于
NNLS
的)位于:

基于MLlib RDD的API现在处于维护模式

从Spark 2.0开始,Spark.mllib包中基于RDD的API已进入维护模式。Spark的主要机器学习API现在是Spark.ml包中基于数据帧的API

换句话说,您应该远离软件包,尤其是
NNLS

那么,还有什么选择呢

您可以查看
NNLS
的测试,也就是说,在那里您可以找到一些答案

但是,ata的实际类型是double[]

这是一个矩阵,所以元素又是双倍的。事实上,
ata
直接传递给BLAS的
dgemv
(和),如文件所述:

DGEMV执行矩阵向量操作之一

y := alpha*A*x + beta*y,   or   y := alpha*A**T*x + beta*y,
其中alpha和beta是标量,x和y是向量,A是标量 m乘n矩阵

这应该给你足够的答案


另一个问题是Spark MLlib中针对类
NNLS
计算的推荐方法是什么

它看起来像是Spark MLLib的ALS算法
NNLS
(这对机器学习实践者来说可能并不奇怪)

当ALS配置为在参数打开的情况下训练模型时,即
true
(默认情况下禁用)使用该部分代码

非负参数,用于确定是否应用非负性约束

默认值:false

是否对最小二乘法使用非负约束

我建议查看Spark MLlib的这一部分,以便更深入地了解
NNLS
用于解决非线性回归问题的用法。

我编写了一个测试代码。 虽然我收到了一些警告,如
未能从com.github.fommil.netlib.NativeSystemBLAS加载实现,但它在简单情况下运行良好,但当
m
非常大(约3000)时,
beta
通常变为0

封装测试;
导入org.apache.spark.mllib.optimization.NNLS;
公共类NNLSTest{
公共静态void main(字符串[]args){
int n=6,m=300;
示例inMatlabDoc();
所有正态的正态分布(n,m);
某些负性nbeta(n,m);
无相关性(n,m);
}
专用静态空隙试验(双[]X,双[]y,双[]b){
int m=X.length;int n=X[0]。length;
double[]Xty=新的双精度[n];
对于(int i=0;iy := alpha*A*x + beta*y,   or   y := alpha*A**T*x + beta*y,