11

データ分析に Haskell を使用しようとしています。私のデータセットはかなり大きい (数十万、場合によっては数百万の観測) ため、理想的には、効率のためにボックス化されていないデータ構造 (Data.Vector.Unboxed など) を使用したいと考えています。

問題は、データに欠損値が含まれていることです。これらを「99」などのようにコーディングすることは避けたいと思います。これは単なる醜いハックであり、バグの潜在的な原因になるからです。私のHaskell初心者の観点から、次のオプションを考えることができます:

  1. アンパックされMaybeた値のボックス化されたベクトル。次のようなもの(間違っている場合は修正してください):
    data myMaybe a = Nothing | Just {-# UNPACK #-} !a

  2. newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
    ボックス化されていない(ボックス化されていない) タプルのベクトル。ブール要素は欠落を示します。値/スパース性 (代わりに、ボックス化されていないベクトルのボックス化されたベクトルとしてではなく、ボックス化されていない配列全体を表現する方法に焦点を当てています)。IntBool
  3. ボックス化されていないベクトルのタプル。1 つは値、もう 1 つは欠損値が挿入されるインデックス、非欠損値のランレングス、または同等の情報です。これはオプション 2 よりも望ましい場合があります。

thisのようなものではなく、ベクトル表現内に留まろうとしています。これは、 dataではなく、スパースな欠損値であるためです。

これらのオプションの相対的なメリット/実現可能性/既製の可用性/可能性のあるパフォーマンスに関するコメント、または実際にはまったく異なる代替案へのポインタは大歓迎です!

編集:

  • 答えは、データに対して実行する操作の種類に依存する可能性があることが指摘されています。現時点では、各変数ではなく、各観測値を 1 つのベクトルに格納する方が便利なようです。したがって、ベクトル内のエントリは異なる変数を参照するため、「折り畳み」のような操作はほとんどありません。
  • 2. 「有効なビット」ベクトルを 3. 適切な場合に自動的に内部に保存するので、3. を削除できると思いますか?
4

1 に答える 1

6

オプション 3 を使用しますが、欠落しているインデックスを格納するためにベクトルを使用しないでください。これにより、欠落しているデータが非常にまばらO(nMissing)でない限り、ルックアップ時間が不当に遅くなります。ジョブをうまく実行する必要がある場合は、関数を使用して、インデックスが欠落している観測を指しているかどうかを簡単に確認できます。ハッシュ テーブルはさらに優れていますが、おそらく必要ありません。Data.IntMapmember

于 2011-11-13T12:43:23.780 に答える