我正在执行一些聚类/分类任务,并希望以一种可以节省尽可能多空间的方式存储稀疏向量。
实际的矢量表示形式(即CSR)无关紧要。出于我的目的,我选择了一种类似于Mallet使用的格式:由特征id(long)和value(integer)组成的对。他们可能看起来像这样:
6 0:2 5:3 21:7 31:1 33:9 41:5 42:2 60:6 77:6 88:1 92:3 104:1 117:4
8 5:9 19:2 21:6 31:1 33:1 42:7 77:4 104:1 117:2 140:3 141:2 154:6
4 0:2 5:14 14:1 21:5 31:7 33:2 42:4 45:3 60:2 104:1 130:1 134:2
5 0:5 5:2 21:5 28:1 31:1 33:4 42:4 60:3 71:1 77:3 117:1 130:1 134:3
11 0:6 5:9 15:2 18:1 21:5 28:4 31:4 32:1 33:2 42:6 49:3 56:1 60:3 94:1
1 0:4 5:4 21:5 28:1 33:5 40:1 42:4 60:4 77:3 150:1 154:2 157:1 161:1
3 0:6 5:11 21:10 28:2 31:2 33:6 42:10 60:1 77:4 85:1 97:1 134:3 141:2
最初,我将它们存储在文本文件中,格式与上面所示的完全相同。 令我惊讶的是,实际上以二进制格式(成对的8个字节长,4个字节整数)存储信息似乎更大,这可能是因为大多数值似乎都在一个数字范围内,这又恰好需要一个字节来存储以ASCI编码。
在处理可变大小的数字时,有哪些巧妙的方法可以节省空间(实际压缩除外,这对于随机访问而言是不希望的)?我想不出任何“确定性”序列化方案,该方案将根据值使用较少的空间并且仍然易于解析。
答案 0 :(得分:0)
第一个数字保持不变
然后按顺序排列,没有空格,每个数字按字母顺序->一位数字a,两位数字-> b等。
example:
1 2 3 15 17 -> a123b1517
1 3 101 -> a13c101,
然后以相同的方式对其进行估价:
示例:
1 2 3 4 53 4 6 343 11 5 7 3-> a1234b53a46c343b11a573
您的示例:
6 0:2 5:3 21:7 31:1 33:9 41:5 42:2 60:6 77:6 88:1 92:3 104:1 117:4
8 5:9 19:2 21:6 31:1 33:1 42:7 77:4 104:1 117:2 140:3 141:2 154:6
4 0:2 5:14 14:1 21:5 31:7 33:2 42:4 45:3 60:2 104:1 130:1 134:2
...
->
6a05b213133414260778892c104117|a2371952661314
8a5b192131334277c104117140141154|a926117412326
4a05b14213133424560c104130134|a2b14a1572432112
...
由于特征和值之间的“ | a”通常可以将其更改为一个字母,例如z