Spark MLlib 和 Spark ML 中的 PCA

2024-02-24

Spark 现在有两个机器学习库——Spark MLlib 和 Spark ML。它们在实现的内容上确实有些重叠,但据我了解(作为整个 Spark 生态系统的新手)Spark ML 是可行的方法,而 MLlib 仍然存在主要是为了向后兼容。

我的问题非常具体并且与PCA相关。在MLlib http://spark.apache.org/docs/latest/mllib-dimensionality-reduction.html#principal-component-analysis-pca实施似乎有列数的限制

Spark.mllib 支持以面向行格式存储的高瘦矩阵和任何向量的 PCA。

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

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

另一方面,如果你看看ML http://spark.apache.org/docs/latest/ml-features.html#pca文档中,没有提到任何限制。

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


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

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

When X尺寸很大n x d,你可以计算X^T X通过计算矩阵每一行本身的外积,然后将所有结果相加。这当然适用于简单的映射缩减过程,如果d很小,无论有多大n是。这是因为每行本身的外积是d x d矩阵,每个工作人员必须在主内存中对其进行操作。这就是为什么您在处理许多列时可能会遇到麻烦。

如果列数很大(而行数不是那么多),你确实可以计算 PCA。只需计算(以平均值为中心)转置数据矩阵的 SVD,并将其乘以所得特征向量和特征值对角矩阵的逆矩阵。这就是正交子空间。

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

不管怎样,限制是由你的工作人员拥有多少内存决定的,所以也许他们让用户自己达到上限,而不是提出一个可能不适用于某些人的限制。这可能就是他们决定不在新文档中提及限制的原因。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark MLlib 和 Spark ML 中的 PCA 的相关文章

随机推荐