python 矩阵保留四位小数_关联矩阵(对称矩阵)的数据压缩策略

v2-90ef453f96b9086db842e1c7bc0c7f3e_1440w.jpg?source=172ae18b

背景

在进行矩阵距离计算、网络分析时 (如基因网络、社媒网络),通常会产生一份对称矩阵。矩阵

中的主对角线元素
是不可计算的,通常根据业务要求可能为 0、1 或
。我们关心的是位于非对角线上的元素,他们的数值

保存这样的对称矩阵,实际上只需要保存上三角或下三角的数据。更一般的,我们可以将这样的表格转为3列。

v2-aaeb8b32630c61746e2eda5ba449bf7f_b.jpg

现假定这样的文件一共有不超过

个节点,每个 score 数值都是
范围内的小数。我们希望实现这样文件的数据压缩功能:压缩文件需要有尽可能高的压缩比,对于压缩、解压速度也有高要求(用于其他数据分析软件的快速访问)。
65535 个节点将会生成 2147385354 条链路,若每个 nodeName 占用 2byte、score 占用 8 byte (x.xxxxxx),文件总大小将达到 28GB!

分析

origin 和 target 种类较少且在输入文件中存在多行重复,我们考虑预先构造一个字典表保存所有可能的 nodeName,以实现精简表示。它们所有可能的种类 < 65535 种,因此可以在 2byte 范围内声明。字典表保存在 *.d 文件中。对于每一行数据,我们假定他们都是按照字典序的方向进行生成的组合,只需要通过排列组合的方法就能还原回原来的数据。

例如: 某个字典表为 A B C D
生成的 node 对为:(A, B), (A, C), (A, D), (B, C), (B, D), (C, D)

score 的数值范围都在 0-1 之间,如果这些数值保留6位有效数字,我们先将这样的数值

转换为整数:
,这些数字可以在 3 byte 内表示出来。同理,如果只保留 2 位小数,则可以在 1 byte 内表示;如果只保留 4 位小数,则可以在 2 byte 内表示。每一行数据都可以如此精简地表示,实现预先的编码,编码后的数据储存在 *.b 文件中。

当然,对于 2byte,我们也可以将其扩展为 4.5 位,即第5位小数只保留一半。这样数值整数范围是 0-100000 的偶数或者奇数(50000种,2byte可以表示6w多个数字),也正好能在 2byte 范围内表示。

举个例子:如果我们是向下保留为偶数。那么 0.123456 和 0.132513,保留四位的话是 0.1234 和 0.1325,保留 4.5 位的话是 0.12344 和 0.13250

实现

生成测试数据 generateData.py

import 

v2-e584179680b324f579bea6f2d1b3c7cd_b.jpg
数据预览

工具函数文件 Utils.py

def 

Transfer.py 函数文件

"""

评估与结论

Python 操作实在是太慢了,但代码相当直观。我们额外用Java实现了这个编码解码功能并进行测试,结果如下:

v2-3a2c22fdaba7d80cc71e4096f545ce85_b.jpg

这个效果还是相当不错的(原文件 49.15 MB 可以无损压缩为 5.72 MB,保留2位小数时可以达到 1.91 MB),速度也非常快 。

在 Java 版本中,对具有 1w 个节点的 1.24GB 文件压缩也仅仅需要 4.135s 时间、解压需要 2.818s 时间,远远快于 gzip 算法的 44.25s 和 3.59 s。并且,它可以将该文件压缩为 47.67MB-95.34MB-143.01MB 大小(当然,进一步使用 gzip 可以压缩到 40.07MB-87.65MB-133.24MB),而 gzip 压缩为 309.39 MB 大小。

由于该压缩策略采用了固定编码位长,它可以非常方便地进行随机访问。假设字典文件储存的节点数量为

,将 score 编为
byte 的数据,则在访问节点
时 (
从 1 开始计数,且
),可以计算出对应的数据在原文件的第:

行。节点名称为

,在编码后文件中数据指针范围为

基于以上特性,该编码方案可以成为相关领域的替代储存方案。


作者:张柳彬

如有疑问,请联系QQ:965579168

转载请声明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值