哪个 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 稀疏矩阵类最适合计算距离矩阵?的主要内容,如果未能解决你的问题,请参考以下文章
用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot