WedX - журнал о программировании и компьютерных науках

Схема Монте-Карло-Сэмплинг

Я пытаюсь определить количество шариков, которые попадают в заданный круг (радиус 1), учитывая, что они имеют случайные координаты x и y.

Моя общая цель - найти приблизительное значение числа Пи, используя выборку Монте-Карло, умножив на 4 (количество шариков в круге) / (общее количество шариков).

Я намеревался подсчитать количество шариков внутри круга, но у меня возникли проблемы с пониманием того, почему это не работает. Любая помощь по выполнению функции здесь будет оценена.

Прокомментируйте, если мой вышеупомянутый запрос о помощи неясен.

(define(monte-carlo-sampling n)
 (let ((x (- (* 2 (random)) 1))
       (y (- (* 2 (random)) 1)))
 (cond((= 0 n) 
    * 4 (/ monte-carlo-sampling(+ n 1) n) 
     ((> 1 n) 
     (cond((< 1 (sqrt(+ (square x) (square y))) (+ 1 (monte-carlo-sampling(- n 1)))))
         ((> 1 (sqrt(+ (square x) (square y))) (monte-carlo-sampling(- n 1))))
             )))))
10.09.2013

  • Так что вы имеете в виду под этим не работает 10.09.2013
  • Если вас интересует другой подход, см. здесь 02.07.2021

Ответы:


1

Я написал решение этой проблемы в моем блоге; внутренняя функция называется sand, потому что я бросал песчинки вместо шариков:

(define (pi n)
    (define (sand?) (< (+ (square (rand)) (square (rand))) 1))
    (do ((i 0 (+ i 1)) (p 0 (+ p (if (sand?) 1 0))))
        ((= i n) (exact->inexact (* 4 p (/ n))))))

Это очень медленно сходится; после ста тысяч итераций у меня было 3.14188. В записи блога также обсуждается метод оценки числа Пи, разработанный Архимедом за двести лет до Рождества Христова, который очень быстро сходится: 27 итераций подводят нас к арифметике с двойной точностью.

10.09.2013

2

Ваши круглые скобки перепутаны, и ваш порядок аргументов для < неверен. Вот как должен выглядеть код после исправления:

(define (monte-carlo-sampling n)
  (let ((x (- (* 2 (random)) 1))
        (y (- (* 2 (random)) 1)))
    (cond ((= n 0)
           0)
          (else
           (cond ((< (sqrt (+ (square x) (square y))) 1)
                  (+ 1 (monte-carlo-sampling (- n 1))))
                 (else
                  (monte-carlo-sampling (- n 1))))))))

Это возвращает количество совпадений. Вам нужно будет преобразовать количество совпадений в оценку числа Пи, используя внешнюю функцию, например:

(define (estimate-pi n)
  (* 4 (/ (monte-carlo-sampling n) n)))

Вот как бы я все это написал, если бы мне было поручено:

(define (estimate-pi n)
  (let loop ((i 0)
             (hits 0))
    (cond ((>= i n)
           (* 4 (/ hits n)))
          ((<= (hypot (sub1 (* 2 (random)))
                      (sub1 (* 2 (random)))) 1)
           (loop (add1 i) (add1 hits)))
          (else
           (loop (add1 i) hits)))))

(Проверено на Racket с использованием определения hypot, которое я дал в моем последнем ответе. Если вы не используете Racket, вам нужно изменить add1 и sub1 на что-то подходящее.)

10.09.2013

3

Вот общий метод выполнения монте-карло, который он принимает в качестве аргументов количество итераций и thunk (процедура без аргументов), который должен возвращать #t или #f, который является экспериментом, который будет запускаться на каждой итерации.

(define (monte-carlo trials experiment)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))

Теперь осталось написать конкретный эксперимент.

Вы можете написать в своем эксперименте, где эксперимент запускается в Монте-Карло, но абстрагирование здесь дает вам гораздо более гибкую и понятную функцию. Если вы заставляете функцию делать слишком много вещей одновременно, становится трудно обдумывать и отлаживать.

(define (marble-experiment)
 (let ((x ...)  ;;assuming you can come up with 
       (y ...)) ;;a way to get a random x between 0 and 1
                ;;with sufficient granularity for your estimate)
  (< (sqrt (+ (* x x) (* y y))) 1)))

(define pi-estimate
  (* 4 (monte-carlo 1000 marble-experiment))) 
10.09.2013
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]