哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?

Posted

技术标签:

【中文标题】哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?【英文标题】:Which SciPy sparse matrix class is best to compute a distance matrix? 【发布时间】:2015-01-29 21:25:02 【问题描述】:

我有一个相对较大的 NumPy 数组(近 300k 行和 20 多列,尽管大多数值为 0),我需要使用 scikit-learn 的 pairwise_distances 函数为其计算距离矩阵。

不幸的是,除非我将输入数组转换为稀疏矩阵,否则此过程会出现内存错误。 SciPy 提供了许多sparse matrix classes,我不知道哪一个最适合这种特殊情况。

我找到了一个支持 CSR 或 CSC 的 SO answer,但我不清楚哪个最适合计算距离矩阵。欢迎提出任何建议!

【问题讨论】:

距离矩阵不是稀疏的。好吧,我想如果你有很多重复点,它可能是稀疏的,但这种情况很少发生。 输入数组,而不是距离矩阵,是我要转换为稀疏矩阵的数组。 啊,我明白了。但即便如此,得到的距离矩阵将有 n 选择 2 个条目,这(对于 n=300,000)肯定不适合内存。因此,我认为将输入数组转换为稀疏数组并没有多大帮助。 如果你想计算成对距离上的统计数据,将整个数组保存在内存中可能没有意义。你用这个矩阵做什么? 距离矩阵将作为 scikit-learn 的 silhouette_score 函数的输入,该函数评估聚类解决方案。我预先计算了距离矩阵,因为pairwise_distances 可以并行化,而在后台计算距离矩阵的silhouette_score 不能。 【参考方案1】:

CSR 按行排序,CSC 按列排序。因此,使用 CSR 访问行会更快,使用 CSC 访问列会更快。由于sklearn.metrics.pairwise.pairwise_distances 使用 X 作为输入,其中行是实例,列是属性,它将访问稀疏矩阵中的行。因此,使用 CSR 可能更有效。

【讨论】:

以上是关于哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 scipy 稀疏矩阵行列式而不将其变为密集?

优化 Scipy 稀疏矩阵

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

如何从 scipy 稀疏块矩阵中取回块?

scipy.sparse.linalg.spsolve Linux 系统上大型稀疏矩阵的令人惊讶的行为

Scipy---6.稀疏矩阵