2016-10-26 131 views
6

Spark现在有两个机器学习库 - Spark MLlib和Spark ML。它们在实现中有些重叠,但据我了解(作为Spark整个生态系统的新手),Spark ML是最好的选择,而MLlib主要是为了向后兼容。Spark MLlib和Spark ML中的PCA

我的问题非常具体,与PCA有关。在MLlib实施似乎有列数的限制

spark.mllib支持PCA存储在面向行的格式和矢量任何身高和骨感矩阵。

另外,如果你看一下Java的代码示例也有这个

列数要小,例如,小于1000

在另一方面,如果您查看ML文档,则没有提及的限制。

所以,我的问题是 - Spark限制还存在吗?如果是这样,为什么限制和有什么解决方法可以使用这个实现,即使列数很大?

+0

有趣的问题。我在mllib文档中看到了许多其他不一致之处。 – Rob

回答

1

PCA在于找到一组独立的随机变量,您可以使用它们来表示您的数据,并根据它们保留的方差量按降序排列。

这些变量可以通过将您的数据点投影到特定的正交子空间中找到。如果您的(以平均值为中心的)数据矩阵是X,则此子空间由X的特征向量组成X^T X

X是大的,表示尺寸的Ñ X d,则可以通过本身计算矩阵的每行的外积,然后加入所有的结果中计算X^TX 。当然,如果d很小,无论多大n是,这当然适用于简单的地图缩小程序。这是因为每行的外部产品本身就是一个矩阵,每个工人都必须在主内存中对其进行操作。这就是为什么在处理多个色谱柱时可能会遇到麻烦的原因。

如果列数很大(以及行数不那么多),您的确可以计算PCA。只需计算(平均中心)转置数据矩阵的SVD,并将其乘以特征向量和特征值对角矩阵的逆。有你的正交子空间。底线:如果spark.ml实现每次都遵循第一种方法,那么限制应该是相同的。如果他们检查输入数据集的维度以决定是否应该采用第二种方法,那么如果行数很少,则不会遇到处理大量列的问题。

不管的是,限制由你的员工有多少内存强加的,所以,他们或许让用户自己大发雷霆,而不是暗示可能不适用于某些限制。这可能是他们决定不提及新文档限制的原因。

更新:源代码揭示了他们每次都采取第一种方法,而不管输入的维数如何。实际的限制是65535,并在10,000时发出警告。

+0

感谢您的回答,抱歉我迟到的回复。所以在最后,你可能知道用什么办法?他们实现,这两种方法,或只有第一个(不限制存在)?为什么他们需要1.000列的数据,就像64MB((8 * 10^3)^ 2,每个双值8个字节)的数据,如果我没有错,应该适合任何执行者的内存? – Marko

+1

看代码很有启发。在MLLib它们计算使用BLAS操作的行的外产物,即第一种方法X^T X。我没有看到他们为了采用第二种方法进行检查。他们做检查几件事情,但:第一,列数小于65536,只是为了能够计算所需的分配矩阵的上半部分(即对称)。其次,列数少于10,000。否则,他们只会发出有关必要记忆的警告。 – broncoAbierto

+1

至于他们为什么选择在文档中将建议限制设置为1000,那么也许他们只是选择了一个或多或少的合理数字,在这个数字下没有人应该预料到任何麻烦,没有太多严格的要求。尽管现在任何工作人员都可以采用这种大小的矩阵,但通常建议避免太大的地图任务,所以也许这就是他们选择这个数字的原因。 – broncoAbierto