【问题标题】:Representing a sparse matrix in Python and storing to disk在 Python 中表示稀疏矩阵并存储到磁盘
【发布时间】:2014-05-23 00:24:26
【问题描述】:

我计划对大量不同长度的时间序列(数百万)进行聚类分析(可能使用 kmeans 的 sklearn 实现)。

出于我的目的,我需要对齐时间序列(使最大值居中,用零填充它们(因此它们都是相同的长度),并在我可以进行聚类分析之前对它们进行规范化。所以作为一个简单的例子,比如:

[5, 0, 7, 10, 6]

会变成这样的

[0, 0.5, 0, 0.7, 1, 0.6, 0, 0, 0]

在实际数据中,原始时间序列的长度为 90,填充/对齐/标准化时间序列的长度为 181。当然,我们这里有很多零,所以稀疏矩阵似乎是理想的方法存储数据。

基于此,我有两个相关的问题:

1 - 如何最好地将这些存储在内存中?我目前的低效方法是为每个时间序列计算 dense 规范/对齐/填充矩阵并写入一个简单的文本文件以进行存储,然后将该数据分别读入一个 scipy 稀疏 lil 矩阵:

rows, columns = N, 181
matrix = scipy.sparse.lil_matrix( (rows, columns) )

for i,line in enumerate(open(file_containing_dense_matrix_data)):
    # The first two values in each line are metadata
    line = map(float,line.strip().split(',')[2:])

matrix[i]=line

这比我希望的速度慢,而且占用的内存更多。有首选方法吗?

2 - 有没有更好的方法将时间序列存储在磁盘上?我还没有找到一种有效的方法将数据作为稀疏矩阵直接写入磁盘,以后我可以(相对)快速地读入内存。

我的理想回答是解决这两个问题的方法,即将密集矩阵行直接存储到稀疏数据结构中,并有效地从磁盘读取/写入数据。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我建议使用pandas support for sparse matrixes,然后使用IO tools 来编写例如到 HDFS。

    【讨论】:

    • 哈!我什至没有意识到熊猫有稀疏矩阵来支持。这太棒了!但是,你碰巧知道处理迭代添加到数据帧的正确方法吗?我一次添加一行,但不想构建整个数组然后转换为稀疏(太多内存)。我可以将稀疏系列添加为行(df = df.append(series.to_sparse()),还是必须在每个循环中重新“稀疏化”矩阵(即df = df.append(series).to_sparse())?
    • @moustachio:不,我真的不知道。我建议您使用Numpy sparse arrays and their vstack method 逐步增长矩阵,然后按照in this other SO question 的描述填充一个稀疏的 Pandas 数据框@
    • 关于将稀疏矩阵存储到 HDFS,请参阅stackoverflow.com/a/22589030/2858145
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2015-09-01
    • 2011-03-29
    • 1970-01-01
    • 2023-03-16
    • 2022-08-18
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多