我想在ELKI中使用OPTICS算法聚类100,000点。对于这个点集,我有一个大约50亿个条目的上三角距离矩阵。在ELKI想要矩阵的格式中,内存大约需要100GB。我想知道ELKI处理那种数据加载吗?任何人都可以确认你以前做过这项工作吗?
答案 0 :(得分:4)
我经常使用100k积分的ELKI,高达1000万。
但是,为了加快速度,应该使用索引。
出于显而易见的原因,任何基于密集矩阵的方法最多会扩展O(n^2)
,并需要O(n^2)
内存。这就是为什么我不能用R或Weka或scipy处理这些数据集的原因。他们通常首先尝试计算全距离矩阵,或者中途失败,或者中途耗尽内存,或者以负分配大小失败(Weka,当你的数据集溢出2 ^ 31正整数时,即大约46k对象)。
在二进制格式中,使用float精度,ELKI矩阵格式应该在100000*999999/2*4 + 4
字节左右,也可以为大小信息添加另外4个字节。这 20 GB 。
如果你使用“易于使用”的ascii格式,那么它确实会更多。但是如果你使用gzip压缩它可能最终大小相同。将gzip压缩到原始大小的10-20%是很常见的。根据我的经验, gzip压缩的ascii可以像二进制编码的双精度一样小。
二进制格式的主要好处是它实际上驻留在磁盘上,内存缓存将由您的操作系统处理。
无论哪种方式,我建议首先不要计算距离矩阵。
因为如果你决定从100k增加到100万,原始矩阵将增长到2TB,当你达到1000万时,它将是200TB。如果你想要双精度,那就加倍。
如果您使用的是距离矩阵,那么您的方法 最多只能O(n^2)
,因此无法进行缩放。首先避免计算所有成对距离是一个重要的速度因素。
我将索引用于所有内容。对于kNN或半径限制方法(对于OPTICS,使用epsion参数使索引生效!选择低epsilon!)如果您将需要重复这些查询,可以预先计算一次这些查询。
在我经常使用的数据集上,75k实例和27维,存储预先计算的101最近邻居+双关系的文件是双倍精度,是81 MB(注意:这可以看作是稀疏相似性矩阵)。通过使用索引预先计算此缓存,计算只需几分钟;然后我可以运行大多数基于kNN的算法,例如在这个75k数据集上的 LOF,在108毫秒(+262毫秒用于加载kNN缓存+解析原始输入数据2364毫秒,总运行时间为3秒;通过解析双值来支配。)