22

連続確率分布関数のコレクションに関連する問題があります。そのほとんどは経験的に決定されます(出発時間、通過時間など)。私が必要としているのは、これらのPDFのうちの2つを取得し、それらを計算する方法です。たとえば、PDFXから取得した2つの値xとPDFYから取得したyがある場合、(x + y)またはその他の操作f(x、y)のPDFを取得する必要があります。

分析的な解決策は不可能なので、私が探しているのは、そのようなことを可能にするPDFの表現です。明らかな(しかし計算コストの高い)解決策はモンテカルロです。xとyの値をたくさん生成し、f(x、y)を測定するだけです。しかし、それにはCPU時間がかかりすぎます。

私は、PDFを範囲のリストとして表すことを考えました。各範囲はほぼ等しい確率であり、PDFを一様分布のリストの結合として効果的に表すことができます。しかし、それらを組み合わせる方法がわかりません。

誰かがこの問題に対する良い解決策を持っていますか?

編集:目標は、PDFを操作するためのミニ言語(別名ドメイン固有言語)を作成することです。しかし、最初に、基礎となる表現とアルゴリズムを整理する必要があります。

編集2: dmckeeはヒストグラムの実装を提案します。それが、一様分布のリストで得ていたものです。しかし、それらを組み合わせて新しいディストリビューションを作成する方法がわかりません。最終的には、これが非常に小さい場合に備えて、P(x <y)のようなものを見つける必要があります。

編集3:ヒストグラムがたくさんあります。発生データから生成しているため、均等に分散されていないため、基本的に100個のサンプルがあり、ヒストグラムに10個のポイントが必要な場合は、各バーに10個のサンプルを割り当て、バーを可変幅で一定の面積にします。

PDFを追加するには、それらを畳み込むことがわかったので、そのための計算に骨を折った。2つの一様分布を畳み込むと、3つのセクションを持つ新しい分布が得られます。広い一様分布はまだ存在しますが、狭い方の幅の両側に三角形が貼り付けられています。したがって、XとYの各要素を畳み込むと、これらがすべて重なり合うようになります。今、私はそれらすべてを合計する方法を理解し、それからそれに最適な近似であるヒストグラムを取得しようとしています。

結局、モンテカルロはそんなに悪い考えではなかったのだろうかと思い始めています。

編集4: このペーパーでは、一様分布の畳み込みについて詳細に説明します。一般に、「台形」の分布が得られます。ヒストグラムの各「列」は一様分布であるため、これらの列を畳み込み、結果を合計することで問題が解決されることを期待していました。

ただし、結果は入力よりもかなり複雑で、三角形も含まれます。 編集5: [間違ったものを削除しました]。しかし、これらの台形が同じ面積の長方形に近似されている場合は、正しい答えが得られ、結果の長方形の数を減らすことも非常に簡単に見えます。これは私が見つけようとしてきた解決策かもしれません。

編集6:解決しました!この問題の最終的なHaskellコードは次のとおりです。

-- | Continuous distributions of scalars are represented as a
-- | histogram where each bar has approximately constant area but
-- | variable width and height.  A histogram with N bars is stored as
-- | a list of N+1 values.
data Continuous = C {
      cN :: Int,
      -- ^ Number of bars in the histogram.
      cAreas :: [Double],
      -- ^ Areas of the bars.  @length cAreas == cN@
      cBars :: [Double]
      -- ^ Boundaries of the bars.  @length cBars == cN + 1@
    } deriving (Show, Read)


{- | Add distributions.  If two random variables @vX@ and @vY@ are
taken from distributions @x@ and @y@ respectively then the
distribution of @(vX + vY)@ will be @(x .+. y).

This is implemented as the convolution of distributions x and y.
Each is a histogram, which is to say the sum of a collection of
uniform distributions (the "bars").  Therefore the convolution can be
computed as the sum of the convolutions of the cross product of the
components of x and y.

When you convolve two uniform distributions of unequal size you get a
trapezoidal distribution. Let p = p2-p1, q - q2-q1.  Then we get:


>   |                              |
>   |     ______                   |
>   |     |    |           with    |  _____________
>   |     |    |                   |  |           |
>   +-----+----+-------            +--+-----------+-
>         p1   p2                     q1          q2
> 
>  gives    h|....... _______________
>            |       /:             :\
>            |      / :             : \                1
>            |     /  :             :  \     where h = -
>            |    /   :             :   \              q
>            |   /    :             :    \
>            +--+-----+-------------+-----+-----
>             p1+q1  p2+q1       p1+q2   p2+q2

However we cannot keep the trapezoid in the final result because our
representation is restricted to uniform distributions.  So instead we
store a uniform approximation to the trapezoid with the same area:

>           h|......___________________
>            |     | /               \ |
>            |     |/                 \|
>            |     |                   |
>            |    /|                   |\
>            |   / |                   | \
>            +-----+-------------------+--------
>               p1+q1+p/2          p2+q2-p/2

-}
(.+.) :: Continuous -> Continuous -> Continuous
c .+. d = C {cN     = length bars - 1,
             cBars  = map fst bars, 
             cAreas = zipWith barArea bars (tail bars)}
    where
      -- The convolve function returns a list of two (x, deltaY) pairs.
      -- These can be sorted by x and then sequentially summed to get
      -- the new histogram.  The "b" parameter is the product of the
      -- height of the input bars, which was omitted from the diagrams
      -- above.
      convolve b c1 c2 d1 d2 =
          if (c2-c1) < (d2-d1) then convolve1 b c1 c2 d1 d2 else convolve1 b d1 
d2 c1 c2
      convolve1 b p1 p2 q1 q2 = 
          [(p1+q1+halfP, h), (p2+q2-halfP, (-h))]
               where 
                 halfP = (p2-p1)/2
                 h = b / (q2-q1)
      outline = map sumGroup $ groupBy ((==) `on` fst) $ sortBy (comparing fst) 
$ concat
                [convolve (areaC*areaD) c1 c2 d1 d2 |
                 (c1, c2, areaC) <- zip3 (cBars c) (tail $ cBars c) (cAreas c),
                 (d1, d2, areaD) <- zip3 (cBars d) (tail $ cBars d) (cAreas d)
                ]
      sumGroup pairs = (fst $ head pairs, sum $ map snd pairs)

      bars = tail $ scanl (\(_,y) (x2,dy) -> (x2, y+dy)) (0, 0) outline
      barArea (x1, h) (x2, _) = (x2 - x1) * h

他の演算子は、読者の練習問題として残されています。

4

10 に答える 10

16

ヒストグラムや記号計算は必要ありません。正しい視点をとれば、すべてを閉じた形で言語レベルで実行できます。

[「測定」と「配布」という用語は同じ意味で使用します。また、私のHaskellは錆びているので、この分野で不正確であることを許してください。]

確率分布は実際にはコデータです。

muを確率測度とします。メジャーで実行できる唯一のことは、テスト関数に対してそれを統合することです(これは「メジャー」の1つの可能な数学的な定義です)。これが最終的に行うことであることに注意してください。たとえば、IDに対する統合は、次のことを意味します。

mean :: Measure -> Double
mean mu = mu id

もう一つの例:

variance :: Measure -> Double
variance mu = (mu $ \x -> x ^ 2) - (mean mu) ^ 2

P(mu <x)を計算する別の例:

cdf :: Measure -> Double -> Double
cdf mu x = mu $ \z -> if z < x then 1 else 0

これは、二重性によるアプローチを示唆しています。

したがって、タイプMeasureはタイプを示すものとし(Double -> Double) -> Doubleます。これにより、MCシミュレーション、PDFに対する数値/記号求積法などの結果をモデル化できます。たとえば、関数

empirical :: [Double] -> Measure
empirical h:t f = (f h) + empirical t f

たとえばによって得られた経験的測度に対してfの積分を返します。MCサンプリング。また

from_pdf :: (Double -> Double) -> Measure
from_pdf rho f = my_favorite_quadrature_method rho f

(通常の)密度からメジャーを作成します。

さて、良いニュースです。muとnuが2つのメジャーである場合、畳み込み mu ** nuは次のように与えられます。

(mu ** nu) f = nu $ \y -> (mu $ \x -> f $ x + y)

したがって、2つのメジャーが与えられると、それらの畳み込みに対して統合できます。

また、法則の確率変数Xmuが与えられると、*Xの法則は次のように与えられます。

rescale :: Double -> Measure -> Measure
rescale a mu f = mu $ \x -> f(a * x)

また、phi(X)の分布は、フレームワークで画像メジャーphi_*Xによって与えられます。

apply :: (Double -> Double) -> Measure -> Measure
apply phi mu f = mu $ f . phi

これで、メジャーの埋め込み言語を簡単に作成できます。ここでは、特に実数直線以外のサンプルスペース、確率変数間の依存関係、条件付けに関して、やるべきことがたくさんありますが、要点を理解していただければ幸いです。

特に、プッシュフォワードは機能的です。

newtype Measure a = (a -> Double) -> Double
instance Functor Measure a where
    fmap f mu = apply f mu

これもモナドです(演習-ヒント:これは継続モナドに非常によく似ています。何returnですか?の類似物は何call/ccですか?)。

また、微分幾何学フレームワークと組み合わせると、これはおそらくベイズ事後分布を自動的に計算するものに変えることができます。

一日の終わりに、あなたは次のようなものを書くことができます

m = mean $ apply cos ((from_pdf gauss) ** (empirical data))

cos(X + Y)の平均を計算します。ここで、Xはpdfgaussであり、Yは結果がにあるMCメソッドによってサンプリングされていdataます。

于 2011-04-05T16:20:14.757 に答える
6

確率分布はモナドを形成します。たとえば、ClaireJonesの作品やLICS1989の論文を参照してください。ただし、アイデアは、Giryによる1982年の論文(DOI 10.1007 / BFb0092872)と、追跡できないLawvereによる1962年のメモ(http://permalink)にまでさかのぼります。 gmane.org/gmane.science.mathematics.categories/6541)。

しかし、私はコモナドを見ていません。「(a-> Double)->Double」から「a」を取得する方法はありません。おそらく、それを多形にする場合-(a-> r)-> rすべてのrに対して?(これが継続モナドです。)

于 2011-04-14T09:58:41.010 に答える
2

このためにミニ言語を採用することを妨げるものはありますか?

つまり、書いたとおりに書いf = x + yて評価できる言語を定義しますf。同様にg = x * z、、h = y(x)などの広告の吐き気。(私が提案しているセマンティクスでは、評価時にRHSに表示される最も内側のPDFごとに乱数を選択し、結果のPDFの堆肥化された形式を理解しようとしないように求めています。これは十分に高速ではない可能性があります。 。)


必要な精度の限界を理解していると仮定すると、ヒストグラムまたはスプラインを使用してPDFをかなり簡単に表すことができます(前者は後者の縮退したケースです)。分析的に定義されたPDFと実験的に決定されたPDFを混合する必要がある場合は、タイプメカニズムを追加する必要があります。


ヒストグラムは単なる配列であり、その内容は入力範囲の特定の領域での発生率を表します。言語の好みがあるかどうかは言わないので、cのようなものを想定します。上限と下限、および場合によっては正規化を含む、ビンの構造(ユニオームサイズは簡単ですが、常に最適であるとは限りません)を知る必要があります。

struct histogram_struct {
  int bins; /* Assumed to be uniform */
  double low;
  double high;
  /* double normalization; */    
  /* double *errors; */ /* if using, intialize with enough space, 
                         * and store _squared_ errors
                         */
  double contents[];
};

この種のことは科学分析ソフトウェアでは非常に一般的であり、既存の実装を使用することをお勧めします。

于 2008-12-28T08:52:01.753 に答える
2

私は論文のために同様の問題に取り組みました。

近似畳み込みを計算する 1 つの方法は、密度関数 (この場合はヒストグラム) のフーリエ変換を行い、それらを乗算し、逆フーリエ変換を行って畳み込みを取得することです。

確率分布の操作のさまざまな特殊なケースの式については、論文の付録 C を参照してください。論文はhttp://riso.sourceforge.netにあります。

これらの操作を実行する Java コードを作成しました。コードはhttps://sourceforge.net/projects/risoにあります。

于 2012-08-23T05:48:36.013 に答える
1

自律移動ロボットは、ローカリゼーションとナビゲーション、特にマルコフローカリゼーションカルマンフィルター(センサーフュージョン)で同様の問題を扱います。たとえば、ローカリゼーション手法の実験的比較を参照してください 。

移動ロボットから借りることができるもう1つのアプローチは、潜在的なフィールドを使用した経路計画です。

于 2008-12-28T08:57:03.787 に答える
1

いくつかの最初の考え:

まず、Mathematica には正確な分布でこれを行う優れた機能があります。

第 2 に、ビン サイズを選択する必要があるため、ヒストグラム (つまり、経験的 PDF) としての表現には問題があります。これは、代わりに累積分布、つまり経験的 CDF を保存することで回避できます。(実際には、経験的分布が基づいているサンプルの完全なデータ セットを再作成する機能を保持します。)

サンプルのリストを取得し、経験的CDF、つまり値と確率のペアのリストを返す、醜い Mathematica コードを次に示します。この出力を ListPlot で実行して、経験的 CDF のプロットを表示します。

empiricalCDF[t_] := Flatten[{{#[[2,1]],#[[1,2]]},#[[2]]}&/@Partition[Prepend[Transpose[{#[[1]], Rest[FoldList[Plus,0,#[[2]]]]/Length[t]}&[Transpose[{First[#],Length[#]}&/@ Split[Sort[t]]]]],{Null,0}],2,1],1]

最後に、離散確率分布の組み合わせに関する情報を次に示します。

http://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/Chapter7.pdf

于 2008-12-29T05:57:57.237 に答える
1

ヒストグラムまたは 1/N 領域領域のリストは良い考えだと思います。議論のために、すべての分布に対して固定の N があると仮定します。

編集 4 をリンクした論文を使用して、新しいディストリビューションを生成します。次に、新しい N 要素分布で近似します。

N を固定したくない場合は、さらに簡単です。新しく生成された分布の各凸多角形 (台形または三角形) を取り、それを一様分布で近似します。

于 2008-12-30T14:57:39.550 に答える
1

別の提案は、カーネル密度を使用することです。特にガウス カーネルを使用している場合は、比較的簡単に操作できます...ただし、ディストリビューションのサイズは気にせずにすぐに爆発します。アプリケーションによっては、使用できる重要度サンプリングなどの追加の近似手法があります。

于 2008-12-30T15:02:41.083 に答える
1

いくつかの応答:

1) 経験的に PDF を決定した場合、ヒストグラムがあるか、パラメトリック PDF の近似値があります。PDFは連続関数であり、無限のデータはありません...

2) 変数が独立していると仮定しましょう。次に、PDFを離散化すると、 P(f(x,y)) = f(x,y)p(x,y) = f(x,y)p(x)p(y) がすべての組み合わせで合計されますf(x,y) がターゲットを満たすような x と y の

経験的な PDF を標準の PDF (正規分布など) に当てはめる場合は、既に決定されている関数を使用して合計などを計算できます。

変数が独立していない場合は、さらに問題が発生するため、コピュラを使用する必要があると思います。

独自のミニ言語などを定義するのはやり過ぎだと思います。配列でこれを行うことができます...

于 2008-12-28T20:06:53.187 に答える
0

楽しみたい場合は、Maple や Mathemetica のように記号で表現してみてください。Maple は有向非巡回グラフを使用しますが、Matematica は list/lisp のようなアプローチを使用します (私は信じていますが、私がこれについて考えたときから長い時間がかかりました)。

すべての操作を記号的に行い、最後に数値をプッシュします。(または、シェルで起動して計算を行う方法を見つけるだけです)。

ポール。

于 2008-12-28T18:23:23.083 に答える