【问题标题】:Which SciPy sparse matrix class is best to compute a distance matrix?哪个 SciPy 稀疏矩阵类最适合计算距离矩阵?
【发布时间】: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 不能。

标签: python scipy scikit-learn distance sparse-matrix


【解决方案1】:

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

【讨论】:

    最近更新 更多