在Python中表示稀疏矩阵并保存到磁盘
我有很多时间序列数据(有几百万个),它们的长度各不相同,我打算对这些数据进行聚类分析(可能会用到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 - 有没有更好的方式把时间序列存储到磁盘上?我还没有找到一种有效的方法,可以直接把数据写入磁盘作为稀疏矩阵,并且在之后能相对快速地读取到内存中。
我希望能得到一个同时解决这两个问题的方法,也就是说,能够直接把稠密矩阵的行存储到稀疏数据结构中,并且高效地进行数据的读写。