用稀疏数据解方程组


11

我正在尝试求解一组具有40个自变量(x1,...,x40)和一个因变量(y)的方程式。方程的总数(行数)为〜300,我想求解40个系数的集合,该系数最小化y和预测值之间的总平方误差。

我的问题是矩阵非常稀疏,我不知道用稀疏数据解方程组的最佳方法。数据集的示例如下所示:

   y    x1  x2 x3 x4 x5 x6 ... x40
87169   14  0  1  0  0  2  ... 0 
46449   0   0  4  0  1  4  ... 12
846449  0   0  0  0  0  3  ... 0
....

我目前正在使用一种遗传算法来解决此问题,得出的结果大约是观察到的和预期的两个差异。

任何人都可以提出能够解决稀疏数据方程组的不同方法或技术吗?


2
标题中的错字:备用=>稀疏。
Aleksandr Blekh 2014年

Answers:


11

如果我对您的理解正确,那么使用稀疏数据多元线性回归就是这种情况(稀疏回归)。假设如此,我希望您会发现以下有用的资源

1)NCSU 讲演关于稀疏回归的幻灯片,其中概述了算法,注释,公式,图形和参考文献:http : //www.stat.ncsu.edu/people/zhou/courses/st810/notes/lect23sparse.pdf

2)R生态系统提供了许多软件包,可用于稀疏回归分析,包括:

3)博客帖子与稀疏回归溶液的例子,基于SparseMhttp://aleph-nought.blogspot.com/2012/03/multiple-linear-regression-with-sparse.html

4)博客帖子使用R中的稀疏矩阵,其包括引物使用glmnethttp://www.johnmyleswhite.com/notebook/2011/10/31/using-sparse-matrices-in-r

5)有关该主题的更多示例和一些讨论可以在StackOverflow上找到:https : //stackoverflow.com/questions/3169371/large-scale-regression-in-r-with-a-sparse-feature-matrix

更新(根据您的评论):

如果您尝试解决有约束的LP问题,则可能会发现此理论文章很有用:http : //web.stanford.edu/group/SOL/papers/gmsw84.pdf

另外,检查R软件包limSolvehttp : //cran.r-project.org/web/packages/limSolve。并且,通常,请在CRAN Task View “优化和数学编程”中检查软件包:http : //cran.r-project.org/web/views/Optimization.html

最后,检查一本书“在科学和工程中将R用于数值分析”(作者Victor A. Bloomfield)。它有一节关于用稀疏矩阵表示的方程组的求解(第5.7节,第99-104页),其中包括基于上述某些软件包的示例:http : //books.google.com/books? ID = 9ph_AwAAQBAJ&PG = PA99&LPG = PA99&DQ = R + limsolve +稀疏+矩阵&源= BL&OTS = PHDE8nXljQ&SIG = sPi4n5Wk0M02ywkubq7R7KD_b04&HL = EN&SA = X&EI = FZjiU-ioIcjmsATGkYDAAg&VED = 0CDUQ6AEwAw#v = onepage&q = R%20limsolve%20sparse%20matrix&F =假


3
感谢您的好评!我不愿意将问题归类为稀疏回归,因为我并不是真正地尝试建模和预测,而是解决一组系数。我使用遗传算法的原因是因为我也可以对方程使用约束。如果没有其他答案,我将很乐意接受。
mike1886

1
@ mike1886:我很高兴!根据您的评论,我已经更新了答案。希望能帮助到你。
Aleksandr Blekh

7

亚历山大·亚历山大的答案是完全正确的。

但是,提出问题的方式意味着这是一个直接的普通最小二乘回归问题:最小化因变量和线性预测变量组合之间的残差平方和。

现在,尽管您的设计矩阵中可能有很多零,但您的系统本身并不过分:在40个预测变量上进行300次观察,结果中等。您可以使用R进行这样的回归,而无需进行特殊的稀疏数据处理。只需使用lm()命令(用于“线性模型”)。使用?lm查看帮助页面。请注意,lm默认情况下,默认情况下会在设计矩阵中静默添加一列常数(截距)- -1在公式的右侧添加一个以抑制这种情况。总体而言,假设您的所有数据(以及其他所有数据)都在data.frame被调用中foo,则可以执行以下操作:

model <- lm(y~.-1,data=foo)

然后,您可以像这样查看参数估计值:

summary(model)
residuals(model)

如果您的系统大得多,例如说大约有10,000个观测值和数百个预测变量,那么按照Aleksandr的答案研究专门的稀疏求解器可能就开始有意义了。

最后,在对Aleksandr的回答的评论中,您提到了方程的约束。如果这实际上是您的关键问题,那么可以使用多种方法来计算R中的约束最小二乘法。我个人很喜欢pcls()这种mgcv包装。也许您想编辑您的问题以包括您面临的约束类型(盒约束,非负约束,完整性约束,线性约束...)?


1
史蒂芬,谢谢您的客气!支持您的好答案。根据问题作者的评论,您可能会对我对答案所做的更新感兴趣。
Aleksandr Blekh 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.