【问题标题】:PCA in Spark MLlib and Spark MLSpark MLlib 和 Spark ML 中的 PCA
【发布时间】:2017-03-08 20:02:37
【问题描述】:

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

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

spark.mllib 支持 PCA 用于存储在面向行的格式和任何向量的高瘦矩阵。

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

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

另一方面,如果您查看 ML 文档,则没有提到任何限制。

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

【问题讨论】:

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

标签: apache-spark apache-spark-mllib apache-spark-ml


【解决方案1】:

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

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

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

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

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

不管怎样,限制是由您的工作人员拥有多少内存施加的,因此他们可能会让用户自己达到上限,而不是提出可能不适用于某些人的限制。这可能是他们决定在新文档中不提及限制的原因。

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

【讨论】:

  • 感谢您的回复,抱歉我回复晚了。那么最后,您是否可能知道他们实施了哪种方法,两种方法,还是仅第一种方法(是否存在限制)?为什么他们要占用 1.000 列的数量,这就像 64MB((8*10^3)​​^2,每个双精度值 8 个字节)的数据,如果我没记错的话,它应该适合任何执行程序的内存?
  • 看代码很有启发性。在 MLLib 中,他们对行的外积使用 BLAS 运算来计算 X^T X,即第一种方法。我没有看到他们为了采用第二种方法而进行检查的迹象。不过,他们确实检查了几件事:首先,列数小于 65536,只是为了能够计算矩阵上半部分(对称)的必要分配。第二,列数少于10,000。否则,他们只会发出有关必要内存的警告。
  • 至于为什么他们选择在文档中将推荐的限制设置为 1000,好吧,也许他们只是选择了一个或多或少合理的数字,在这个数字下没有人会遇到任何麻烦,没有太多的严谨性。即使现在任何工作人员都可以采用这种大小的矩阵,但通常建议避免太大的地图任务,所以也许这就是他们选择这个数字的原因。
  • 哦,在 ml 中他们只是调用 MLLib。
猜你喜欢
  • 2018-02-13
  • 2016-12-14
  • 2019-07-16
  • 2015-02-23
  • 2016-09-26
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多