gpt4 book ai didi

haskell - 在 Haskell 中有效处理稀疏缺失的数据

转载 作者:行者123 更新时间:2023-12-04 02:19:36 24 4
gpt4 key购买 nike

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

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

  • 未打包 Maybe 的盒装向量值(value)观。类似的东西(如果有错误请更正):data myMaybe a = Nothing | Just {-# UNPACK #-} !a
  • (不可装箱)元组的未装箱向量,带有指示缺失的 bool 元素:newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))这可能与 this question 的 OP 选择的方法相同。 (模 IntBool ),但唯一的答案似乎并没有明确解决缺失值/稀疏性的问题(而是专注于如何表示整个数组未装箱,而不是作为未装箱向量的装箱向量)。
  • 一组未装箱的向量,一个带有值,另一个带有要注入(inject)缺失值的索引,或非缺失值的运行长度,或一些等效信息。这可能比选项 2 更可取。如果缺失很少?

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

    欢迎对这些选项的相对优点/可行性/现成的可用性/可能的性能提出任何评论,或者确实是指向完全不同的替代方案的指针!

    编辑:
  • 有人指出,答案可能取决于我打算对数据执行什么样的操作。目前,将每个观测值存储在单个向量中似乎比每个变量更方便。由于向量中的条目因此将引用不同的变量,因此不太可能出现类似“折叠”的操作。
  • 我猜 2. 会在内部存储“有效位”向量 à la 3. 如果合适的话会自动存储,所以 3. 可以被删除吗?
  • 最佳答案

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

    关于haskell - 在 Haskell 中有效处理稀疏缺失的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110628/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com