当前位置:  开发笔记 > 小程序 > 正文

在Haskell中有效处理稀疏丢失的数据

如何解决《在Haskell中有效处理稀疏丢失的数据》经验,为你挑选了1个好方法。

我正在尝试使用Haskell进行数据分析.因为我的数据集相当大(数十万甚至数百万的观测值),所以我最好使用未装箱的数据结构来提高效率,比如Data.Vector.Unboxed.

问题是数据包含一些缺失值.我想避免将它们编码为"99"或类似,因为这只是一个丑陋的黑客和潜在的错误来源.从我的Haskell新手的角度来看,我可以想到以下选项:

    解压缩Maybe值的盒装矢量.有点像(请纠正错误):
    data myMaybe a = Nothing | Just {-# UNPACK #-} !a

    一个未装箱的(无法使用的)元组向量,其中一个布尔元素表示缺失:
    newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
    这可能与此问题的OP选择的方法相同(模数IntBool),但唯一的答案似乎没有明确解决丢失的问题值/稀疏性(而是关注如何表示整个数组未装箱,而不是作为未装箱矢量的盒装矢量).

    未装箱的向量元组,一个具有值,另一个具有要注入缺失值的索引,或者非缺失值的运行长度,或某些等效信息.如果缺失很少,这可能比选项2更可取.

我试图保持在矢量表示而不是像这样的东西,因为它是稀疏的缺失值,而不是数据.

任何关于这些选项的相对优点/可行性/现成可用性/可能性能的评论,或者确实指向完全不同的替代品,都是受欢迎的!

编辑:

有人指出,答案可能取决于我打算对数据执行什么样的操作.目前,将每个观察值存储在单个向量中而不是每个变量似乎更方便.由于向量中的条目因此将引用不同的变量,因此不太可能出现"折叠"类操作.

我猜测2.如果合适,将在内部自动存储"有效位"矢量àla3.所以3.可以删除?

leftaroundab.. 6

我会选择选项3,但是你不应该使用向量来存储缺少的indizes:这会给你O(nMissing)查找时间,除非丢失的数据非常稀疏,否则它会非常慢.Data.IntMap应该做好这项工作,然后您可以轻松地使用该member功能来检查索引是否指向缺少的观察.哈希表甚至更好,但可能没有必要.



1> leftaroundab..:

我会选择选项3,但是你不应该使用向量来存储缺少的indizes:这会给你O(nMissing)查找时间,除非丢失的数据非常稀疏,否则它会非常慢.Data.IntMap应该做好这项工作,然后您可以轻松地使用该member功能来检查索引是否指向缺少的观察.哈希表甚至更好,但可能没有必要.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有