spark现在有两个机器学习库—spark mllib和spark ml。它们在实现的内容上确实有些重叠,但据我所知(作为一个对整个spark生态系统陌生的人),spark ml是一条路要走,而mllib仍然主要是为了向后兼容。
我的问题非常具体,涉及到pca。在mllib实现中,似乎有列数的限制
mllib支持以行定向格式存储的高矩阵和瘦矩阵以及任何向量的pca。
另外,如果您看一下java代码示例,也会发现
列数应较小,例如,小于1000。
另一方面,如果您查看ml文档,则没有提到任何限制。
所以,我的问题是-spark ml中是否也存在这种限制?如果是这样的话,那么即使列的数量很大,为什么还要限制使用这个实现呢?还有什么解决方法吗?
1条答案
按热度按时间jdzmm42g1#
主成分分析就是找出一组可以表示数据的不相关随机变量,并根据它们所保留的方差大小按降序排序。
通过将数据点投影到特定的正交子空间,可以找到这些变量。如果你的(以均值为中心的)数据矩阵是x,这个子空间由x^t x的特征向量组成。
当x很大时,比如说维数nxd,你可以通过计算矩阵每一行的外积来计算x^tx,然后把所有结果相加。如果d很小,不管n有多大,这当然可以通过一个简单的map reduce过程来实现。这是因为每一行的外积本身就是一个dxd矩阵,每个worker必须在主内存中对其进行操作。这就是为什么在处理许多列时可能会遇到麻烦的原因。
如果列的数量很大(而行的数量不是那么多),那么您确实可以计算pca。只需计算你的(以平均值为中心的)转置数据矩阵的奇异值分解,并将其乘以得到的特征向量和特征值的对角矩阵的逆。这是你的正交子空间。
底线:如果spark.ml实现每次都遵循第一种方法,那么限制应该是相同的。如果他们检查输入数据集的维度以决定是否应该采用第二种方法,那么如果行数很小,那么处理大量列就不会有问题。
不管怎样,这个限制是由你的工作人员有多少内存决定的,所以也许他们会让用户自己来达到上限,而不是建议一个可能不适用于某些人的限制。这可能就是他们决定在新文件中不提限制的原因。
更新:源代码显示,无论输入的维度如何,它们每次都采用第一种方法。实际上限是65535,在10000时他们会发出警告。