我正在研究Java项目,我必须计算多元线性回归,但我希望得到的参数是非负的。是否有一个现有的商业友好许可库来做这样的事情?我一直在寻找Non-Negative Least Squares libs,但没有成功。
答案 0 :(得分:2)
好吧,我找不到任何纯java库,所以我自己从[1]的文章中创建它,可以在[2]和[3]中找到。我给出了算法:
P,R是主动和被动集合。 t()是转置
问题是在条件x> 0
下解决Ax = bP=null
R = {1,2,...,m}
x = 0
w = t(A)*(b-A*x)
while R<>null and max{wi|i in R}>0 do:
j = argmax{wi|i in R}
P = P U {j}
R = R\{j}
s[P] = invert[t(A[P])A[P]]t(A[P])b
while sp<=0 do:
a = -min{xi/(di-xi)|i in P and di<0}
x = x + a*s -x
update(P)
update(R)
sP = invert[t(A[P])A[P]]t(A[P])b
sR = 0
x = s
w = t(A)*(b-A*x)
return x
对于其他定义,我强烈建议阅读在线论文[2]和[3](参见下面的链接;)
[1] Lawson,C。L.,&amp; Hanson,R。J.(1974)。解决最小二乘问题(第161卷)。恩格尔伍德悬崖,新泽西州:Prentice-hall。 [2] Rasmus Bro et Sijmen De Jong:一种快速的非负性约束最小二乘法 算法。化学计量学杂志,11(5):393-401,1997。http://www.researchgate.net/publication/230554373_A_fast_non-negativity-constrained_least_squares_algorithm/file/79e41501a40da0224e.pdf [3] Donghui Chen和Robert J Plemmons:数值分析中的非负性约束。关于数值分析诞生的专题讨论会,第109-140页,2009年。http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.157.9203&rep=rep1&type=pdf
答案 1 :(得分:2)
您可以使用Apache Commons Math,使您的约束成为目标函数的额外成本。请参阅此处的第14.4节:http://commons.apache.org/proper/commons-math/userguide/leastsquares.html
答案 2 :(得分:1)
你试过Weka吗?它是Java和GNU通用公共许可证。它主要是用于实验的GUI工具,但您也可以将其用作库。它应该有线性回归的实现。
答案 3 :(得分:1)
正如George Foreman指出你可以使用apache commons math。 特别是存在对象 OLSMultipleLinearRegression ,其提供用于执行多元回归分析的方法。
以下是一些有关如何操作的代码。
OLSMultipleLinearRegression ols = new OLSMultipleLinearRegression();
double [] data = new double [75];
int numberOfObservations = 25;
int numberOfIndependentVariables = 3;
try {
ols.newSampleData(data, numberOfObservations, numberOfIndependentVariables);
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
以下是整个github项目,您可以从中下载有关如何在Java中使用多元回归的工作示例:https://github.com/tekrar/MultRegressionInJava