He estado mirando la simulación de Monte Carlo recientemente, y la he estado usando para aproximar constantes como (círculo dentro de un rectángulo, área proporcional).
Sin embargo, no puedo pensar en un método correspondiente para aproximar el valor de [número de Euler] utilizando la integración de Monte Carlo.
¿Tiene alguna sugerencia sobre cómo se puede hacer esto?
simulation
monte-carlo
algorithms
random-generation
numerical-integration
estadística newbie12345
fuente
fuente
R
comando2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Si el uso de la función de registro Gamma le molesta, reemplácelo por2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, que solo usa suma, multiplicación, división y truncamiento, e ignore las advertencias de desbordamiento). Lo que podría ser de mayor interés serían las simulaciones eficientes : ¿puede minimizar el número de pasos computacionales necesarios para estimar con una precisión dada?Respuestas:
La forma simple y elegante de estimar por Monte Carlo se describe en este documento . El artículo trata sobre la enseñanza . Por lo tanto, el enfoque parece perfectamente adecuado para su objetivo. La idea se basa en un ejercicio de un popular libro de texto ruso sobre teoría de la probabilidad de Gnedenko. Ver ex.22 en p.183ee e
Sucede de modo que , donde es una variable aleatoria que se define de la siguiente manera. Es el número mínimo de tal que y son números aleatorios de distribución uniforme en . Hermoso, ¿no?ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=e ξ n ∑ni=1ri>1 ri [0,1]
Dado que es un ejercicio, no estoy seguro de si es bueno para mí publicar la solución (prueba) aquí :) Si desea probarlo usted mismo, aquí hay un consejo: el capítulo se llama "Momentos", que debería señalar usted en la dirección correcta
Si desea implementarlo usted mismo, ¡no siga leyendo!
Este es un algoritmo simple para la simulación de Monte Carlo. Dibuja un uniforme al azar, luego otro y así sucesivamente hasta que la suma exceda 1. El número de randoms extraídos es tu primer intento. Digamos que tienes:
Luego, su primera prueba se procesó. 3. Siga haciendo estas pruebas y notará que, en promedio, obtiene .e
El código MATLAB, el resultado de la simulación y el histograma siguen.
El resultado y el histograma:
ACTUALIZACIÓN: Actualicé mi código para deshacerme de la matriz de resultados de prueba para que no tome RAM. También imprimí la estimación de PMF.
Actualización 2: Aquí está mi solución de Excel. Ponga un botón en Excel y vincúlelo a la siguiente macro de VBA:
Ingrese el número de pruebas, como 1000, en la celda D1 y haga clic en el botón. Así es como debería verse la pantalla después de la primera ejecución:
ACTUALIZACIÓN 3: Silverfish me inspiró de otra manera, no tan elegante como la primera pero aún genial. Calculó los volúmenes de n-simplexes usando secuencias de Sobol .
Casualmente escribió el primer libro sobre el método de Monte Carlo que leí en la escuela secundaria. Es la mejor introducción al método en mi opinión.
ACTUALIZACIÓN 4:
Silverfish en los comentarios sugirió una implementación simple de la fórmula de Excel. Este es el tipo de resultado que obtienes con su enfoque después de aproximadamente 1 millón de números aleatorios y 185K pruebas:
Obviamente, esto es mucho más lento que la implementación de Excel VBA. Especialmente, si modifica mi código VBA para no actualizar los valores de las celdas dentro del bucle, y solo lo hace una vez que se recopilan todas las estadísticas.
ACTUALIZACIÓN 5
De Xi'an solución # 3 está estrechamente relacionado (o incluso el mismo en cierto sentido como un comentario de por jwg en el hilo). Es difícil decir quién se le ocurrió la idea primera Forsythe o Gnedenko. Edición original de 1950 Gnedenko en ruso no tiene secciones problemas en los capítulos. Por lo tanto, no pude encontrar este problema a primera vista, donde se encuentra en ediciones posteriores. Tal vez fue agregado más tarde o enterrado en el texto.
Como comenté en la respuesta de Xi'an, el enfoque de Forsythe está vinculado a otra área interesante: la distribución de distancias entre picos (extremos) en secuencias aleatorias (IID). La distancia media es 3. La secuencia descendente en el enfoque de Forsythe termina con un fondo, por lo que si continúa muestreando obtendrá otro fondo en algún momento, luego otro, etc. Puede rastrear la distancia entre ellos y construir la distribución.
fuente
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
R
solución que publiqué en la respuesta de Xi'an es veinte veces más rápida:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
Sugiero votar la respuesta de Aksakal. Es imparcial y se basa únicamente en un método para generar desviaciones uniformes de la unidad.
Mi respuesta puede hacerse arbitrariamente precisa, pero todavía está sesgada lejos del verdadero valor de .e
La respuesta de Xi'an es correcta, pero creo que su dependencia de la función o de una forma de generar desviaciones aleatorias de Poisson es un poco circular cuando el propósito es aproximar .elog e
La estimación de por Bootstrappinge
Por el contrario, considerar el procedimiento de bootstrapping. Uno tiene un gran número de objetos que se dibujan con el reemplazo a un tamaño de muestra de . En cada sorteo, la probabilidad de no dibujar un objeto particular es , y hay tales empates. La probabilidad de que un objeto en particular se omite de todos los sorteos esn i 1 - n - 1 n p = ( 1 - 1n n i 1−n−1 n p=(1−1n)n.
Porque supongo que sabemos que
entonces también podemos escribir
Es decir, nuestra estimación de se encuentra al estimar la probabilidad de que se omita una observación específica de bootstrap replica en muchas de tales réplicas, es decir, la fracción de ocurrencias del objeto en los bootstraps.p m Bj i
Hay dos fuentes de error en esta aproximación. Finito siempre significará que los resultados son aproximados, es decir, la estimación está sesgada. Además, fluctuará alrededor del valor verdadero porque es una simulación.n p^
Encuentro este enfoque algo encantador porque un estudiante universitario u otra persona con poco que hacer podría aproximarse a usando una baraja de cartas, un montón de piedras pequeñas o cualquier otro elemento a la mano, en la misma línea que una persona podría estimar usando una brújula, un borde recto y algunos granos de arena. Creo que es bueno cuando las matemáticas se pueden divorciar de las comodidades modernas como las computadoras.e π
Resultados
Realicé varias simulaciones para varias réplicas de bootstrap. Los errores estándar se estiman utilizando intervalos normales.
Tenga en cuenta que la elección de el número de objetos que se están bootstrapped conjuntos de un límite superior absoluto en la precisión de los resultados debido a que el procedimiento de Monte Carlo es la estimación de y sólo depende de . Establecer para que sea innecesariamente grande solo afectará a su computadora, ya sea porque solo necesita una aproximación "aproximada" de o porque el sesgo se verá afectado por la variación debido al Monte Carlo. Estos resultados son para y es exacto al tercer decimal.n p p n n e n=103 p−1≈e
Este gráfico muestra que la elección de tiene consecuencias directas y profundas para la estabilidad en . La línea discontinua azul muestra y la línea roja muestra . Como se esperaba, aumentar el tamaño de la muestra produce estimaciones cada vez más precisas .m p^ p e p^
Escribí un guión R vergonzosamente largo para esto. Se pueden enviar sugerencias de mejora al reverso de una factura de $ 20.
fuente
Solución 1:
Para una distribución de Poisson , Por lo tanto, si , que significa que puede estimar por una simulación de Poisson. Y las simulaciones de Poisson se pueden derivar de un generador de distribución exponencial (si no de la manera más eficiente).P(λ)
Solución 2:
Otra forma de conseguir una representación de la constante como una integral es recordar que, cuando entonces que es también un distribución. Por lo tanto, Un segundo enfoque para aproximar por Monte Carlo es, pues, para simular pares normales y controlar la frecuencia de veces que . En cierto sentido, es lo opuesto a la aproximación de Monte Carlo relacionada con la frecuencia de veces ...e
Solución 3:
Mi colega de la Universidad de Warwick, M. Pollock, señaló otra aproximación de Montecarlo llamada método de Forsythe : la idea es ejecutar una secuencia de generaciones uniformes hasta . ¡La expectativa de la regla de detención correspondiente, , que es el número de veces que la secuencia uniforme bajó es entonces mientras que la probabilidad de que sea impar es ! ( El método de Forsythe en realidad apunta a simular desde cualquier densidad de la forma , por lo tanto, es más general que aproximar y .)u1,u2,... un+1>un N e N e−1 expG(x) e e−1
Una implementación rápida de R del método de Forsythe es renunciar a seguir con precisión la secuencia de uniformes a favor de bloques más grandes, lo que permite el procesamiento paralelo:
fuente
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
No es una solución ... solo un comentario rápido que es demasiado largo para el cuadro de comentarios.
Aksakal
Aksakal publicó una solución en la que calculamos el número esperado de dibujos uniformes estándar que deben tomarse, de modo que su suma exceda 1. En Mathematica , mi primera formulación fue:
EDITAR: Acabo de jugar rápidamente con esto, y el siguiente código (el mismo método, también en Mma, solo un código diferente) es aproximadamente 10 veces más rápido:
Xian / Whuber
Whuber ha sugerido un código rápido y rápido para simular la solución 1 de Xian:
Versión R:
n <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)
Versión de MMA:
n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
que él nota es 20 veces más rápido que el primer código (o aproximadamente el doble de rápido que el nuevo código anterior).
Solo por diversión, pensé que sería interesante ver si ambos enfoques son tan eficientes (en un sentido estadístico). Para hacerlo, generé 2000 estimaciones de e usando:
... ambos en Mathematica . El siguiente diagrama contrasta una estimación de densidad de kernel no paramétrica de los conjuntos de datos dataA y dataB resultantes.
Entonces, mientras que el código de Whuber (curva roja) es aproximadamente el doble de rápido, el método no parece ser tan 'confiable'.
fuente
running four times as many iterations will make them equally accurate
///// ..... Acabo de jugar rápido con esto: aumentando el número de puntos de muestra utilizados en el Método 1 de Xian de a 6 x (es decir, 6 veces el número de puntos puntos) produce una curva similar a Aksaksal.Método que requiere una cantidad impía de muestras
Primero debe poder tomar muestras de una distribución normal. Suponiendo que va a excluir el uso de la función , o buscar tablas derivadas de esa función, puede producir muestras aproximadas de la distribución normal a través del CLT. Por ejemplo, si puede tomar muestras de una distribución uniforme (0,1), entonces . Como señaló Whuber, para tener el enfoque de estimación final medida que el tamaño de la muestra se aproxima a , se requeriría que el número de muestras uniformes utilizadas se acerque a medida que el tamaño de la muestra se aproxima al infinito.f(x)=ex x¯12√n√∼˙N(0,1) e ∞ ∞
Ahora, si puede tomar muestras de una distribución normal, con muestras suficientemente grandes, puede obtener estimaciones consistentes de la densidad de . Esto se puede hacer con histogramas o suavizadores de kernel (¡pero tenga cuidado de no usar un kernel gaussiano para seguir su regla no !). Para que sus estimaciones de densidad sean consistentes, deberá dejar que su df (número de bins en el histograma, inverso de la ventana para suavizar) se acerque al infinito, pero más lento que el tamaño de la muestra.N(0,1) ex
Entonces, ahora, con mucha potencia computacional, puede aproximar la densidad de un , es decir, . Como , su estimación para .N(0,1) ϕ^(x) ϕ((√2))=(2π)−1/2e−1 e=ϕ^(2–√)2π−−√
Si quiere volverse completamente loco, incluso puede estimar y usando los métodos que discutió anteriormente.2–√ 2π−−√
Método que requiere muy pocas muestras, pero que causa una cantidad impía de error numérico
Una respuesta completamente tonta, pero muy eficiente, basada en un comentario que hice:
Deje . Definir. Defina .X∼uniform(−1,1) Yn=|(x¯)n| e^=(1−Yn)−1/Yn
Esto convergerá muy rápido, pero también se encontrará con un error numérico extremo.
Whuber señaló que esto utiliza la función de potencia, que normalmente llama a la función exp. Esto podría discretizando , de modo que sea un número entero y la potencia se pueda reemplazar con la multiplicación repetida. Sería necesario que como , la discretización de hiciera cada vez más fina, y la discretización tendría que excluir . Con esto, el estimador teóricamente (es decir, el mundo en el que no existe un error numérico) convergería en , ¡y bastante rápido!Yn 1/Yn n→∞ Yn Yn=0 e
fuente
Aquí hay otra forma de hacerlo, aunque es bastante lento. No pretendo ser eficiente, pero ofrezco esta alternativa en un espíritu de integridad.
Contra la respuesta de Xi'an a los fines de esta pregunta que usted puede generar y usar una secuencia de variables pseudoaleatorias uniformes y luego necesita estimar por algún método usando operaciones aritméticas básicas (es decir, no puede usar funciones logarítmicas o exponenciales ni ninguna distribución que use estas funciones). El presente método está motivado por un resultado simple que involucra variables aleatorias uniformes:n U1,⋯,Un∼IID U(0,1) e †
Estimación de usando este resultado:e Primero ordenamos los valores de la muestra en orden descendente para obtener las estadísticas de orden y luego definimos las sumas parciales:u(1)⩾⋯⩾u(n)
Ahora, dejemos que y luego estimar por interpolación de las variables uniformes ordenadas. Esto proporciona un estimador para dado por:m≡min{k|S(k)⩾1} 1/e e
Este método tiene un ligero sesgo (debido a la interpolación lineal del punto de corte para ) pero es un estimador consistente para . El método puede implementarse con bastante facilidad, pero requiere la clasificación de valores, que es más computacionalmente intensivo que el cálculo determinista de . Este método es lento, ya que implica la clasificación de valores.1/e e e
Implementación en R: El método se puede implementar al
R
usarrunif
para generar valores uniformes. El código es el siguiente:La implementación de este código da convergencia al verdadero valor de , pero es muy lento en comparación con los métodos deterministas.e
fuente