バックグラウンド
順序付けられたデータポイントのセットがとして保存されていTreeSet<DataPoint>ます。各データポイントには、apositionとaSetのEventオブジェクト(HashSet<Event>)があります。
4つの可能なEventオブジェクト、、、、AおよびがありBます。サイズが1であるセットの最初と最後のオブジェクトを除いて、すべてにこれらの2つがあります(例:と)。CDDataPointACDataPointT
私のアルゴリズムは、このセットDataPoint Qにある位置xに新しいものがある確率を見つけることです。Event q
これを行うには、このデータセットの値Sを計算してから、セットに追加Qして再度計算Sします。次に、2番目を1番目で割ってS、新しいの確率を分離しDataPoint Qます。
アルゴリズム
計算式Sは次のとおりです。
http://mathbin.net/equations/105225_0.png
どこ
http://mathbin.net/equations/105225_1.png
http://mathbin.net/equations/105225_2.png
http://mathbin.net/equations/105225_3.pngの場合
と
http://mathbin.net/equations/105225_4.png
http://mathbin.net/equations/105225_5.pngは、引数のみに依存し、他には何も依存しない高価な確率関数です(およびhttp://mathbin.net/equations/105225_6.png)、http://mathbin 。 net /equations / 105225_7.pngDataPointはセットの最後(右側のノード)、 http://mathbin.net/equations/105225_8.pngは最初DataPoint(左側のノード)、http://mathbin.net/equations/105225_9 .pngDataPointはノードではない右端、 http://mathbin.net/equations/105225_10.pngはDataPoint、http://mathbin.net/equations/105225_12.pngはSetこのイベントのイベントですDataPoint。
したがって、Qwithの確率Event qは次のとおりです。
http://mathbin.net/equations/105225_11.png
実装
私はこのアルゴリズムを次のようにJavaで実装しました。
public class ProbabilityCalculator {
private Double p(DataPoint right, Event rightEvent, DataPoint left, Event leftEvent) {
// do some stuff
}
private Double f(DataPoint right, Event rightEvent, NavigableSet<DataPoint> points) {
DataPoint left = points.lower(right);
Double result = 0.0;
if(left.isLefthandNode()) {
result = 0.25 * p(right, rightEvent, left, null);
} else if(left.isQ()) {
result = p(right, rightEvent, left, left.getQEvent()) * f(left, left.getQEvent(), points);
} else { // if M_k
for(Event leftEvent : left.getEvents())
result += p(right, rightEvent, left, leftEvent) * f(left, leftEvent, points);
}
return result;
}
public Double S(NavigableSet<DataPoint> points) {
return f(points.last(), points.last().getRightNodeEvent(), points)
}
}
したがって、での確率を見つけるQにxはq:
Double S1 = S(points);
points.add(Q);
Double S2 = S(points);
Double probability = S2/S1;
問題
現時点での実装は、数学アルゴリズムに厳密に従っています。ただし、これは実際には特に良いアイデアではないことがわかります。これfは、それぞれに対して2回呼び出されるためDataPointです。したがって、http://mathbin.net/equations/105225_9.pngの場合、fは2回呼び出され、その後n-1 f、前の呼び出しごとに2回呼び出され、以下同様に続きます。これは、それぞれに1000を超える可能性があることを考えると、その複雑さO(2^n)はかなりひどいものになります。パラメータ以外のすべてから独立しているため、キャッシュ関数を含めました。DataPointsSetp()p()これらのパラメータについてはすでに計算されており、前の結果を返すだけですが、これは固有の複雑さの問題を解決しません。繰り返しの計算に関してここで何かが欠けていますか、それともこのアルゴリズムの複雑さは避けられませんか?