我正在做一些聚类/分类任务,并且正在考虑以一种尽可能节省空间的方式来存储稀疏向量。
实际的向量表示(即CSR)并不重要。出于我的目的,我选择了一种类似于Mallet使用的格式:由特征id(long)和value(整数)组成的对。它们可能看起来像这样:
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编码存储。
在处理可变大小的数字时,有哪些节省空间的聪明方法(实际压缩除外,这对于随机访问目的是不可取的)?我想不出任何“确定性”的序列化方案,它可以根据值使用较少的空间,并且仍然易于解析。
发布于 2018-08-01 22:51:59
第一个数字保持不变,
然后特征在顺序上没有空格,每个数字由字母->单个数字a、两个数字-> b等预测。
example: 1 2 3 15 17 -> a123b1517 1 3 101 -> a13c101,
然后以相同的方式对其进行估值:
示例:
1 2 3 4 53 4 6 343 11 57 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
https://stackoverflow.com/questions/51630008
复制相似问题