Spark SVD 的问题

数据挖掘 阿帕奇火花 降维 斯卡拉
2022-03-02 12:49:34

我有以下数据集的维度:

行数:41174

专栏:439316

矩阵非常稀疏,对此,我想执行降维。我正在使用 Spark 的 computeSVD 函数来执行降维。

但是,我收到一条错误消息

线程“主”java.lang.IllegalArgumentException 中的异常:要求失败:k = 41174 和/或 n = 439314 太大而无法计算特征分解

但是我在以下数据集上运行了相同的 computeSVD,它运行得非常好。

行数:3502

栏目:103301

在这两种情况下,我都将“k”的值传递为行、列的最小值。我无法理解我在这里做错了什么。根据错误,问题出在 K 上。如何解决上述错误。另外,关于如何确定 K 的任何想法?

1个回答

看了源码,发现问题与你的内存无关,而是整数的限制。

在源代码中,它显示了两者nmin(2k,n)min(2k,n)(min(2k,n)+8)应该小于Integer.MAX_VALUE,即2311=2147483647. 在你的情况下,nmin(2k,n)=36176793968>2147483647, 和min(2k,n)(min(2k,n)+8)=6781851888>2147483647.

我不是火花专家,也不是 java 出口,所以也许我不能给你一个解决方案。但就个人而言,您的数据集确实很大!

参考

https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html