Spark MLlib和Spark ML中的PCA

问题描述 投票:9回答:1

Spark现在有两个机器学习库 - Spark MLlib和Spark ML。它们在实现的内容上有些重叠,但正如我所理解的那样(作为整个Spark生态系统的新手)Spark ML是要走的路,MLlib仍然主要是为了向后兼容。

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

spark.mllib支持PCA,用于存储以行为导向格式和任何向量的高小矩阵。

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

列数应该很小,例如小于1000。

另一方面,如果你看一下ML文档,没有提到的限制。

所以,我的问题是 - Spark ML中是否也存在这种限制?如果是这样,为什么限制,即使列数很大,是否有任何解决方法可以使用此实现?

apache-spark apache-spark-mllib apache-spark-ml
1个回答
3
投票

PCA包括找到一组可以表示数据的去相关随机变量,并按照它们保留的方差量的降序排序。

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

当X很大时,比如尺寸为n x d,你可以通过计算矩阵每行的外积来计算X ^ T X,然后将所有结果加起来。如果d很小,无论n多大,这当然都适用于简单的map-reduce过程。这是因为每行的外积本身就是一个d x d矩阵,每个工人都必须在主存中操作。这就是为什么在处理许多列时可能会遇到麻烦的原因。

如果列数很大(并且行数不是那么多),您确实可以计算PCA。只需计算(平均居中的)转置数据矩阵的SVD,然后将其乘以得到的特征向量和特征值对角矩阵的倒数。有你的正交子空间。

底线:如果spark.ml实现每次都遵循第一种方法,那么限制应该是相同的。如果他们检查输入数据集的维度以决定是否应该采用第二种方法,那么如果行数很小,则不会遇到处理大量列的问题。

无论如何,限制是由你的工人有多少记忆所强加的,所以也许他们让用户自己达到上限,而不是建议一些可能不适用于某些人的限制。这可能是他们决定不提新文档中的限制的原因。

更新:源代码显示每次都采用第一种方法,无论输入的维度如何。实际限制为65535,在10,000时会发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.