Spark MLlib 和 Spark ML 中的 PCA
PCA in Spark MLlib and Spark ML
Spark 现在有两个机器学习库 - Spark MLlib 和 Spark ML。它们在实现方面确实有些重叠,但据我了解(作为整个 Spark 生态系统的新手)Spark ML 是必经之路,而 MLlib 仍然存在主要是为了向后兼容。
我的问题非常具体并且与 PCA 有关。在 MLlib 实现中,列数似乎有限制
spark.mllib supports PCA for tall-and-skinny matrices stored in row-oriented format and any Vectors.
此外,如果您查看 Java 代码示例,还有这个
The number of columns should be small, e.g, less than 1000.
另一方面,如果您查看 ML 文档,则没有提到任何限制。
所以,我的问题是 - 这个限制是否也存在于 Spark ML 中?如果是这样,为什么会有限制?即使列数很大,是否有任何解决方法可以使用此实现?
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 时他们发出警告。
Spark 现在有两个机器学习库 - Spark MLlib 和 Spark ML。它们在实现方面确实有些重叠,但据我了解(作为整个 Spark 生态系统的新手)Spark ML 是必经之路,而 MLlib 仍然存在主要是为了向后兼容。
我的问题非常具体并且与 PCA 有关。在 MLlib 实现中,列数似乎有限制
spark.mllib supports PCA for tall-and-skinny matrices stored in row-oriented format and any Vectors.
此外,如果您查看 Java 代码示例,还有这个
The number of columns should be small, e.g, less than 1000.
另一方面,如果您查看 ML 文档,则没有提到任何限制。
所以,我的问题是 - 这个限制是否也存在于 Spark ML 中?如果是这样,为什么会有限制?即使列数很大,是否有任何解决方法可以使用此实现?
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 时他们发出警告。