0

将包含约 500 万个非零元素的 10,000 x 40,000 CSR 矩阵转储到 /dev/null 大约需要 6 分钟。有更快的选择吗?

将其转换为另一种稀疏格式并没有帮助。

4

3 回答 3

2

当前的实现在 0.14 中非常幼稚。您可以尝试使用line_profiler对其进行分析以找到主要瓶颈。

如果您找到一种更快的方法来实现它(可选地使用 cython 作为加载器),那么请随时打开拉取请求。

于 2013-09-19T16:36:15.657 回答
2

如果您升级到 scikit-learn 的前沿开发版本(或将此文件复制粘贴到您的安装中),您将获得dump_svmlight_file比以前快十倍的速度。

于 2013-09-20T10:16:00.450 回答
0

编辑:忽略以下答案!实际上,scikit-learn 实现的作者提供了一个基于 Cython 的转储程序。它可以在 3 秒内转储相同的矩阵。

以下运行时间为 60 秒,其中 6 秒在循环之外运行。它利用了一个事实,即 COO 矩阵本质上已经是正确的格式。

def dump_svmlight_file_sparse(X, y, f, zero_based=True):
    X = X.sorted_indices().tocoo()

    if not zero_based:
        X.col += 1

    y = y.astype(int).astype(str)
    col = X.col.astype(str)
    dat = X.data.astype(str)

    last_row = 0
    f.write(y[0])

    for i in xrange(len(X.data)):
        while last_row < X.row[i]:
            last_row += 1
            f.write('\n'+y[last_row])

        f.write(' '+col[i]+':'+dat[i])

    f.write('\n')
于 2013-09-20T02:09:34.050 回答