Орієнтовний за допомогою моделювання Монте-Карло


35

Я недавно переглядав моделювання Монте-Карло і використовую його для наближення констант, таких як (коло всередині прямокутника, пропорційна площа).π

Однак я не можу придумати відповідний метод наближення значення [число Ейлера] за допомогою інтеграції Монте-Карло.e

Чи є у вас покажчики, як це можна зробити?


7
Існує багато, багато, багатьох способів зробити це. Це може бути очевидним, обмірковуючи те, що робить Rкоманда 2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1))). (Якщо використання журнальної функції Gamma турбує вас, замініть її на 2 + mean(1/factorial(ceiling(1/runif(1e5))-2)), яка використовує лише додавання, множення, ділення та усікання, і ігноруйте попередження про переповнення.) Що може зацікавити більш ефективне моделювання: чи можете ви мінімізувати кількість обчислювальні кроки, необхідні для оцінки до будь-якої заданої точності? e
whuber

4
Яке приємне запитання! Я з нетерпінням чекаю відповідей інших. Один із способів, яким ви могли б реально привернути увагу до цього питання - можливо, ще півдесятка відповідей - це переглянути питання і попросити ефективні відповіді, як пропонує Уабер. Це як кіт для користувачів CV.
Sycorax каже, що поверніть Моніку

1
@EngrStudent Я не впевнений, що існує геометричний аналог для . Це просто не природна (призначена для каламбура) геометрична величина, як . eπ
Аксакал

6
@Aksakal - винятково геометрична величина. На самому елементарному рівні це природно з'являється в виразах для областей, пов'язаних з гіперболами. На дещо більш просунутому рівні він тісно пов'язаний з усіма періодичними функціями, включаючи тригонометричні функції, геометричний зміст яких очевидний. Справжня проблема тут полягає в тому, що просто так легко імітувати значення, пов'язані з ! ee
whuber

2
@StatsStudent: сама по собі не цікава. Однак, якщо це призводить до неупереджених оцінок таких величин, як це може виявитися найбільш корисним для алгоритмів MCMC. e
exp{0xf(y)dG(y)}
Сіань

Відповіді:


34

Простий та елегантний спосіб оцінити Монте-Карло описаний у цій роботі . Ця стаття насправді стосується навчання . Отже, підхід здається ідеально відповідним вашій меті. Ідея заснована на вправі з популярного російського підручника з теорії ймовірностей Гнеденка. Див. Вих.22 на стор.183еee

Буває так, що , де - випадкова величина, яка визначається наступним чином. Це мінімальна кількість таких, що і - випадкові числа з рівномірного розподілу на . Красиво, чи не так ?!ξ n n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξni=1nri>1ri[0,1]

Оскільки це вправа, я не впевнений, чи здорово мені розміщувати рішення (доказ) тут :) Якщо ви хочете довести це самостійно, ось рада: глава називається "Моменти", який повинен вказувати ви в правильному напрямку.

Якщо ви хочете реалізувати це самостійно, тоді не читайте далі!

Це простий алгоритм моделювання Монте-Карло. Намалюйте рівномірний випадковий, потім ще один і так далі, поки сума не перевищить 1. Кількість проведених виплат є вашим першим випробуванням. Скажімо, ви отримали:

 0.0180
 0.4596
 0.7920

Тоді ваш перший випробування винесено 3. Продовжуйте робити ці випробування, і ви помітите, що в середньому ви отримуєте .e

Код 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

введіть тут опис зображення

ОНОВЛЕННЯ: Я оновив свій код, щоб позбутися масиву результатів пробних програм, щоб він не зайняв оперативну пам'ять. Я також надрукував оцінку 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

Введіть кількість випробувань, таких як 1000, у комірку D1 та натисніть кнопку. Ось як повинен виглядати екран після першого запуску:

введіть тут опис зображення

ОНОВЛЕННЯ 3: Срібляста рибка надихнула мене на інший спосіб, не такий елегантний, як перший, але все ще крутий. Він підрахував обсяги 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:

Срібна рибка у коментарях запропонувала просту реалізацію формули Excel. Це такий результат, який ви отримуєте з його підходу після приблизно 1 мільйона випадкових чисел і 185K випробувань:

введіть тут опис зображення

Очевидно, це набагато повільніше, ніж реалізація VBA Excel. Тим більше, якщо ви модифікуєте мій код VBA, щоб він не оновлював значення комірок всередині циклу, а роби це лише після того, як всі статистичні дані будуть зібрані.

ОНОВЛЕННЯ 5

Рішення Xi'an №3 тісно пов'язане (або навіть таке саме в певному сенсі, як і в коментарі jwg в потоці). Важко сказати, хто придумав першу ідею Форсайта чи Гнеденка. Оригінальне видання 1950 р. Гнеденка російською мовою не має розділів Проблеми в розділах. Отже, я не міг знайти цю проблему з першого погляду, де вона є в пізніших виданнях. Можливо, він був доданий пізніше або закопаний у тексті.

Як я прокоментував відповідь Сіань, підхід Форсайта пов'язаний з іншою цікавою областю: розподілом відстаней між піками (екстремумами) у випадкових (IID) послідовностях. Середня відстань буває 3. Послідовність пониження в підході Форсайта закінчується дном, тому, якщо ви продовжите вибірку, ви отримаєте ще одне дно в якийсь момент, потім інше і т. Д. Ви можете відстежити відстань між ними і побудувати розподіл.


Ого, це круто! Чи можете ви додати абзац чи два, пояснюючи, чому це працює?
Sycorax каже, що повернеться до Моніки

7
(+1) Блискуче! Відповідь заслуговує на найвищу оцінку, оскільки вона спирається лише на рівномірне моделювання. І використовує не будь-яке наближення, окрім Монте-Карло. Те, що воно з'єднує назад до Гнеденка, - це ще одна прихильність.
Сіань

2
Класно! Ось код Mathematica для того ж самого, що і для
Mean[Table[ Length[NestWhileList[(Random[]+#) &, Random[], #<1&]], {10^6}]]
однолінійки

4
@wolfies Наступний прямий переклад Rрішення, який я розмістив у відповіді Сіань, в двадцять разів швидше:n=10^6; 1. / Mean[UnitStep[Differences[Sort[RandomReal[{0, n}, n + 1]]] - 1]]
whuber

1
Я розмістив "чому середнє ?" питання як питання самостійно ; Я підозрюю, що моє ескізне рішення (саме те, що одразу ж прийшло в голову як "очевидна" візуалізація проблеми) - це не обов'язково так, як це робили російські студенти! Тож альтернативні рішення були б дуже вітаються. e
Срібна рибка

19

Я пропоную відхилити відповідь Аксакала. Він є неупередженим і покладається лише на метод формування рівномірної одиниці.

Мою відповідь можна зробити як завгодно точну, але все-таки упереджено від істинного значення .e

Відповідь Сіаня правильна, але я думаю, що її залежність від функції чи способу генерації Пуассона випадковими відхиленнями є дещо круговою, коли метою є наближення e .loge

Оцінка за допомогою завантаженняe

Замість цього розглянемо процедуру завантаження. В одному є велика кількість об'єктів які малюються із заміною на розмір вибірки n . При кожному розіграші ймовірність не намалювати конкретний об'єкт i дорівнює 1 - n - 1 , і є n таких малюнків. Ймовірність того, що конкретний об’єкт опущений з усіх малюнків, p = ( 1 - 1nni1n1np=(11n)n.

exp(1)=limn(11n)n

тому ми також можемо записати

exp(1)p^=i=1mIiBjm

Тобто, наша оцінка виявляється, оцінюючи ймовірність того, що специфічне спостереження опущено з bootstrap-реплікацій у багатьох таких репліках - тобто на частку зустрічань об'єкта у завантажувальних рядках.m B j ipmBji

У цьому наближенні є два джерела помилок. Кінцеве завжди означатиме, що результати є приблизними, тобто оцінка є упередженою. Крім того, буде коливатися навколо справжнього значення, оскільки це моделювання.рnp^

Я вважаю цей підхід дещо чарівним, тому що студент чи інша людина, яка має достатньо мало можливостей, зможе наблизити коробку до картки, купу дрібних каменів чи будь-які інші речі під рукою, в тому ж руслі, як людина могла оцінити за допомогою циркуля, прямолінійної частини та трохи піщинок. Я думаю, що це акуратно, коли математику можна відірвати від сучасних зручностей, таких як комп'ютери.πeπ

Результати

Я провів кілька моделювання для різної кількості реплікацій завантажувальної програми. Стандартні помилки оцінюються за допомогою звичайних інтервалів.

Зауважте, що вибір кількості об'єктів, що завантажуються під час завантаження, встановлює абсолютну верхню межу точності результатів, оскільки процедура Монте-Карло оцінює а залежить лише від . Якщо величина буде зайвою великою, просто обтяжить ваш комп'ютер, або тому, що вам потрібне лише "грубе" наближення до або тому, що ухил буде завалений дисперсією через Монте-Карло. Ці результати при а точним до третьої десяткової.p p n n e n = 10 3 p - 1enppnnen=103p1e

Цей графік показує, що вибір має прямі та глибокі наслідки для стійкості в . Синя пунктирна лінія показує а червона лінія . Як очікувалося, збільшення розміру вибірки дає все точніші оцінки . р р е рmp^pep^введіть тут опис зображення

Я написав для цього бентежно довгий сценарій 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')

4
+1 Це має багато сенсу. Ви можете поділитися своїм кодом, якщо ви його написали?
Антоні Парелада

2
Навіть якщо це може бути як завгодно точним, в кінцевому рахунку , є незадовільним , оскільки він імітує лише наближення до , а не самому. еee
whuber

1
Звичайно. Ви просто закінчите одним повтором дзвінка всередині іншого, який по суті є таким, як ми зараз.
Sycorax каже, що повернеться до Моніки

1
@whuber Я насправді не бачу різниці між довільно точним наближенням до довільно точного наближення до та довільно точним наближенням до . еee
jwg

1
@jwg Окрім того, що концептуально важливий, це також практично важливо, оскільки реалізація наближення до наближення вимагає відстеження, наскільки точним є кожне з двох наближень. Але я мав би погодитися, що коли обидва наближення є прийнятними, то загальний підхід справді чудовий.
whuber

14

Рішення 1:

Для розподілу Пуассона P ( X = k ) = λ kП(λ) Тому, якщо X P ( 1 ) , P ( X = 0 ) = P ( X = 1 ) = e - 1, це означає, що ви можете оцінити e - 1 за допомогою імітації Пуассона. І пуассонівські імітації можна отримати від генератора експоненціального розподілу (якщо не найбільш ефективним способом).

П(Х=к)=λкк!е-λ
ХП(1)
P(X=0)=P(X=1)=e1
e1

Зауваження 1: Як обговорювалося в коментарях, це доволі суперечливий аргумент, оскільки моделювання з розподілу Пуассона або еквівалентне Експоненціальне розподіл може бути важким для уявлення без залучення журналу чи функції exp ... Але тоді У. Хубер прийшов до вирішення цієї відповіді найелегантнішим рішенням, заснованим на замовленій формі. Що є наближенням , оскільки розподіл рівномірного інтервалу - це бета B ( 1 , n )U(i:n)U(i1:n)B(1,n), маючи на увазі, що що сходиться доe-1,якnзростає до нескінченності. Як інший бік, який відповідає на коментарі, експоненціальний генератор фон Неймана 1951 рокувикористовуєлишеоднакові покоління.

P(n{U(i:n)U(i1:n)}1)=(11n)n
e1n

Рішення 2:

e

X1,X2iidN(0,1)
(X12+X22)χ12
E(1/2)
P(X12+X222)=1{1exp(2/2)}=e1
e(X1,X2)X12+X222πX12+X22<1

Рішення 3:

u1,u2,...un+1>unNeNe1expG(x)ee1

1/n!n

Швидке впровадження методу Форсайта полягає в тому, щоб точно відмовитись від послідовності уніформи на користь більших блоків, що дозволяє проводити паралельну обробку:

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)

12
e

5
eE(1)loge1P(1)

5
logexpn <- 1e5; 1/mean(n*diff(sort(runif(n+1))) > 1)

3
xnnxixn1n1xi1nxi1n1xi

3
n+1n

7

Не рішення ... просто швидкий коментар, який занадто довгий для поля коментарів.

Аксакал

Аксакал розмістив рішення, де ми обчислюємо очікувану кількість стандартних Уніфікованих малюнків, які необхідно взяти, щоб їх сума перевищила 1. У Mathematica моя перша формулювання була:

mrM := NestWhileList[(Random[] + #) &, Random[], #<1 &]

Mean[Table[Length[mrM], {10^6}]] 

EDIT: Просто швидко пограйте з цим, і наступний код (той самий метод - також у 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 разів швидше перший код (або приблизно вдвічі швидший, ніж новий код вище).

Для розваги я подумав, що буде цікаво дізнатися, чи обидва підходи є настільки ефективними (у статистичному сенсі). Для цього я створив 2000 оцінок e, використовуючи:

  • Метод Аксакаля: даніA
  • Метод Xian 1, використовуючи код whuber: dataB

... обидва в Mathematica . Наведена нижче діаграма протиставляє непараметричну оцінку щільності ядра отриманих данихA і наборів данихB.

введіть тут опис зображення

Отже, хоча код Уубера (червона крива) приблизно вдвічі швидший, метод не виглядає настільки "надійним".


Вертикальна лінія у розташуванні справжнього значення значно покращить це зображення.
Sycorax каже, що повернемо Моніку

1
Це дуже цікаве спостереження, дякую. Оскільки половина ширини буде масштабуватися квадратично з розміром моделювання, а половина ширини методу Сіану приблизно вдвічі більша від рівня Аксакала, то виконання чотирьох разів більше ітерацій зробить їх однаково точними. Питання про те, скільки зусиль потрібно для кожної ітерації, залишається: якщо одна ітерація методу Сіаня потребує менше однієї чверті зусиль, то цей метод все-таки був би більш ефективним.
whuber

1
n

1
running four times as many iterations will make them equally accurate106106

1
Молодці з кодом - це буде важко покращити на цьому.
whuber

2

Метод, що вимагає безбожної кількості зразків

f(x)=exx¯12n˙N(0,1)e

N(0,1)ex

N(0,1)ϕ^(x)ϕ((2))=(2π)-1/2е-1e=ϕ^(2)2π

22π

Метод, що вимагає дуже мало зразків, але викликає нечесну кількість числової помилки

Цілком нерозумна, але дуже ефективна відповідь на основі коментаря, який я зробив:

Xuniform(1,1)Yn=|(x¯)n|e^=(1Yn)1/Yn

Це зблизиться дуже швидко, але також призведе до крайньої числової помилки.

Yn1/YnnYnYn=0e


2
е

1
@whuber: Я не використовував Box-Muller через необхідне перетворення журналу занадто безпосередньо для експоненціалу в моїй книзі. Я б рефлексивно дозволив cos і гріх, але це було лише тому, що я на мить забув про складний аналіз, настільки хороший момент.
Кліф АВ

1
n1n2ϕ(2)n1n2en2n1

2

Ось ще один спосіб зробити це, хоча це досить повільно. Я не претендую на ефективність, але пропоную цю альтернативу в дусі повноти.

нU1,,UнIID U(0,1)е

Е(Я(Ui1/е)Ui)=1/е1гуу=1.

еу(1)у(н)

Sн(к)1нi=1к1у(i)за всіх к=1,..,н.

мхв{к|S(к)1}1/ее

е^2у(м)+у(м+1).

1/еее

Реалізація в 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

е

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.