このソリューションは、質問へのコメントで@Innuoによって行われた提案を実装します。
これまでに表示されたすべてのデータから、サイズが100または1000の均一にサンプリングされたランダムなサブセットを維持できます。このセットと関連する「フェンス」は時間で更新できます。O(1)
このサブセットを維持する方法がわかったら、そのようなサンプルから母集団の平均を推定する方法を選択できます。これは動作します一切の仮定をしない普遍的な方法で、ある任意の標準的な統計サンプリングの式を用いて予測することができ、精度の範囲内に入力ストリーム。(精度は、サンプルサイズの平方根に反比例します。)
このアルゴリズムは、データストリームサンプルサイズを入力として受け入れ、それぞれが母集団を表すサンプルストリームを出力します。。具体的には、場合、はからのサイズ単純なランダムサンプルです(置換なし)。x(t), M S (T )X (T )= (X (1 )、X (2 )、... 、X (T ))1 ≤ I ≤ T S (I )m X (t )t=1,2,…,ms(t)X(t)=(x(1),x(2),…,x(t))1≤i≤ts(i)mX(t)
これを実現するために、そのすべてで十分 -elementサブセットののインデックスであることの等しいチャンス有するで。これは、がに含まれる可能性が、提供される等しいことを意味します。{ 1 、2 、... 、T } のx S (T )X (I )、1 ≤ I < T 、S (T )M / T T ≥ Mメートル{ 1 、2 、... 、T }バツs (t )x (i )、 1 ≤ I < トン、s (t )m / tT ≥ メートル
最初は、要素が格納されるまでストリームを収集します。その時点で可能なサンプルは1つだけなので、確率条件はごくわずかに満たされます。メートル
アルゴリズムはときに引き継ぎます。誘導仮定する単純なランダムサンプルであるのための。暫定的にます。LET一様確率変数(構築するために使用される任意の前の変数の独立して)。 もし、その後のランダムに選択された要素置き換えるによって。 これが手順全体です。S (T )X (T )T > M S (T + 1 )= S (T )、U (T + 1 )S (T )、U (T + 1 )≤ M /(T + 1 )s x (t + 1 )t = m + 1s (t )バツ(t )t > ms (t + 1 )= s (t )U(t + 1 )s (t )U(T + 1 )≤ M /(T + 1 )sx (t + 1 )
明らかに、確率有するにあるの。さらに、帰納法の仮説により、はときにに含まれる確率を持ちました。確率 =場合、から削除され、残りの確率は等しいM /(T + 1 )、S (T + 1 )、X (I )のM / T S (T )I ≤ T M /(T + 1 )× 1 / M 1 /(T + 1 )s (t + 1 )x (t + 1 )m /(t + 1 )s (t + 1 )x (私)m / ts (t )I ≤ トンm /(t + 1 )× 1 / m1 /(t + 1 )s (t + 1 )
メートルt( 1 − 1t + 1) = mt + 1、
必要に応じて。帰納法により、内のすべての包含確率は正しく、これらの包含間に特別な相関関係がないことは明らかです。これは、アルゴリズムが正しいことを証明しています。s (t )x (私)s (t )
アルゴリズムの効率はこれは、各ステージで最大2つの乱数が計算され、最大で値の配列の1つの要素が置き換えられるためです。ストレージ要件はです。m O (m )O (1 )メートルO (m )
このアルゴリズムのデータ構造は、サンプルと、それがサンプリングする母集団のインデックスで構成されます。最初に、を取り、のアルゴリズムを続行し これは、を生成するために値でを更新する実装です。(引数がの役割を果たすとなる。、インデックス、発信者によって維持されるであろう。)T X (T )S = X (M )T = M + 1 、M + 2 、... 。(s 、t )x (s 、t + 1 )t m tstバツ(t )s = X(m )T = M + 1 、M + 2 、... 。R
(s 、t )バツ(s 、t + 1 )n
tsample.size
メートルt
update <- function(s, x, n, sample.size) {
if (length(s) < sample.size) {
s <- c(s, x)
} else if (runif(1) <= sample.size / n) {
i <- sample.int(length(s), 1)
s[i] <- x
}
return (s)
}
これを説明およびテストするために、通常の(ロバストでない)平均の推定量を使用し、から推定された平均を実際の平均と比較します各ステップで見られるデータの累積セット)。私はかなりスムーズに変化するが、定期的に劇的なジャンプを経験するやや難しい入力ストリームを選択しました。のサンプルサイズはかなり小さいため、これらのプロットでサンプリングの変動を確認できます。X (t )m = 50s (t )バツ(t )m = 50
n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
s <<- update(s, x[i], i, n.sample)
summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))
この時点online
で、値のこの実行中のサンプルを維持することによって生成された一連の平均推定値が、各瞬間に利用可能なすべてのデータから生成された一連の平均推定値です。プロットは、データ(灰色)、(黒)、およびこのサンプリング手順の2つの独立したアプリケーション(色)を示しています。合意は予想されるサンプリングエラーの範囲内です。50actual
actual
plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")
平均のロバストな推定量については、外れ値および関連する用語を当社のサイトで検索してください。検討する価値のある可能性には、Winsorizedの平均とM-推定量があります。