在Python中表示稀疏矩阵并保存到磁盘

0 投票
1 回答
1887 浏览
提问于 2025-04-18 02:03

我有很多时间序列数据(有几百万个),它们的长度各不相同,我打算对这些数据进行聚类分析(可能会用到sklearn中的kmeans实现)。

为了我的分析,我需要先对这些时间序列进行对齐(确保最大值在中间),用零填充它们(这样它们的长度就一致了),然后再进行归一化处理,才能进行聚类分析。举个简单的例子,像这样:

[5, 0, 7, 10, 6]

处理后会变成这样:

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

在实际数据中,原始时间序列的长度是90,而经过填充、对齐和归一化后的时间序列长度是181。当然,这里有很多零,所以用稀疏矩阵来存储数据似乎是个理想的选择。

基于这个情况,我有两个相关的问题:

1 - 如何在内存中最好地存储这些数据?我现在的方法效率不高,是为每个时间序列计算一个稠密的归一化/对齐/填充矩阵,然后把它写入一个简单的文本文件进行存储,之后再单独读取这些数据到一个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 - 有没有更好的方式把时间序列存储到磁盘上?我还没有找到一种有效的方法,可以直接把数据写入磁盘作为稀疏矩阵,并且在之后能相对快速地读取到内存中。

我希望能得到一个同时解决这两个问题的方法,也就是说,能够直接把稠密矩阵的行存储到稀疏数据结构中,并且高效地进行数据的读写。

1 个回答

0

我建议你使用pandas对稀疏矩阵的支持,然后利用它的输入输出工具来写入,比如说写到HDFS上。

撰写回答