バックグラウンド
順序付けられたデータポイントのセットがとして保存されていTreeSet<DataPoint>
ます。各データポイントには、aposition
とaSet
のEvent
オブジェクト(HashSet<Event>
)があります。
4つの可能なEvent
オブジェクト、、、、A
およびがありB
ます。サイズが1であるセットの最初と最後のオブジェクトを除いて、すべてにこれらの2つがあります(例:と)。C
D
DataPoint
A
C
DataPoint
T
私のアルゴリズムは、このセット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
。
したがって、Q
withの確率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)
はかなりひどいものになります。パラメータ以外のすべてから独立しているため、キャッシュ関数を含めました。DataPoints
Set
p()
p()
これらのパラメータについてはすでに計算されており、前の結果を返すだけですが、これは固有の複雑さの問題を解決しません。繰り返しの計算に関してここで何かが欠けていますか、それともこのアルゴリズムの複雑さは避けられませんか?