私は最近、モンテカルロシミュレーションを見ていて、(長方形内の円、比例領域)などの定数を近似するために使用しています。
ただし、モンテカルロ積分を使用して [オイラー数]の値を近似する対応する方法を考えることはできません。
これをどのように行うことができるかについての指針はありますか?
私は最近、モンテカルロシミュレーションを見ていて、(長方形内の円、比例領域)などの定数を近似するために使用しています。
ただし、モンテカルロ積分を使用して [オイラー数]の値を近似する対応する方法を考えることはできません。
これをどのように行うことができるかについての指針はありますか?
回答:
この論文ではモンテカルロによるを推定するシンプルでエレガントな方法について説明します。この論文は、実際にeを教えることに関するものです。したがって、このアプローチはあなたの目標に完全に適合しているようです。このアイデアは、Gnedenkoによる確率論に関するロシアの人気教科書の演習に基づいています。p.183のex.22を参照
ように発生します。ここで、ξは次のように定義されたランダム変数です。これは、最小の数だNようΣ N iは= 1、R I > 1及びrは、私は上の一様分布からランダムな番号である[ 0 、1 ]。美しいですね。
それは演習なので、ここに解決策(証明)を投稿するのがいいかどうかわかりません:)自分でそれを証明したい場合は、ここにヒントがあります:この章は「モーメント」と呼ばれ、あなたは正しい方向に。
自分で実装する場合は、これ以上読み進めないでください!
これは、モンテカルロシミュレーション用のシンプルなアルゴリズムです。合計が1を超えるまで、一様な乱数を描画し、次に別の乱数を描画します。描画される乱数の数が最初の試行です。あなたが得たとしましょう:
0.0180
0.4596
0.7920
その後、最初のトライアルがレンダリングされます。3。これらのトライアルを続けると、平均してが得られることに気付くでしょう。
MATLABコード、シミュレーション結果、およびヒストグラムが続きます。
N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
s = s + rand;
i = i + 1;
if s > 1
if i > maxl
f(i) = 1;
maxl = i;
else
f(i) = f(i) + 1;
end
i = 0;
s = 0;
n = n - 1;
end
end
disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on
f/sum(f)
結果とヒストグラム:
2.7183
ans =
Columns 1 through 8
0 0.5000 0.3332 0.1250 0.0334 0.0070 0.0012 0.0002
Columns 9 through 11
0.0000 0.0000 0.0000
更新:コードを更新して、RAMを使用しないように試行結果の配列を削除しました。PMF推定値も印刷しました。
更新2:これが私のExcelソリューションです。Excelにボタンを配置し、次のVBAマクロにリンクします。
Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
s = s + Rnd()
i = i + 1
If s > 1 Then
If i > maxl Then
Cells(i, 1).Value = i
Cells(i, 2).Value = 1
maxl = i
Else
Cells(i, 1).Value = i
Cells(i, 2).Value = Cells(i, 2).Value + 1
End If
i = 0
s = 0
n = n - 1
End If
Wend
s = 0
For i = 2 To maxl
s = s + Cells(i, 1) * Cells(i, 2)
Next
Cells(2, 4).Value = s / Cells(1, 4).Value
Rem bar (f / Sum(f))
Rem grid on
Rem f/sum(f)
End Sub
セルD1に1000などの試行回数を入力し、ボタンをクリックします。最初の実行後の画面は次のようになります。
更新3:Silverfishは私を別の方法に刺激しました。最初の方法ほどエレガントではありませんが、まだクールです。Sobolシーケンスを使用してnシンプレックスのボリュームを計算しました。
s = 2;
for i=2:10
p=sobolset(i);
N = 10000;
X=net(p,N)';
s = s + (sum(sum(X)<1)/N);
end
disp(s)
2.712800000000001
偶然にも彼は私が高校で読んだモンテカルロ法に関する最初の本を書いた。私の意見では、この方法を紹介するのに最適です。
更新4:
コメントのSilverfishは、単純なExcel式の実装を提案しました。これは、合計100万個の乱数と185K回の試行の後、彼のアプローチで得られる一種の結果です。
明らかに、これはExcel VBA実装よりもはるかに遅いです。特に、ループ内のセル値を更新しないようにVBAコードを変更し、すべての統計が収集された後にのみそれを行う場合。
更新5
Xi'anのソリューション#3は密接に関連しています(または、スレッド内のjwgのコメントごとに何らかの意味で同じです)。ForsytheやGnedenkoの最初のアイデアを思いついたのは誰なのかわかりません。ロシア語のGnedenkoの元の1950版には、章に問題のセクションはありません。そのため、後のエディションでは、この問題を一見して見つけることができませんでした。多分それは後で追加されたか、テキストに埋もれたでしょう。
西安の答えでコメントしたように、フォーサイスのアプローチは別の興味深い分野にリンクされています:ランダム(IID)シーケンスでのピーク間の距離の分布(極値)です。たまたま平均距離は3です。Forsytheのアプローチのダウンシーケンスはボトムで終わるため、サンプリングを続行すると、あるポイントで別のボトムが得られ、次に別のボトムが得られます。
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
R
西安の回答に投稿したソリューションの次の直接翻訳は、20倍高速です。n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
Aksakalの答えを支持することをお勧めします。偏りがなく、単位ユニフォーム偏差を生成する方法のみに依存します。
私の答えは任意に正確にすることができますが、それでも真の値から偏っています。
西安の答えは正しいですが、関数またはポアソンランダム偏差の生成方法への依存は、目的がeを近似することである場合、少し循環的であると思います。
代わりに、ブートストラップ手順を検討してください。多数のオブジェクトあり、サンプルサイズnに置き換えて描画されます。各ドローで、特定のオブジェクトiをドローしない確率は1 − n − 1であり、そのようなドローはn個あります。特定のオブジェクトがすべてのドローから除外される確率は、p = (1 − 1
私たちはそれを知っていると仮定していますので、
ので、我々はまた書くことができる
つまり、推定値は、m個のブートストラップ複製B jから特定の観測が省略される確率を推定することによって求められます。多くのそのような反復全体を-つまり、オブジェクトの出現割合ブートストラップインチ
この近似には2つのエラーの原因があります。有限は常に結果が近似値であること、つまり推定値に偏りがあることを意味します。また、、これはシミュレーションであるため、真値の周りに変動します。
行うには十分にほとんどないとの学部や他の人が近づく可能性があるため、このアプローチはやや魅力的な私を見つける人が推定できたのと同じ静脈では、カードのデッキ、手の小さな石、またはその他の項目の杭を使用して使用コンパス、まっすぐなエッジ、砂粒。数学をコンピューターのような現代の便利さから離すことができるのはいいことだと思います。
さまざまな数のブートストラップレプリケーションに対していくつかのシミュレーションを実施しました。標準誤差は通常の間隔を使用して推定されます。
ブートストラップされるオブジェクトの数選択すると、モンテカルロ法ではpが推定され、pはnのみに依存するため、結果の精度の絶対的な上限が設定されることに注意してください。nを不必要に大きく設定すると、eの「大まかな」近似が必要なだけか、モンテカルロによる分散によってバイアスが圧倒されるため、コンピューターが邪魔になります。これらの結果は、ためのもので、N = 10 3とP - 1 ≈第三の小数に正確です。
選択というこれは、プロットを示し中での安定性のための直接的かつ深遠な影響をもたらすのp。青い破線はpを示し、赤い線はeを示します。予想通り、サンプルサイズを大きくすると、これまで以上に正確な推定値を生成したpを。
このために、非常に長いRスクリプトを作成しました。改善のための提案は、20ドルの請求書の裏に提出できます。
library(boot)
library(plotrix)
n <- 1e3
## if p_hat is estimated with 0 variance (in the limit of infinite bootstraps), then the best estimate we can come up with is biased by exactly this much:
approx <- 1/((1-1/n)^n)
dat <- c("A", rep("B", n-1))
indicator <- function(x, ndx) xor("A"%in%x[ndx], TRUE) ## Because we want to count when "A" is *not* in the bootstrap sample
p_hat <- function(dat, m=1e3){
foo <- boot(data=dat, statistic=indicator, R=m)
1/mean(foo$t)
}
reps <- replicate(100, p_hat(dat))
boxplot(reps)
abline(h=exp(1),col="red")
p_mean <- NULL
p_var <- NULL
for(i in 1:10){
reps <- replicate(2^i, p_hat(dat))
p_mean[i] <- mean(reps)
p_var[i] <- sd(reps)
}
plotCI(2^(1:10), p_mean, uiw=qnorm(0.975)*p_var/sqrt(2^(1:10)),xlab="m", log="x", ylab=expression(hat(p)), main=expression(paste("Monte Carlo Estimates of ", tilde(e))))
abline(h=approx, col='red')
解決策1:
解決策2:
解決策3:
Forsytheのメソッドの迅速なR実装は、より大きなブロックを優先してユニフォームのシーケンスを正確にたどることを控えることであり、これにより並列処理が可能になります。
use=runif(n)
band=max(diff((1:(n-1))[diff(use)>0]))+1
bends=apply(apply((apply(matrix(use[1:((n%/%band)*band)],nrow=band),
2,diff)<0),2,cumprod),2,sum)
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
It uses only elementary arithmetic.
解決策ではありません...コメントボックスには長すぎる簡単なコメントです。
アクサカル
Aksakalは、それらの和が1に超えてしまうような、我々は注意する必要があり、標準的な制服図面の予想数を計算するソリューションを投稿Mathematicaを私の最初の処方でした、:
mrM := NestWhileList[(Random[] + #) &, Random[], #<1 &]
Mean[Table[Length[mrM], {10^6}]]
編集:これで簡単にプレイしただけで、次のコード(同じ方法-Mmaでも-ちょうど異なるコード)は約10倍高速です:
Mean[Table[Module[{u=Random[], t=1}, While[u<1, u=Random[]+u; t++]; t] , {10^6}]]
西安/フーバー
Whuberは、Xianのソリューション1をシミュレートするための高速でクールなコードを提案しています。
Rバージョン: n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
MMAバージョン: n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
彼は、最初のコードの20倍(または上の新しいコードの約2倍)速いことに気付きました。
楽しみのために、両方のアプローチが(統計的な意味で)同じくらい効率的かどうかを確認するのは面白いと思いました。そのために、以下を使用してeの2000の推定値を生成しました。
... both in Mathematica. The following diagram contrasts a nonparametric kernel density estimate of the resulting dataA and dataB data sets.
So, while whuber's code (red curve) is about twice as fast, the method does not appear to be as 'reliable'.
running four times as many iterations will make them equally accurate
///// .....これを簡単に試してみました:Xianの方法1で使用されるサンプルポイントの数を 6 x (つまり、ポイント数の6倍)は、Aksaksalと同様の曲線を生成します。
途方もない量のサンプルを必要とする方法
まず、正規分布からサンプリングできる必要があります。関数の使用を除外すると仮定します、またはその関数から派生したテーブルを検索すると、CLTを介して正規分布から近似サンプルを生成できます。たとえば、均一(0,1)分布からサンプリングできる場合、。whuberが指摘したように、最終的な見積もりアプローチを サンプルサイズが近づくにつれて 、使用される均一なサンプルの数がアプローチであることが必要です。 サンプルサイズが無限に近づくにつれて。
十分な大きさのサンプルを使用して正規分布からサンプリングできる場合、密度の一貫した推定値を取得できます 。これは、ヒストグラムまたはカーネルスムーザーを使用して実行できます(ただし、ガウスカーネルを使用して、ルール!)。密度の推定値を一致させるには、df(ヒストグラムのビンの数、より滑らかにするためのウィンドウの逆数)を無限大に近付ける必要がありますが、サンプルサイズよりも遅くなります。
したがって、多くの計算能力を使用して、の密度を近似することができます 、つまり 。以来、あなたの見積もり 。
あなたが完全にナッツに行きたいなら、あなたは推定することさえできます そして using the methods you discussed earlier.
Method requiring very few samples, but causing an ungodly amount of numerical error
A completely silly, but very efficient, answer based on a comment I made:
Let . Define . Define .
This will converge very fast, but also run into extreme numerical error.
whuber pointed out that this uses the power function, which typically calls the exp function. This could be sidestepped by discretizing , such that is an integer and the power could be replaced with repeated multiplication. It would be required that as , the discretizing of would get finer and finer,and the discretization would have to exclude . With this, the estimator theoretically (i.e. the world in which numeric error does not exist) would converge to , and quite fast!
かなり遅いですが、ここに別の方法があります。私は効率性を主張しませんが、完全性の精神でこの代替案を提供します。
Contra Xi'anの答え、この質問の目的のために、次のシーケンスを生成して使用できると仮定します。 一様な擬似ランダム変数 そして、あなたは推定する必要があります 基本的な算術演算を使用するいくつかの方法(つまり、対数関数または指数関数、またはこれらの関数を使用する分布は使用できません)。 現在の方法は、一様なランダム変数を含む単純な結果によって動機付けられています。
推定 この結果を使用して、最初にサンプル値を降順に並べ、順序統計を取得します そして、部分和を定義します:
今、みましょう そして、推定 順序付けられた均一変数の補間による。これにより、 によって与えられた:
この方法には、若干のバイアスがあります(カットオフポイントの線形補間により、 )しかし、それは一貫した推定量です 。このメソッドはかなり簡単に実装できますが、値のソートが必要です。これは、以下の決定論的計算よりも計算集約的です。。このメソッドは値のソートを伴うため、時間がかかります。
Rでの実装: メソッドをR
使用runif
して実装すると、均一な値を生成できます。コードは次のとおりです。
EST_EULER <- function(n) { U <- sort(runif(n), decreasing = TRUE);
S <- cumsum(1/U)/n;
m <- min(which(S >= 1));
2/(U[m-1]+U[m]); }
このコードを実装すると、次の真の値に収束します。 、しかし決定論的方法と比較すると非常に遅い。
set.seed(1234);
EST_EULER(10^3);
[1] 2.715426
EST_EULER(10^4);
[1] 2.678373
EST_EULER(10^5);
[1] 2.722868
EST_EULER(10^6);
[1] 2.722207
EST_EULER(10^7);
[1] 2.718775
EST_EULER(10^8);
[1] 2.718434
> exp(1)
[1] 2.718282
私は、指数または対数を含む変換を利用する方法を避けたいと考えています。定義で指数関数を使用する密度を使用できる場合、導出することが可能です これらから、代数的に密度呼び出しを使用します。
R
コマンド2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
が何をするかを熟考することによって明らかになるかもしれません。(ログガンマ関数の気を使っている場合は、でそれを置き換える2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
。のみ加算、乗算、除算、および切り捨てを使用すると、オーバーフローの警告を無視して)大きな関心があるかもしれない何になり、効率的なシミュレーション:あなたは数を最小限に抑えることができます